Laden...

Netzwerkverkehr rekonstruieren

Erstellt von Eroli vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.441 Views
E
Eroli Themenstarter:in
36 Beiträge seit 2006
vor 10 Jahren
Netzwerkverkehr rekonstruieren

Hallo zusammen,

seit längerer Pause wende ich mich mal wieder hilfesuchend an die Community hier und hoffe auf eine Menge weiterhelfender Antworten, so wie ich es von früher gewohnt bin 😉

Als netten Zeitvertreibt für zwischendurch spielen meine Freunde und Ich ein Browser-Game der Firma GoodGameStudios. Da mich Flash jedoch total ankotzt und auch mein Computer, vorallem Lüfter und Akku, das nicht so gerne mögen und meine Klausurzeit jetzt vorbei ist, wollte ich mich mal dransetzen und als Fernziel betrachtet einen eigenen Client entwickeln. Falls das überhaupt möglich sein sollte.

Folgendes habe ich schon rausgefunden:*Nachdem alle Seitenelemente über HTTP-Requests geladen worden sind, findet die weitere Kommunikation über SSL (Port 443) statt. *Deaktiviert man SSL und TLS in seinem Browser, so funktioniert das Spiel jedoch trotzdem. Der Netzwerkverkehr kann jetzt im Klartext mit Wireshark mitgelesen werden *Es ist deutlich zu erkennen in welchem Paket die Login-Daten gesendet werden. Auch das Format der Chatnachrichten etc ist ersichtlich *Während des gesamten Spielbetriebs erfolgt kein einziger HTTP-Request. Fiddler scheidet zur Analyse also aus, richtig?

Mein Ansatz war nun eigentlich, dass ich mir das "Login-Paket" kopiere und dieses testweise mit meiner eigenen Applikation versende. Das Datenpaket dazu sieht z.B. so aus:


%&{E@$_=]@PC%xt%EmpireEx_2%lli%2%{"DID":"0","PW":"MeinPasswort","CONM":500,"NID":"","RTM":150,"NOM":"MeinBenutzername","AID":"1377291059380826894","LANG":"de"}%

Wie man sieht kann man das Passwort und den Benutzernamen gut erkennen. Ich schätze AID (AuthenticationID?) steht für irgendeine eindeutige ID zur Identifizierung des Spielers. Mich wundert jedoch, dass der Client diese ID beim einloggen an den Server schicken kann...

Ich bin jetzt einfach mal hergegangen und habe die Login-Daten mit meiner eigenen kleinen Windows-Form Applikation mittels des TcpClients an den Port 443 versendet. Das einzige, was ich als Antwort erhielt, war jedoch nur:

<cross-domain-policy>
<allow-access-from domain='*' to-ports='443' />
</cross-domain-policy>

(Die Zeilenumbrüche habe ich eingefügt)

Ja, und das ist der Punkt, an dem ich im Moment hängen bleibe. Ich würde mich über Ansätze oder auch nur Spekulationen sehr freuen. Vielleicht finden wir ja zusammen heraus wie man mein Vorhaben weiter fortsetzen kann...

Ich freue mich von euch zu hören.

Viele Grüße,
Eroli 😉

A
764 Beiträge seit 2007
vor 10 Jahren

Welche Antwort bekommt denn das Original? Und was sendet das Original darauf hin? Das müsste mit Wireshark ja auch ersichtlich werden. Ein praktisches Tool zum Netzwerk-Verkehr tracen ist auch: TcpTrace

E
Eroli Themenstarter:in
36 Beiträge seit 2006
vor 10 Jahren

Hi,

erstmal Danke für deine Antwort und entschuldige bitte, dass ich mich erst jetzt melde. Diese Woche werde ich wohl immer nur Abends Zeit für mein Hobby finden...

Das Original bekommt folgende Antwort vom Server:

%ET@@6_=+t&PW%xt%ufa%2%0%{"CF":4833,"HF":6042,"NHT":-1}%

