MMO Verschlüsselung Knacken

12/03/2012 23:15 D3adlySil3nc3#1
Hey
Da, ich mich in letzter Zeit ein bisschen mit Speichervarianten und Netzwerkkommunikation beschäftigt habe (uA wegen der Uni) wollte ich mal probieren die Verschlüsselung für ein MMO rauszufinden und bin da auf ein paar Fragen gestoßen.

1.) Ich habe hier und in anderen Foren immer gelesen, dass man die empfangenen Packets umdrehen muss.
Es würde mich interessieren ob das Little Endian für jede Netzwerkkommunikation verwendet wird oder einfach nur sehr häufig.

2.) Wie weiß man, ob die Daten DWord oder Word ankommen?

3.) Wie kann ich sehen wie die Kommunikation verschlüsselt ist?
Ich lese immer wieder von Not und xor Verschlüsselung, welche wohl nur für Erklärungszwecke verwendet wird. Nur wie kann ich in Erfahrung bringen, dass es keinen Sinn hat die Packete durchzuprobieren vor allem in Zeiten von Hashes und Asymetrischen Verschlüsselungsverfahren?
So, dass ich nicht stundenlang an ein paar Packets sitze und im Endeffekt es gar nicht möglich ist diese zu entschlüsseln.

Was mir dazu eingefallen ist, wäre das bei einer statischen Verschlüsselung ja, zumindest während der gleichen Session bei dem gleichen Chattext immer der gleiche Chiffre rauskommen müsste. Wenn das nicht der Falll ist dann muss man sich wohl schon an nen Debugger hängen?

Ich möchte nur nicht ewig mit Olly rumspielen um dann rauszufinden, dass es sich doch um eine Not Verschlüsselung handelt.

Und ja, die Tutorials habe ich bereits gelesen.
mfg
12/04/2012 03:57 nkkk#2
Quote:
Originally Posted by D3adlySil3nc3 View Post
Hey
Da, ich mich in letzter Zeit ein bisschen mit Speichervarianten und Netzwerkkommunikation beschäftigt habe (uA wegen der Uni) wollte ich mal probieren die Verschlüsselung für ein MMO rauszufinden und bin da auf ein paar Fragen gestoßen.

1.) Ich habe hier und in anderen Foren immer gelesen, dass man die empfangenen Packets umdrehen muss.
Es würde mich interessieren ob das Little Endian für jede Netzwerkkommunikation verwendet wird oder einfach nur sehr häufig.
nein das kann man jeder machen wie er will.
Quote:
2.) Wie weiß man, ob die Daten DWord oder Word ankommen?
WORD = 2 byte
DWORD = 4 Byte (double WORD eben)
sind einfach datentypen, (Int16, Int32 hiessen sie z.B. in C#)
für kleinere sachen (z.B. manche enumtypen) kann man man WORD nehmen.
für die meisten sachen wird aber entweder 1- Byte oder 4 Byte datentypen werwendet.
für wirklich grosse zahlen (z.B. die goldmange eines spielers) wird oft QWORD = QUAD WORD =8byte = Int64 benutzt
ein paket enthält viele daten als meinstns bestehend aus QWORD, DWORD, WORD, FLOAT etc gemischt.
Quote:
3.) Wie kann ich sehen wie die Kommunikation verschlüsselt ist?
Ich lese immer wieder von Not und xor Verschlüsselung, welche wohl nur für Erklärungszwecke verwendet wird. Nur wie kann ich in Erfahrung bringen, dass es keinen Sinn hat die Packete durchzuprobieren vor allem in Zeiten von Hashes und Asymetrischen Verschlüsselungsverfahren?
So, dass ich nicht stundenlang an ein paar Packets sitze und im Endeffekt es gar nicht möglich ist diese zu entschlüsseln.

Was mir dazu eingefallen ist, wäre das bei einer statischen Verschlüsselung ja, zumindest während der gleichen Session bei dem gleichen Chattext immer der gleiche Chiffre rauskommen müsste. Wenn das nicht der Falll ist dann muss man sich wohl schon an nen Debugger hängen?

Ich möchte nur nicht ewig mit Olly rumspielen um dann rauszufinden, dass es sich doch um eine Not Verschlüsselung handelt.

Und ja, die Tutorials habe ich bereits gelesen.
mfg
naja ich denke die verschlüsselug ist schon einigermassen kompliziert sodas du einen debugger benutzten musst.

aber wenn du z.B. dir nur die (unverschlüsselten) packete ansehen willst ist es am einfachsten die mit hilfe eines debuggers einfach anzugucken bevor sie verschlüsselt werden.
12/05/2012 20:01 Crack-wtf#3
Geh zum call von WSA_Send, step 2 - 3 calls zurück und schau in die Parameter.
Klappt sehr oft.

