Chat-Protokoll entschlüsseln



  • sagt mal... schlaft ihr eigentlich? 😃



  • @sothis_:
    *grins* Dann guck mal in die verlinkte Logdatei. Da sind auch Uhrzeiten mit bei. 😃

    @ceplusplus@loggedoff:
    Auweiha! Das "Rotate" war falsch!

    Im Prinzip muß man nur 4 der 5 bytes in eine andere Reihenfolge bringen. Danach entsprechend byte 2 ein union hin-und hershiften :

    -----------------------------------------------------------------
    271             id (dez)
    abcd efghijkl   "index"-bezeichner
    0001 00001111   id (bin) 12-bit
    
    128,     127,     0,       120,     8           bytes (dez)
    1        2        3        4        5           byte nr.
    10000000 01111111 00000000 01111000 00001000    bytes (bin)
                               hijkl     abcdefg   "index"-bezeichner
                                        10000000    byte 1 -> 128
    
    5        4        3        2                    byte nr.
    00001000 01111000 00000000 01111111             bytes (bin)
     abcdefg hijkl                                 "index"-bezeichner
    10000000                                        byte 1 -> 128
    
    -----------------------------------------------------------------
    271          
    abcd efghijkl
    0001 00001111
    
    252,     3,       192,     67,      224 
    1        2        3        4        5
    11111100 00000011 11000000 01000011 11100000 
                      kl       cdefghij       ab
                                        11111100
    5        4        3        2
    11100000 01000011 11000000 00000011 (byte 5 enthält speichermüll)
          ab cdefghij kl
    11111100
    -----------------------------------------------------------------
    1475
    abcd efghijkl
    0101 11000011
    
    240,     15,      0,       195,     5
    1        2        3        4        5
    11110000 00001111 00000000 11000011 00000101
                               efghijkl     abcd
                                        11110000
    5        4        3        2
    00000101 11000011 00000000 00001111
        abcd efghijkl
    11110000
    -----------------------------------------------------------------
    

    So könnte es nun aussehen:

    //--------------------------------------------------
     union {
      unsigned char  byte [4];
      unsigned short word [2];
      unsigned int  dword;
     } shift;
    //--------------------------------------------------
     unsigned char bytes  [] = {
    254, 1, 32, 39, 0
     };
    //--------------------------------------------------
     shift.byte [3] = bytes [4]; // byteorder :-(
     shift.byte [2] = bytes [3];
     shift.byte [1] = bytes [2];
     shift.byte [0] = bytes [1];
    //--------------------------------------------------
     while (1) {
      if ( (shift.dword & 1) == 0) {
       break;
      }
      shift.dword = shift.dword >> 1;
     }
    //--------------------------------------------------
     shift.byte [3] = 0; // achtung! kann speichermüll enthalten!
    //--------------------------------------------------
     shift.dword =  shift.dword << 4;
    // id -> shift.word [1]
    

    Weiterhin viel Glück! 😋



  • Hey!

    Bin dir sehr dankbar, es funktioniert nun. 👍
    Danke auch wieder für die Erklärung.

    @sothis_
    Unregelmäßig 😕

    MfG



  • Hey @amateurknacker, bist du noch da?

    Leider muss der Algo noch überarbeitet werden. Es sind weitere Daten bekannt. Die bisjetzigen Daten waren von "Normalen Spielern" im Server. Jedoch gibt es da noch die "Spectators", dessen Daten sich doch sehr unterscheiden, zB:

    // NORMAL
    unsigned char normal11[] = { 248, 7, 128, 131, 0 }; // 263
    unsigned char normal12[] = { 248, 7, 128, 233, 3 }; // 2003
    unsigned char normal13[] = { 248, 7, 128, 3, 0 }; // 7
    unsigned char normal14[] = { 248, 7, 128, 49, 0 }; // 99
    unsigned char normal15[] = { 248, 7, 0, 0, 1 }; // 512
    
    // NORMAL - OTHER COMPUTER
    unsigned char normal16[] = { 224, 31, 0, 14, 2 }; // 263
    unsigned char normal17[] = { 224, 31, 0, 166, 15 }; // 2003
    unsigned char normal18[] = { 224, 31, 0, 14, 0 }; // 7
    unsigned char normal19[] = { 224, 31, 0, 198, 0 }; // 99
    unsigned char normal20[] = { 240, 15, 0, 0, 194 }; // 512
    
    // SPECTATOR
    unsigned char spectator11[] = { 0, 0, 128, 131, 0 }; // 263
    unsigned char spectator12[] = { 0, 0, 128, 233, 3 }; // 2003
    unsigned char spectator13[] = { 0, 0, 128, 3, 0 }; // 7
    unsigned char spectator14[] = { 0, 0, 128, 49, 0 }; // 99
    unsigned char spectator15[] = { 0, 0, 0, 0, 1 }; // 512
    
    // SPECTATOR - OTHER COMPUTER
    unsigned char spectator16[] = { 0, 0, 0, 14, 2 }; // 263
    unsigned char spectator17[] = { 0, 0, 0, 166, 15 }; // 2003
    unsigned char spectator18[] = { 0, 0, 0, 14, 0 }; // 7
    unsigned char spectator19[] = { 0, 0, 0, 198, 0 }; // 99
    unsigned char spectator20[] = { 0, 0, 0, 0, 4 }; // 512
    

    Dies sind die Daten, daneben die ID die rauskommen muss.
    Habe selbst schon einiges probiert, aber ich komme nicht dahinter wie man die Spectator-Daten umwandelt, da teils so viele Bytes 0 sind dass ich keinen Anhaltspunkt finde...

    Achja: Ich habe jetzt die Möglichkeit, die Daten von ganz bestimmen ID's von 5 bis 2047 zu bekommen. Sowohl für Spieler als auch für Spectators.

    Danke jedenfalls!
    MfG

    //EDIT:
    So hab ich es versucht:

    unsigned long ConvertPlayerID(const unsigned char* data, unsigned long dataSize)
    {
    	unsigned long dword = MAKELONG(MAKEWORD(data[dataSize - 4], data[dataSize - 3]), MAKEWORD(data[dataSize - 2], data[dataSize - 1]));
    
    	// Normal ID's
    	if(data[dataSize - 5])
    	{
    		while(dword & 1)
    			dword = dword >> 1;
    
    		dword &= 0xFFFFFF;
    		dword = dword << 4;
    	}
    	// Spectator ID's
    	else
    	{
    		// NOT WORKING WELL
    		if(HIWORD(dword) & 1)
    			dword = dword << 1;
    		else
    			dword = dword >> 1;
    	}
    
    	return HIWORD(dword);
    }
    

    spectator15 und spectator20 sind aber problematisch, 1 und 4... ich weiß nimmer weiter.



  • Da das erste und das zweite Byte der "SPECTATOR"s null ist, kann man deren ID nicht eindeutig bestimmen. Irgendwie fehlt eine Information.

    Woher weißt Du, daß "{ 0, 0, 128, 233, 3 }" die ID eises "SPECTATOR"s ist (sein muß)?



  • Hey!

    Weil ich es nachspiele. Mache nen Server auf, joine ihn selbst, logge dabei die DirectPlay-Daten die am Server ankommen.
    Die message mit den 5 bytes als spectator ist viel kürzer, und anscheinend kann man auch einfach das erste byte hernehmen, wenn es 0 ist, ist es ein spectator...

    Es gibt da noch eine message die unmittelbar vor der Eigentlichen ankommt, mit zwei bytes die sich ständig ändern, aber ich konnte darin keinen Zusammenhang erkennen... mit den normalen Spieler-ID's ging's ja auch ohne...

    Hab trotzdem weitere Daten zusammengetragen, in Form von:

    Resultierende ID: 5
    Die zwei Bytes: 208, 6
    Die bekannten 5 Bytes: 255, 0, 80, 0, 0,

    Von 3 unterschiedlichen PC's, als normaler Spieler und als Spectator:

    http://rhonkar.kilu.de/normalpc1.txt
    http://rhonkar.kilu.de/normalpc2.txt
    http://rhonkar.kilu.de/normalpc3.txt

    http://rhonkar.kilu.de/spectatorpc1.txt
    http://rhonkar.kilu.de/spectatorpc2.txt
    http://rhonkar.kilu.de/spectatorpc3.txt

    Mehr zusammenhängende Daten scheint es einfach nicht zu geben...

    Danke!
    MfG


Anmelden zum Antworten