C++ _getch();



  • Hallo,
    ich habe aus Spaß einen Keylogger geschrieben (Bin neu in C++).
    Der soll eine .txt Datei erstellen in dem Verzeichnis. Nur das Problem ist, dass wenn ich ein Buchstabe eingebe, das komplette Textdokument voll geschrieben wird mit dem Buchstabe.
    Wie behebe ich das Problem?

    #include <iostream>
    #include <conio.h>
    #include <fstream>
    
    void keylog(char key) {
    	std::ofstream keylog;
    	keylog.open("C:\\Users\\husse\\Documents\\keylog.txt", std::ofstream::app);
    	keylog << key;
    }
    
    int main() {
    	std::cout << ".";
    	char key = ' ';
    	while (true) {
    
    	
    	key = _getch();
    	switch (key) {
    	case 'a':
    		keylog('a');
    		break;
    	case 'b':
    		keylog('b');
    		break;
    	case ' ':
    		keylog(' ');
    		break;
    	case 'c':
    		keylog('c');
    		break;
    	case 'd':
    		keylog('d');
    		break;
    	}
    
    		}
    }
    

    LG



  • Hi. sofern das Thema noch aktuell ist...
    für einen Keylogger würde ich dir generell eine andere Art und Weise empfehlen.
    Schau dir mal "getAsyncKeyState()" an.

    Zu deinem Problem:
    Ich bin kein Profi, aber ich würde mal darauf tippen, dass das Problem beim cin-buffer liegt.
    Nach Eingabe des Zeichens wird "key" immer wieder der Buchstabe zugewiesen da er noch im buffer liegt.

    Sollte ich falsch liegen, lasse ich mich gern belehren, aber schlagt mich nicht. 🙃



  • @redexception sagte in C++ _getch();:

    Nur das Problem ist, dass wenn ich ein Buchstabe eingebe, das komplette Textdokument voll geschrieben wird mit dem Buchstabe.

    Wenn das jemand mit dem gezeigten Code (und einer üblichen Version von _getch()) reproduzieren kann fress' ich einen Besen.

    @robert123 Das hat mit std::cin nichts zu tun. _getch() entfernt die Eingaben direkt aus dem Console Input Buffer bevor sie jemals ein C++-Stream zu sehen bekommt.



  • @Swordfish sagte in C++ _getch();:

    Wenn das jemand mit dem gezeigten Code (und einer üblichen Version von _getch()) reproduzieren kann fress' ich einen Besen.

    Bei mir macht der gezeigte Code genau was er soll - das einzige was ich geändert habe, ist der Ablageort für die Datei.



  • @Swordfish
    Ah, ok.
    Danke dir für die richtigstellung.
    War nur eine Vermutung, weil ich sowas mit dem buffer und dem einlesen von Zeichen schon öfters gelesen habe.
    So tief stecke ich noch nicht drin in der Materie.
    Danke


Anmelden zum Antworten