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.