Das
Protokoll des Registrationsapplets ist ganz simpel aufgebaut:
Das erste Byte, welches der Server empfängt, ist immer 0x02 (Was das Applet identifiziert).
Für mich macht es nun Sinn, dass Knuddels erkennt, welches
Protokoll verwendet wird.
0x00 = Chat / Huffman
0x01 = ???
0x02 = Registration / XOR SHIFT AND
Die nächsten 8 Bytes repräsentieren einen Long, also einen 64bit-Integer.
Dieser ist eine dynamische Zahl und zwar die "Systemmillis" also die Systemzeit in Millisekunden.
Wozu sie gebraucht wird, kommen wir später. Auf jeden Fall wird sie in 8 bytes aufgesplittet und dann übermittelt.
Somit sieht der gesamte Header so aus:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
|
byte[] arrayOfByte2 = new byte[9];
arrayOfByte2[0] = 2;
arrayOfByte2[1] = (byte)(int)(millis >> 56 & 0xFF);
arrayOfByte2[2] = (byte)(int)(millis >> 48 & 0xFF);
arrayOfByte2[3] = (byte)(int)(millis >> 40 & 0xFF);
arrayOfByte2[4] = (byte)(int)(millis >> 32 & 0xFF);
arrayOfByte2[5] = (byte)(int)(millis >> 24 & 0xFF);
arrayOfByte2[6] = (byte)(int)(millis >> 16 & 0xFF);
arrayOfByte2[7] = (byte)(int)(millis >> 8 & 0xFF);
arrayOfByte2[8] = (byte)(int)(millis & 0xFF);
|
Um diesen nun am Server wieder zu dekodieren benutzen wir folgendes in Kurzfassung:
|
Quellcode
|
1
2
3
4
|
byte[] buffer = new byte[8];
long key = 0;
for (int i = 0; i < buffer.length; i++)
key = (key << 8) + (buffer[i] & 0xFF);
|
Nun erstellen Server und Client ein Random mit diesem Key addiert mit 25091978.
Für jedes Byte, was der Client an den Server sendet, wird ein neues Byte aus dem Random geholt, womit dann der Client das Byte kodiert und der Server das Byte dekodiert.
Die Methode dazu sieht folgendermaßen aus:
|
Quellcode
|
1
2
3
|
// Create
for (int i = 0; i < paramString.length(); i++)
localStringBuffer.append((char)(paramString.charAt(i) ^ this.rand.nextInt() >> 3 & 0x7F));
|
Wie man sieht kommen dazu noch 2 weitere Operatoren, die man aber ignorieren kann, da XOR umgedreht XOR bleibt.
Ist halt wieder ne ganz simple XOR-Verschlüsselung.
|
Quellcode
|
1
2
3
4
5
6
7
|
10110 <-- PLAIN
^ 01011 <-- KEY
-------
11101 <-- ENCODED
^ 01011 <-- KEY
-------
10110 <-- PLAIN
|
So genug Theorie :b
Halt ganz simples XOR:
|
Quellcode
|
1
2
|
for(int i = 0; i < input.length(); i++)
sb.append((char) (input.charAt(i) ^ cRand.nextInt() >> 3 & 0x7F));
|
Das wars schon vom
Protokoll.
Im nächsten Post kommen dann die paar wichtigsten Kommandos.