linux/input.h



  • Hallo,

    ich versuche gerade sowas wie einen Keylogger in Linux hinzukriegen, komm aber nicht weiter. Wenn ich folgenden Code ausführe, steht im event.code immer nur ein einziger Zahlenwert und read() returnt sofort. Wenn ich jedoch auf eine Taste drücke, wird nicht wie erwartet ein neuer Zahlenwert ausgegeben, sondern immer noch der alte. Ist "/dev/input/event0" hier vielleicht der Fehler? Welches Device muss ich da genau angeben?

    #include <linux/input.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <iostream>
    
    int main(){
        int fd = open("/dev/input/event0", O_RDONLY);
        struct input_event event;
    
        while(true){
            read(fd, &event, sizeof(event));
            std::cout << event.code << '\n';
        }
    }
    


  • lrwxrwxrwx 1 root root  9 Jun  8 14:13 usb-Logitech_USB_Keyboard-event-if01 -> ../event3
    lrwxrwxrwx 1 root root  9 Jun  8 14:13 usb-Logitech_USB_Keyboard-event-kbd -> ../event2
    lrwxrwxrwx 1 root root  9 Jun  8 14:13 usb-Logitech_USB_Optical_Mouse-event-mouse -> ../event1
    lrwxrwxrwx 1 root root  9 Jun  8 14:13 usb-Logitech_USB_Optical_Mouse-mouse -> ../mouse0
    

    Ich hab auch schon event3 und event2 ausprobiert, mit dem gleichen Ergebnis. Also irgendwas muss doch noch fehlen?



  • Eingebender schrieb:

    Wenn ich jedoch auf eine Taste drücke, wird nicht wie erwartet ein neuer Zahlenwert ausgegeben, sondern immer noch der alte. Ist "/dev/input/event0" hier vielleicht der Fehler? Welches Device muss ich da genau angeben?

    $ fgrep 'event' /var/log/Xorg.0.log | grep 'Keyboard'
    

    ?

    Mit dem Format, das Linux da verwendet, kenne ich mich nicht aus, aber der von dir geschriebene Code funzt bei mir, wenn ich das korrekte Device angebe (event10).



  • Nundenn, ich hab von event0 bis hin zu event10 und /dev/stdin alles ausprobiert, klappt nicht. Ich bekomme immer wieder ununterbrochen den selben, nach jedem Programmstart zufällig neuen Zahlenwert zurückgeliefert. Kann es sein, dass es eine andere Datei ist, nach der ich suche?



  • /var/log/Xorg.0.log existiert nicht auf meiner Platte



  • Es kann sein, dass der Kernel dich die Ereignisse nicht lesen lässt, weil dein gegenwärtiger Nutzer nicht die nötigen Rechte hat. In der /etc/group kannst du das nachsehen:

    $ fgrep 'input' /etc/group
    

    Die Devices sollten alle input gehören:

    $ ls -g /dev/input/event*
    crw-rw---- 1 input 13, 64  8. Jun 2016  /dev/input/event0
    crw-rw---- 1 input 13, 65  8. Jun 2016  /dev/input/event1
    crw-rw---- 1 input 13, 74  8. Jun 2016  /dev/input/event10
    ...
    

    Alternativ kannst du versuchen, dein Programm mal als root laufenzulassen und zu schauen, ob's so immer noch nicht geht.

    EDIT: Ich habe mich in ein bisschen in das Benamungsschema der /dev/input/by-id/-Dateien eingelesen. Wenn deine Maschine und meine Maschine so ungefähr gleich funktionieren, dann sollte dein event-File event2 sein. Allerdings garantiere ich dafür nicht.

    EDIT: Habe gerade mal einen Neustart gemacht, die Enumerierung ist jetzt eine andere. Sprich, wenn dein Programm eine bestimmte Hardware loggen soll, nimm besser die Dateien unter /dev/input/by-id/, die verlinken dann auf das korrekte Device.



  • Mit Root-Rechten klappt es jetzt danke.
    Ich hätte strerror() aufrufen sollen, weiß ich jetzt fürs nächstes Mal.


Log in to reply