Wirklich viel anfangen kann ich damit nicht, aber es ist auf jeden Fall eine andere Antwort als die von meinem Programm. Ich habe eben aber durch Zufall gesehen, dass auch das Original mal meine Antwort bekommt. Ich kann jedoch noch nicht zuordnen wann genau...

Whatever. Das Original bekommt daraufhin wieder eine Antwort vom Server (ohne erneut etwas zu senden):

%EA@6_=+t *&P%xt%lli%2%0%%xt%gbd%2%0%{"gpi":{"UID":1407149,"PID":1206063,"PN":"MeinBenutzername","E":"MeineEmailAdresse","V":1,"CL":0},"upi":{"PU":0,"DC":0},"gem":{"BGT":2,"BGC1":13509737,"BGC2":305315,"SPT":4,"S1":37,"SC1":15259663,"S2":25,"SC2":14408394,"MCE":"0"},"gcu":{"C1":45077,"C2":1109},"gcl":{"PID":1206063,"C":[{"KID":0,"AI":[{"AI":[4,1035,848,1637064,1206063,3,3,3,3,0,"MeinBurgname1",0,0,-1,3,-1,0,0],"TA":0},{"AI":[4,1035,856,1606422,1206063,3,3,3,3,0,"MeinBurgname2",0,0,-1,1,-1,0,0],"TA":0},{"AI":[4,1035,852,1549668,1206063,3,3,3,3,0,"MeinBurgname3",0,0,-1,5,-1,0,0],"TA":0},{"AI":[1,1036,855,1562076,1206063,3,3,3,3,1,"MeinBurgname4",0,0,-1,-1,-1,0,0],"AOT":-1,"TA":-1}]},{"KID":2,"AI":[{"AI":[12,503,818,1786005,1206063,2,2,1,2,0,"MeinBurgname5",0,0,-1,-1,-1,2,0],"AOT":-1,"TA":-1}]}]},"uap":{"KID":0,"NS":-1,"PMS":-1,"PMT":0},"gho":{"H":560,"RP":4057},"gal":{"AID":19921,"R":1,"AN":"MeinClan-Name","ACF":37951,"SA":0},"rsc":{"RS":44},"gms":{"MS":5},"tmp":{"TM":[]},"sei":{"EI":[{"EID":4,"UL":{"UL":0,"PW":0,"PS":0,"PF":0,"PC1":0},"F":0,"WC2":700,"SC2":700,"FC2":350,"C1C2":350,"RID":67},{"EID":37,"PF":0},{},{"EID":24,"MFB":370,"WR":77,"TR":78,"BR":79,"OEP":127,"OR":1187},{}],"RS":[{"EID":4,"RS":862622},{"EID":24,"RS":263222},{"EID":37,"RS":176822}]},"rei":{"A

Daraufhin sendet der Original-Client nur ein ACK und bekommt dann weitere Daten vom Server wie z.B. Nachrichten usw... Sobald alle Informationen übertragen wurden meldet sich der Server zyklisch beim Client und übermittelt die aktuellsten Rohstoffwerte usw...

Reicht das erstmal? Bzw. hilft das weiter?

EDIT:
Kurzer Nachtrag zu diesem Policy-Gedöne. Beim Originalclient läuft das so ab, nachdem alle HTTP-Anfragen abgeschickt wurden (SWF sind also schon geladen und eine clienttracker.php wurde einige male aufgerufen), also kurz bevor das Spiel startet:

[spoiler]
Client --> Server (Port 843):

% E?@_=-K`X)PN<policy-file-request/>

Server --> Client (Port 843):
ACK +

%EL@6 F_=K-)`XPs$<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy
SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all" />
<allow-access-from domain="" to-ports=""/>
</cross-domain-policy>

Dann nach einigen ACKs:

Client --> Server (Port 443, SSL):

% En@_=-!\6P{m<msg t='sys'><body action='verChk' r='0'><ver v='161' /></body></msg>

Server --> Client (Port 443, SSL (Diese Antwort bekam ich auch)):

%E@6_=-\6!Ps4<cross-domain-policy><allow-access-from domain='*' to-ports='443' /></cross-domain-policy>

Einige ACKs

Server --> Client (Port 443, SSL):

%E^@6_=-\61!Ps<msg t='sys'><body action='apiOK' r='0'></body></msg>

Client --> Server (Port 443, SSL):

% E @z_=-!\6gP.<msg t='sys'><body action='login' r='0'><login z='EmpireEx_2'><nick><![CDATA[]]></nick><pword><![CDATA[201308141810%de%0]]></pword></login></body></msg>

Server --> Client (Port 443, SSL):

%EK@6_=-\6g!oP{%xt%rlu%-1%2%13700%100000%2%Lobby%

Client --> Server (Port 443, SSL):

% Eb!@_=-!o\6P%<msg t='sys'><body action='autoJoin' r='-1'></body></msg>

Server --> Client (Port 443, SSL):

%E@6_=-\6!P{V%xt%nfo%-1%0%{"minNameSize":3,"itemXmlVersion":"75.06","sectorCountX":99,"sectorCountY":99}%

Client --> Server (Port 443, SSL):
ACK

Server --> Client (Port 443, SSL):

%E@6_=-\6!P{B<msg t='sys'><body action='joinOK' r='2'><pid id='0'/><vars /><uLs r='2'></uLs></body></msg>

Client --> Server (Port 443, SSL):

% Eb$@_=-!\6DP<msg t='sys'><body action='roundTrip' r='2'></body></msg>

Server --> Client (Port 443, SSL):

%Ee@6_=-\6D!P{5<msg t='sys'><body action='roundTripRes' r='2'></body></msg>

Client --> Server (Port 443, SSL):

% EC%@_=-!\6P_N%xt%EmpireEx_2%vck%2%1997%

Server --> Client (Port 443, SSL):

%E9@6
_=-\6!P{ %xt%vck%2%0%766%

Client --> Server (Port 443, SSL, Logindaten):

% E&@~_=-!\6P%xt%EmpireEx_2%lli%2%{"LANG":"de","NOM":"MeinBenutzername","DID":"0","CONM":468,"RTM":31,"AID":"1377291059380826894","PW":"MeinPasswort","NID":""}%

Server --> Client (Port 443, SSL):

%ET@6_=-\6!Pk%xt%ufa%2%0%{"CF":4833,"HF":6042,"NHT":-1}%

Server --> Client (Port 443, SSL):
Datenpakete (s.o.) werden nun an den Client verschickt. Danach beginnt das Spiel wie oben beschrieben. Danach finden noch zyklische Statusmeldungen vom Server an den Client statt. Ich bin mir nicht sicher, ob der Client diese nur ACK'ed oder selber noch Daten zurückschickt. Aber zu diesem Punkt muss man ja auch erstmal gelangen...

Mit den ACK's war ich nicht immer konsistent. Da diese aber eh zum TCP-Protokoll gehören und es mich sowieso erstaunt, dass Wireshark diese anzeigt, dürften diese nicht viel zum Geschehen beitragen...
[/spoiler]

Meint ihr es wäre somit Sinnvoll die Kommunikation auf Port 843 vor meiner bereits simulierten Anfrage ebenfalls abzuschicken in der Hoffnung, dass dann die zweite Antwort vom Server mit action='APIok' kommt?

B
218 Beiträge seit 2012
vor 10 Jahren

Die ID wird sicher irgendeine SessionID sein, die du mittels Cookie gesetzt bekommst.

Https würde ich nicht deaktivieren, das kann zu Fehlern führen. Probiere lieber Tools, die sich in den Browser einbetten, wie HttpFox.

Andere Möglichkeit wäre das SWF zu downloaden und mit einem Flashdekompiler die Stelle zu suchen wo die Requests gemacht werden --> Nachbauen

Sinn des Ganzen erschließt sich mir dennoch nicht.