Du bist nicht angemeldet.

1

Montag, 11. Juli 2011, 23:35

Registrationsprotokoll

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.

2

Montag, 11. Juli 2011, 23:39

Kommandos

Die wichtigsten Kommandos im Überblick:

Client -> Server

"Hello"

Quellcode

1
z\0<VERSION>\0<LOCATION>\00  Beispiel(e): z\0V1.1g\0http://localhost/reg.html\00
"Help"

Quellcode

1
2
3
4
5
p\0registration\0<TOPIC>  

Beispiel(e): 
p\0registration\0Alter 
p\0registration\0Vergeben p\0registration\0hilfe0 


"Submit"

Quellcode

1
g\0<STEP>\0<PARAMETER>  Beispiel(e): g\0s0\0NICKNAME\0PASSWORD\0PASSWORDWDH\0EMAIL\0ALTER\0männlich\0Vergeben\00\01 g\0s1\0STADT\0LAND\0HOBBIES\0MOTTO\0REALNAME\0BIRTHDAY\0Deutschl.\0PLZ\0JOB\00\00\01\0 \0 \0 \0 \0  
(Leerzeichen repräsentieren ausgelassene Felder, Nullen nicht aktive Checkboxen und Einsen aktive Checkboxen)

Server -> Client

"Popup"

Quellcode

1
2
3
q\0<TITLE>\0<CONTENT> 
 Beispiel(e): 
q\0Test\0HOMO; OMQ!!!1 


"Soundtrack"


Quellcode

1
2
3
o\0<TRACK>.au 
 Beispiel(e): 
o\0ateam.au 


"Close"

Quellcode

1
2
f  
Beispiel(e): - 


"Next Step"

Quellcode

1
2
s  
Beispiel(e): - 


"Show URL"

Quellcode

1
2
3
4
x\0<URL>\0<TARGET> 
   Beispiel(e): 
 x\0http://google.de/\0_blank 
x\0http://google.de/\0_self 
(Öffnet URL im angegebenen Target, wird am Ende benutzt um zum Chat zu gelangen)

"Registration complete"

Quellcode

1
2
3
4
s\0<URL>\0<TARGET>  
Beispiel(e): 
s\0http://google.de/\0_blank 
s\0http://google.de/\0_self 

(Öffnet URL im angegebenen Target, wird am Ende benutzt um zum Chat zu gelangen)

3

Montag, 1. August 2011, 23:58

Ich glaube Handys identifizieren sich mit 0x01 als erstes Bytes.
Tschüß.