Analysieren von von einer Tastatur empfangenen Bytes

Analysieren von von einer Tastatur empfangenen Bytes

Ich arbeite derzeit daran, die vom Computer oder Betriebssystem, in diesem Fall Linux, empfangenen Tastatureingaben zu verstehen.

Ich habe ein kleines Programm geschrieben, um alle Eingaben über die Tastatur anzuzeigen, und ich konnte nur verstehen, dass jede Nachricht 24 Byte lang ist und jeder Tastendruck innerhalb von 3 solchen Nachrichten aufgezeichnet zu werden scheint.

Ich konnte nicht herausfinden, was der Eintrag genau bedeutete.

Als Beispiel:

  1. Mein Eintrag
helloworld^C
  1. Die Ausgabe

    ffffffd3 31 5d 5d 0 0 0 0 ffffff98 3d c 0 0 0 0 0 4 0 4 0 28 0 7 0 
    ffffffd3 31 5d 5d 0 0 0 0 ffffff98 3d c 0 0 0 0 0 1 0 1c 0 0 0 0 0 
    ffffffd3 31 5d 5d 0 0 0 0 ffffff98 3d c 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffc2 5d 9 0 0 0 0 0 4 0 4 0 b 0 7 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffc2 5d 9 0 0 0 0 0 1 0 23 0 1 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffc2 5d 9 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 2c 5b a 0 0 0 0 0 4 0 4 0 b 0 7 0 
    ffffffd4 31 5d 5d 0 0 0 0 2c 5b a 0 0 0 0 0 1 0 23 0 0 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 2c 5b a 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffc8 ffffffd9 a 0 0 0 0 0 4 0 4 0 8 0 7 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffc8 ffffffd9 a 0 0 0 0 0 1 0 12 0 1 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffc8 ffffffd9 a 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffe7 16 c 0 0 0 0 0 4 0 4 0 8 0 7 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffe7 16 c 0 0 0 0 0 1 0 12 0 0 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffe7 16 c 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffac 11 e 0 0 0 0 0 4 0 4 0 f 0 7 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffac 11 e 0 0 0 0 0 1 0 26 0 1 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffac 11 e 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffc9 ffffffcf e 0 0 0 0 0 4 0 4 0 f 0 7 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffc9 ffffffcf e 0 0 0 0 0 1 0 26 0 0 0 0 0 
    ffffffd4 31 5d 5d 0 0 0 0 ffffffc9 ffffffcf e 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 4c ffffffca 0 0 0 0 0 0 4 0 4 0 f 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 4c ffffffca 0 0 0 0 0 0 1 0 26 0 1 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 4c ffffffca 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 4d ffffffc7 1 0 0 0 0 0 4 0 4 0 f 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 4d ffffffc7 1 0 0 0 0 0 1 0 26 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 4d ffffffc7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffab 0 4 0 0 0 0 0 4 0 4 0 12 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffab 0 4 0 0 0 0 0 1 0 18 0 1 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffab 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffb4 fffffffd 4 0 0 0 0 0 4 0 4 0 12 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffb4 fffffffd 4 0 0 0 0 0 1 0 18 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffb4 fffffffd 4 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffbc ffffffbb 5 0 0 0 0 0 4 0 4 0 1a 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffbc ffffffbb 5 0 0 0 0 0 1 0 11 0 1 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffbc ffffffbb 5 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffc2 ffffffb8 6 0 0 0 0 0 4 0 4 0 1a 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffc2 ffffffb8 6 0 0 0 0 0 1 0 11 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffc2 ffffffb8 6 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffa8 ffffffb5 7 0 0 0 0 0 4 0 4 0 12 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffa8 ffffffb5 7 0 0 0 0 0 1 0 18 0 1 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffa8 ffffffb5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffa3 73 8 0 0 0 0 0 4 0 4 0 12 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffa3 73 8 0 0 0 0 0 1 0 18 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 ffffffa3 73 8 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 79 70 9 0 0 0 0 0 4 0 4 0 15 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 79 70 9 0 0 0 0 0 1 0 13 0 1 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 79 70 9 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 fffffff8 6d a 0 0 0 0 0 4 0 4 0 15 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 fffffff8 6d a 0 0 0 0 0 1 0 13 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 fffffff8 6d a 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 c ffffffec a 0 0 0 0 0 4 0 4 0 f 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 c ffffffec a 0 0 0 0 0 1 0 26 0 1 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 c ffffffec a 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 fffffffa ffffffa9 b 0 0 0 0 0 4 0 4 0 f 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 fffffffa ffffffa9 b 0 0 0 0 0 1 0 26 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 fffffffa ffffffa9 b 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 17 ffffffa7 c 0 0 0 0 0 4 0 4 0 7 0 7 0 
    ffffffd5 31 5d 5d 0 0 0 0 17 ffffffa7 c 0 0 0 0 0 1 0 20 0 1 0 0 0 
    ffffffd5 31 5d 5d 0 0 0 0 17 f
  1. Der Code, den ich verwendet habe