Such dann nach welchem call die Packets Verschlüsselt übergeben werden, und du weißt in welcher funktion du nach dem call der verschlüsselungsroutine suchen musst.

Ist eigentlich nicht kompliziert.

Danach haste 2 möglichkeiten.

Die einfache Variante ist die Funktion zu Detourn/Hooken und dann einen Packet Editor basteln.
Die langwierigere Variante ist die Verschlüsselung/Entschlüsselung nachzubauen, und einen PacketEditor durch bloses Detourn von WSA_Send basteln.

Eigentlich ist letzeres unnötig, da ich darin keinen vorteil sehe.
12/05/2012 21:47 D3adlySil3nc3#4
Quote:
Originally Posted by nkkk View Post
nein das kann man jeder machen wie er will.

WORD = 2 byte
DWORD = 4 Byte (double WORD eben)
sind einfach datentypen, (Int16, Int32 hiessen sie z.B. in C#)
für kleinere sachen (z.B. manche enumtypen) kann man man WORD nehmen.
für die meisten sachen wird aber entweder 1- Byte oder 4 Byte datentypen werwendet.
für wirklich grosse zahlen (z.B. die goldmange eines spielers) wird oft QWORD = QUAD WORD =8byte = Int64 benutzt
ein paket enthält viele daten als meinstns bestehend aus QWORD, DWORD, WORD, FLOAT etc gemischt.
Ja, danke die Datentypen sind mir schon klar.
Aber anders ausgedrückt muss man einfach nach Gefühl gehen was wie daherkommt?

Quote:
Originally Posted by Crack-wtf View Post
Geh zum call von WSA_Send, step 2 - 3 calls zurück und schau in die Parameter.
Klappt sehr oft.

Such dann nach welchem call die Packets Verschlüsselt übergeben werden, und du weißt in welcher funktion du nach dem call der verschlüsselungsroutine suchen musst.

Ist eigentlich nicht kompliziert.

Danach haste 2 möglichkeiten.

Die einfache Variante ist die Funktion zu Detourn/Hooken und dann einen Packet Editor basteln.
Jup, sowas habe ich mir shcon gedacht.

Meinst du mit der WSA_Send, denn von Wireshark und Co?
Ich dachte nämlich, dass ich zur send func von der winapi gehe. Und dann eben soweit zurück bis ich den Text "Klartext" sehe, um den Bereich mal einzuschränken und dann mich eben durchhängle.
12/06/2012 11:48 Crack-wtf#5
Naja die meisten MMO's nutzen WSA_Send.
Mir ist eigentlich keins bekannt das Send nutzt.
Wie dem auch sei.
Kannst ja testen.
Setz nen Breakpoint auf beide Funktionen, und sende ingame eine Nachricht ab und schaue wo es breakt.
Könnte auch sein dass ein Anticheat system Send zum senden der Keep-Alives nutzt und das Game WSA_Send.
Aber das merkst du ja wenn du reverst.
12/10/2012 11:07 MrSm!th#6
Quote:
Originally Posted by Crack-wtf View Post
Eigentlich ist letzeres unnötig, da ich darin keinen vorteil sehe.
Der Vorteil ist, dass du nicht auf den Client angewiesen bist und sogar deinen eigenen Emulator nachbauen könntest. Das eigene Versenden von Daten ist so auch einfacher.

Wer sich die Arbeit macht, die Verschlüsselung nachzubauen, verschwendet das doch nicht, indem er dann einfach send/recv hookt.

@Dateninterpretation:

Du wirst immer einen Debugger brauchen. Ein Packet Editor ist anfangs relativ nutzlos, um den Aufbau der Packets nachzuvollziehen. Du verfolgst einfach, wie die Daten im Client genutzt werden und schließt so auf die Bedeutung.

@Little Endian:

Bei Windows wirst du immer diese Umkehrung finden, da die Network-Byte Order standardisiert ist.


@Crack:

S4 nutzte früher send und recv.
12/12/2012 13:41 D3adlySil3nc3#7
Okay, danke sehr!

Hätte noch eine Frage zur Sprache,
Ob ich jetzt C++ oder C# nehme dürfte doch egal sein? Mit beiden kann ich inline asm verwenden sowie auf die Winapi zugreifen.
Gibt es einen guten Grund C++ zu verwenden gegenüber von C#?
[vor Allem als Java-Anwenungsentwickler]
oder habe ich etwas übersehen?
12/12/2012 15:01 MrSm!th#8
Nein, nicht wirklich. Wenn du C# kannst, bleib dabei. Selbst Code/Dll Injektion ist damit kein Problem.
12/12/2012 18:15 nkkk#9
Quote:
Originally Posted by MrSm!th View Post
Du wirst immer einen Debugger brauchen. Ein Packet Editor ist anfangs relativ nutzlos, um den Aufbau der Packets nachzuvollziehen. Du verfolgst einfach, wie die Daten im Client genutzt werden und schließt so auf die Bedeutung.
wieso meinst du das? oft kann man mit einem packeteditor recht einfach herausfinden wofür die einzelnen daten stehen (z.B. du benutzt fahogkeit 1 dann steh iwo eine 1, du benutzt fähigkeit 4 dann steht iwo eine 4 dann weist du wo sie faigkeits nr steht so als beispiel ist oft einfcher als den client auseinanderzunehmen), dazu muss der Packeteeditor natürlcih auf die unverschlüsselten packete zugreifen

Quote:
Originally Posted by D3adlySil3nc3 View Post
Okay, danke sehr!

Hätte noch eine Frage zur Sprache,
Ob ich jetzt C++ oder C# nehme dürfte doch egal sein? Mit beiden kann ich inline asm verwenden sowie auf die Winapi zugreifen.
Gibt es einen guten Grund C++ zu verwenden gegenüber von C#?
[vor Allem als Java-Anwenungsentwickler]
oder habe ich etwas übersehen?
dann ist das also wieder ein "ist C++ besser als C# fürs gamehacking"-Thread?

Und mit C# kannst du auch nicht Wirklich inline asm verwenden.

aber was genu willst du machen? den client analysieren? dazu brucht man Tools wie CE oder olly und kein programmiersürache.
Wenn du ein programm schreiben willst was sich in den prozess Injected und dort die packets verändert würde ich dir empfehln C# (90%) und C++ (10%) gemischt einzusetzen weil einige sachen in C# doch recht umständlich sind.
12/18/2012 12:31 Crack-wtf#10
Quote:
Originally Posted by MrSm!th View Post
Der Vorteil ist, dass du nicht auf den Client angewiesen bist und sogar deinen eigenen Emulator nachbauen könntest. Das eigene Versenden von Daten ist so auch einfacher.

Wer sich die Arbeit macht, die Verschlüsselung nachzubauen, verschwendet das doch nicht, indem er dann einfach send/recv hookt.

@Crack:

S4 nutzte früher send und recv.
S4 ist ja auch Schwachsinn...
Naja das mit dem Emulator stimmt schon, allerdings dachte ich bezieht sich die Frage eher aufs GameHacking, und da reicht ein Detour.

Nieder mit C#
12/18/2012 21:16 MrSm!th#11
Quote:
wieso meinst du das? oft kann man mit einem packeteditor recht einfach herausfinden wofür die einzelnen daten stehen (z.B. du benutzt fahogkeit 1 dann steh iwo eine 1, du benutzt fähigkeit 4 dann steht iwo eine 4 dann weist du wo sie faigkeits nr steht so als beispiel ist oft einfcher als den client auseinanderzunehmen), dazu muss der Packeteeditor natürlcih auf die unverschlüsselten packete zugreifen
Aber eben nicht alles, das war mein Punkt.

Quote:
Naja das mit dem Emulator stimmt schon, allerdings dachte ich bezieht sich die Frage eher aufs GameHacking, und da reicht ein Detour.
Zumindest, wenn es nur ums Loggen geht.
12/20/2012 16:31 Crack-wtf#12
Reden wir aneinander Vorbei?
Wieso sollte ein Detour der Send VerschlüsselungsRoutine nur für Loggen gut sein?
Man speichere sich den This Ptr, und calle sie mit eigenen Parametern und schwups kann man eigene Packets Senden.
Und OnTheFly kann man sie auch Manipulieren.
Hacke auf diese weise ne menge in DragonballOnline
12/21/2012 22:58 MrSm!th#13
Quote:
Originally Posted by Crack-wtf View Post
Reden wir aneinander Vorbei?
Wieso sollte ein Detour der Send VerschlüsselungsRoutine nur für Loggen gut sein?
Man speichere sich den This Ptr, und calle sie mit eigenen Parametern und schwups kann man eigene Packets Senden.
Und OnTheFly kann man sie auch Manipulieren.
Hacke auf diese weise ne menge in DragonballOnline
Wieso solltest du nen Detour zum Callen einer Funktion brauchen?
12/22/2012 04:11 Crack-wtf#14
Ich muss mir doch den ThisPtr abspeichern.
Und wenn ich schon nen Detour setz zum "Loggen", kann ich doch gleich auch den ThisPtr abgreifen um so die Send Function mit eigenen Parametern zu callen.
12/22/2012 14:10 MrSm!th#15
Nicht jede Funktion ist eine Memberfunktion, den Thisptr kann man auch anders holen (und manchmal ignorieren) und es ändert ja trotzdem nichts an der Aussage, dass ein permanenter detour zum Callen nicht notwendig ist :p
Klar, wenn du eh schon damit loggst, kannsten den Thisptr auch gleich abspeichern.