Frage:
Reverse Engineering von Datenstrukturen in Spielen
puelo
2014-10-20 13:33:52 UTC
view on stackexchange narkive permalink

Ich nehme derzeit an einem Reverse-Code-Engineering-Seminar für mein Studium der Informatik: Spiele-Engineering teil und erhielt das Thema "Identifizieren von Datenstrukturen". Nach einem ausführlichen Gespräch mit meinem Vorgesetzten kamen wir beide zu dem Schluss, dass es sinnvoll wäre, das Thema mit dem Umkehren von Spiel-Binärdateien zu kombinieren. Unsere Ergebnisse sind ein 15-seitiges Papier und ein kleines Tool, das die Techniken implementiert, über die wir in dem Papier sprechen. Wir müssen nicht unbedingt eine neue Technik erfinden.

Ich habe bereits einige Untersuchungen zum Reverse Engineering von Datenstrukturen im Allgemeinen durchgeführt und mir hauptsächlich Tools ausgedacht, mit denen Datenstrukturen automatisch aus der binären Ausführung zurückentwickelt werden (z. B. https://www.utdallas.edu/~) zxl111930 / file / Rewards_NDSS10.pdf)

Nun ist meine Frage: Was wäre ein vernünftiges Werkzeug zum Programmieren oder eine Technik zum Schreiben in Bezug auf das Umkehren von Datenstrukturen aus Videospiel-Binärdateien (wie z World of Warcraft)? Ist die im obigen Artikel erwähnte Methode noch auf Spiel-Binärdateien anwendbar oder gibt es andere bekannte Techniken?

Ich habe einige Erfahrungen mit Reverse Engineering, bin aber nicht annähernd "Profi" - Niveau. Ich arbeite hauptsächlich auf einer Windows (x64) -Plattform.

Das Papier erwähnt das Erkennen der * Typausbreitung * innerhalb von Unterprogrammen. Das konnte ich ziemlich erfolgreich implementieren, um das interne Strukturlayout eines komplizierten RTS-Spiels zu entdecken. (Aber es hat mir geholfen, meinen eigenen Disassembler von Grund auf neu zu schreiben. Dies konnte einfach aufgeklebt werden.)
Drei antworten:
Guntram Blohm supports Monica
2014-10-20 14:45:39 UTC
view on stackexchange narkive permalink

Randnotiz: WoW oder ein vergleichbares MMORPG ist wahrscheinlich ein schlechtes Ziel für Ihre Forschung, da viele von ihnen verschiedene Anti-Hack-, Anti-Cheat- oder Anti-Botting-Techniken enthalten, die wahrscheinlich erkennen, was Sie tun

Ich bin weit davon entfernt, selbst ein Experte zu sein, aber ich habe kürzlich ein 20 Jahre altes Spiel als Hobbyprojekt zerlegt und versucht, es zu verstehen. Die ausführbare Datei hat eine Größe von 800 KB. IDA hat ungefähr 1750 Funktionen darin erkannt, von denen 250 C / C ++ - Bibliotheksfunktionen waren. Unnötig zu erwähnen, dass ich einige Zeit damit verbracht habe, verschiedene Funktionen zu untersuchen und die verwendeten Zeichenfolgen zu überprüfen, ohne zu viel zu verstehen.

Was mir den Durchbruch brachte, war, als ich herausfand, wie der Compiler mit der Klassenkonstruktion umging. Jeder Klassenkonstruktor ruft eine malloc () -ähnliche Funktion auf (mit der Größe als Parameter), ruft dann den Konstruktor der Oberklasse auf und initialisiert dann die Methoden (es gibt keine vtable wie bei moderneren Compilern; die Der Compiler initialisiert jeden "Funktionszeiger" einzeln) und Klassenvariablen. Durch Querverweise auf diese malloc () -Aufrufe, das Überprüfen der Größe der zugewiesenen Klassen und das Befolgen der Ketten von "Konstruktoraufrufen des Superklassenkonstruktors" erhielt ich sofort eine Vorstellung vom gesamten Klassenbaum und der Größe der einzelnen Klassen Klasse.

Außerdem bekam ich eine Vorstellung davon, welche Funktion eine Unterklassenmethode für welche andere Funktion in der Hauptklasse war, was viel Einblick in den Zweck dieser Funktionen brachte, da ich wusste, welche Funktion war eine Klassenmethode für welche Klasse, es war ziemlich einfach, den this -Zeiger der Funktion zu verfolgen, seine Dereferenzen zu verfolgen und herauszufinden, welches Klassenelement als Integer-, Double- oder Zeigertyp verwendet wurde, und Bei Zeigern wissen Sie, auf welchen anderen Klassentyp sie gezeigt haben.

Dies war meine erste Begegnung mit IDA, daher wusste ich nichts über die Skriptfunktionen und lernte sie kennen, als sich die Dinge zu oft wiederholten. Wenn ich jetzt dasselbe tun müsste, würde ich wahrscheinlich viel von dem, was ich manuell gemacht habe, skripten / automatisieren.

Ich denke, dass dies mit modernen C ++ - Compilern, die vtables auf vorhersehbare Weise verwenden, noch einfacher sein könnte. Überprüfen Sie, wo die vtables zugewiesen werden, um herauszufinden, wo Klassen instanziiert werden. Überprüfen Sie die Superclass-Konstruktor-Aufrufe, um Informationen zur Klassenhierarchie zu erhalten. Überprüfen Sie die Größen in malloc / new -Aufrufen, um Struktur- / Klassengrößen zu erhalten. Verfolgen Sie die this -Zeiger in Klassenmethoden (die leicht durch die vtables identifiziert werden können), um herauszufinden, wie die Elemente verwendet werden. All dies kann mithilfe einer statischen Analyse erfolgen, sodass Sie sich nicht einmal darum kümmern müssen, wie sich Anti-Cheat- / Anti-Debug-Techniken auf das Ergebnis auswirken können.

Danke für die ausführliche Antwort. Da ich lieber statisch analysieren möchte, werde ich mich auf jeden Fall mit der Arbeit mit der vtable befassen. Ich werde Ihre Antwort bis spätestens morgen als "richtig" markieren, in der Hoffnung, dass ich bis dahin vielleicht mehr Input bekomme. Vielen Dank so weit!
Paul
2014-10-20 17:35:06 UTC
view on stackexchange narkive permalink

Diese Antwort dient nur dazu, das zu erweitern, was @Guntram Blohm gesagt hat.

Diese Frage ist wirklich viel zu weit gefasst, daher gehe ich davon aus, dass Ihr Reverse Engineering x86 / x64 ist native ausführbare Dateien unter Windows (keine Bytecode-Sprachen wie Java und .NET). Lassen Sie mich zunächst sagen, dass dies nicht voller Methoden ist, da es so viele Möglichkeiten gibt, die von so vielen Dingen abhängen. Hier ist eine Liste möglicher Dinge, die sich auf Ihre Reverse Engineering-Techniken auswirken könnten:

  • Windows-Version (Viele der älteren Tools laufen nur unter XP, deshalb habe ich ein VM-Setup für XP. Aber nicht alle Spiele, die unter XP ausgeführt werden)
  • Ausführbare Architektur (Nicht alle Debugger sind Multi-Architekturen)
  • Native oder Bytecode-Sprache (Bytecodes können dekompiliert werden)
  • Compiler, die einige Compiler verfügbar machen Metadaten, die für das Reverse Engineering nützlich sein können. (Mit PEiD können Sie herausfinden, mit was die ausführbare Datei kompiliert wurde. Hinweis: Packer können jedoch verschleiern, mit was sie ursprünglich kompiliert wurde.)
  • Schutz wie Packer oder Anti-Cheats (Zu viel, um ohne zu antworten Wenn Sie eine neue Frage stellen möchten und diese gerne beantwortet werden)
p> Methode 1: Führen Sie zunächst Ihre Recherchen durch, und Sie werden sie möglicherweise finden Das Game Engine SDK, das alle Datenstrukturen enthält, und bei geringfügigen Änderungen Methode 2 überprüfen.

Methode 2: Wenn Sie beispielsweise eine bestimmte Datenstruktur suchen möchten um die Gesundheit Ihrer Spieler zu finden. Wenn Sie Ihre Gesundheit in Cheat Engine gefunden haben, haben Sie mit dem Cheat Engine-Debugger nachgeschaut, was darauf geschrieben wird.

Nehmen wir an, wir hätten diese Anweisung auf unseren Integritätswert schreiben lassen:

  MOV [EAX + 32], EBX  

Wir wissen, dass +32 ein Offset der Datenstruktur ist, die den Zustand dort festhält. Welches Sie Tool wie ReClass verwenden könnten, um Sie zu unterstützen oder in Cheat Engine zu strukturieren.

Sobald Sie dies getan haben, können Sie die Werte für jede Variable ändern und prüfen, ob dies einen visuellen Einfluss auf das Spiel hat. Wenn Sie es nicht schaffen, können Sie für alle Register bp für den Wert Ihres Basisadressregisters + Offset für die komplexen Haltepunktbedingungen festlegen. Sobald der Haltepunkt erreicht ist, müssen Sie die Assembly-Opcodes durchlaufen, um herauszufinden, wofür die Adresse verwendet wird.

Möglicherweise möchten Sie das EAT auf Hinweise für Funktionen oder Daten überprüfen, die verfügbar gemacht werden

Ich würde empfehlen, dass Sie sich die folgenden Tools zulegen:

  • Cheat Engine
  • IDA PRO
  • PEiD
  • ReClass
Ich bin dankbar für Ihre Antwort: Ich weiß, wie man Strukturen manuell findet, basierend auf Informationen, die ich persönlich im Spiel habe (wie Ihr Gesundheitsbeispiel). Meine Aufgabe ist es, Techniken zu präsentieren und teilweise zu implementieren, die solche Dinge irgendwie automatisch erledigen. Haben Sie einige Vorschläge dazu?
Ist meine Annahme richtig, dass Sie Windows verwenden und native Software zurückentwickeln, bevor ich meinen Beitrag bearbeite?
Oh, Entschuldigung. Ja, deine Annahme ist richtig!
Attila
2014-10-21 05:46:00 UTC
view on stackexchange narkive permalink

Wenn Sie einen anderen Ansatz in Betracht ziehen, nämlich die statische Analyse der Datenformate ohne binäre Ausführung, sollten Sie sich diesen Blog-Beitrag ansehen, in dem "die Methoden zur Untersuchung unbekannter binärer Formate beschrieben werden, die möglich sind." entweder eine Datei, ein Dateifragment oder ein Speicherauszug. "



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...