#include"json.h" 

    int main(char* argc, char* argv[]){
        FILE* fp = fopen("/dev/input/event8","r");
        FILE* fp2 = fopen("log.txt","w");
        char ch;
        int n = 0;
        char repr[10];
        while(1){
            ch = fgetc(fp);
            if(n==24){
                fputc('\n', fp2);
                n = 0;
            }
            sprintf(repr, "%x", ch);
            fputs(repr, fp2);
            fputc(' ', fp2);
            n++;
        }
    }

Antwort1

Ich konnte nicht herausfinden, was der Eintrag genau bedeutete.

Der Geräteknoten, von dem Ihr Programm liest,

        FILE* fp = fopen("/dev/input/event8","r");

ist ein spezieller Dateityp, der alsEingabeereignisschnittstelleBeim
Lesen dieser Datei werden die Daten wie folgt organisiert zurückgegeben:

struct input_event {
        struct timeval time;
        unsigned short type;
        unsigned short code;
        unsigned int value;
};

Neben dem Schlüssel/Ereignis codeund dem Schlüssel valueenthalten die Daten einen Zeitstempel time.

The GNU C Library provides two data types specifically for representing an elapsed time. 
They are used by various GNU C Library functions, and you can use them for your own purposes 
too. They’re exactly the same except that one has a resolution in microseconds, and the other, 
newer one, is in nanoseconds.

Data Type: struct timeval

    The struct timeval structure represents an elapsed time. It is declared in sys/time.h 
    and has the following members:

    time_t tv_sec
        This represents the number of whole seconds of elapsed time.

    long int tv_usec
        This is the rest of the elapsed time (a fraction of a second), represented as 
        the number of microseconds. It is always less than one million.

Die Ereignistypen und Ereigniscodes werden beschriebenHier.

Versuchen Sie es mit dem Dienstprogrammevtestanstelle Ihres Programms, um ein Gefühl für die Ereignisschnittstelle zu bekommen.
Beispielausgabe zum Drücken und Loslassen der ATaste:

Event: time 1566419656.576267, -------------- SYN_REPORT ------------
Event: time 1566419662.463531, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e
Event: time 1566419662.463531, type 1 (EV_KEY), code 30 (KEY_A), value 1
Event: time 1566419662.463531, -------------- SYN_REPORT ------------
Event: time 1566419662.615625, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e
Event: time 1566419662.615625, type 1 (EV_KEY), code 30 (KEY_A), value 0

Stellen Sie sicher, dass Sie die Rohausgabe der Tastatur, also die Scancodes, verstehen.
Auf einem PC generiert die Tastaturhardware Scancodes, sodass jeder Tastendruck (und jedes Loslassen) erkannt werden kann.
Es ist Aufgabe der Software, die Tastendrücke zu übersetzen und neu zuzuordnen, z. B. in ASCII-Code oderANSI-Escapesequenzen.

verwandte Informationen