Was ist DLL Injection und wie wird es verwendet, Reverse Engineering Stapel Wechsel zum Umkehren
DCoder Antwort ist ein guter. So erweitern Sie etwas, die ich am häufigsten DLL verwenden Injektion im Rahmen zwingt einen bestehenden Prozess eine DLL durch Create zu laden. Von dort aus wird der Einstiegspunkt der DLL durch das Betriebssystem ausgeführt werden, sobald sie geladen wird. In der Einstiegspunkt, werde ich dann eine Routine aufzurufen, die Patchen von allen Stellen innerhalb des ursprünglichen binären In-Memory-führt, die mich interessieren, und leitet deren Ausführung in meine DLL über eine Vielzahl von Modifikationen. Wenn ich interessiere mich für das Modifizieren oder der Prozess Interaktion mit einigen importierten Funktion zu beobachten, dann werde ich die IAT-Eintrag für diese Funktion überschreiben und ersetzen Sie es mit einem Zeiger auf etwas, das ich steuern. Wenn ich das gleiche mit Bezug auf eine Funktion tun mag, die innerhalb der binären existiert, werde ich am Anfang der Funktion eine Art Umwege Stil Patch machen. Ich kann sogar sehr chirurgische tun und gezielte Haken an beliebigen Orten, ähnlich der alten Schule Byte-Patching. Meine DLL tut ihr Geschäft in den einzelnen Haken und dann programmiert wird die Steuerung wieder auf den ursprünglichen Prozess umzuleiten.
DLL-Injektion bietet eine Plattform, um die Ausführung eines laufenden Prozesses zum Manipulieren. Es ist sehr häufig für Logging-Informationen während Reverse Engineering eingesetzt. Zum Beispiel können Sie den IAT-Eintrag für eine importierte Betriebssystem Bibliotheksfunktion, da einhaken und dann die Funktionsargumente auf Datenträger protokollieren. Dies bietet Ihnen eine Datenquelle, die schnell umkehren in Engineering das Ziels unterstützen.
DLL-Injektion ist nicht auf die Protokollierung beschränkt, though. In Anbetracht der Tatsache, dass Sie freien Lauf auszuführen was Code, die Sie innerhalb der Prozessadressraum wollen, können Sie das Programm in irgendeiner Weise ändern, die Sie wählen. Diese Technik wird im Spiel Hacking Welt zu kodieren Bots häufig verwendet.
Alles, was Sie mit Byte-Patching tun könnten, können Sie mit DLL-Injektion zu tun. Außer DLL-Injektion wird wahrscheinlich einfacher und schneller sein, weil Sie in C Patches codieren, erhalten statt Sprache Montag und müssen nicht zur Arbeit über machen manuelle Änderungen an den binären und seiner PE-Struktur, Code Höhlen zu finden, usw. DLL-Injektion fast vollständig eliminiert die Notwendigkeit Assemblersprache für die Verwendung während Modifikationen in einem binären machen; die einzige Assemblersprache erforderlich werden kleine Teile des Codes werden in der Nähe der Eingang und Ausgang zu einem bestimmten Haken die Werte der Register / die Flags zu speichern und wiederherzustellen. Es macht auch binäre Änderung schnell und einfach, und ändern Sie keine Verschlüsselungs Signaturen der ausführbaren Datei, die Sie patchen.
DLL-Injektion kann in hohem Maße nicht-triviale Reverse-Engineering-Probleme zu lösen, eingesetzt werden. Das folgende Beispiel ist notwendigerweise vage in mancher Hinsicht wegen der Nicht-Disclosure-Agreements.
Ich verwenden, um eine DLL-Injektion-basierte Lösung, die wie folgt funktioniert:
Am Anfang war ich für jeden Neubau all dies von Hand tun. Das war viel zu langweilig. Ein I codiert, um die DLL-Injektion Version, die ich nie, dass wesentliche und Handarbeit immer wieder zu übernehmen hatte.
DLL-Injektion ist nicht allgemein bekannt oder außerhalb des Spiels Hacking im Reverse Engineering eingesetzt. Das ist sehr bedauerlich, weil es eine extrem leistungsfähige, flexibel und einfache Technik, die Bestandteil eines jeden Repertoire sein sollte. Ich habe es Dutzende Male verwendet und es scheint, eine Rolle in allen meinen dynamischen Projekten zu finden. In dem Moment, meine Aufgabe zu umständlich wird mit einem Debugger Skript zu tun, schalte ich auf DLL-Injektion.
Im Spektrum von Reverse-Engineering-Techniken, noch jede Fähigkeit der DLL-Injektion wird durch dynamische binäre Instrumentierung (DBI) Werkzeuge angeboten als auch, und DBI ist noch leistungsfähiger. Allerdings ist DBI nicht verstohlen und verursacht einen schweren Kopf in Bezug auf dem Speicherverbrauch und möglicherweise Leistung. Ich versuche immer, DLL-Injektion zu verwenden, bevor zu DBI wechseln.
Für einige Ressourcen auf DLL-Injektion, gibt es eine große achtteilige Serie ein DLL-Injektion-basiertes Poker-Bot auf dem Schreiben. Siehe hier ; von unten beginnen und die nummerierten Einträge, um lesen.
DLL Injection funktioniert durch trickst / zwingt den Zielprozess in eine DLL Ihrer Wahl laden. Danach wird der Code in dieser DLL als Teil des Zielprozesses erhält ausgeführt und wird in der Lage sein, den Prozess zu tun alles selbst kann. Der Spaß Teil wird, um herauszufinden, wie Sie Ihren Code durch den Zielprozess genannt zu bekommen.
DLLs können injiziert werden:
- einfach ersetzen verwendet Ihre DLL für einen der Prozess typischerweise - z.B. wenn Sie Ihre DLL ddraw.dll nennen. viele Spiele es glücklich anstelle des echten Direct Draw-DLL laden. Ich habe dies das Spiel zu zwingen getan gesehen nur Direct Draw in der Software-Emulation-Modus zu verwenden, es auf bestimmten GPUs zu beschleunigen.
- trickst in den Loader eine bekannte DLL aus einem anderen Ordner geladen - siehe The Old New Thing.
- einen Teil des Prozesscode mit Anweisungen zu ersetzen Ihre DLL zu laden.
- mit vielen anderen Möglichkeiten.
Der nächste Schritt wäre bekommen Ihr DLL-Code tatsächlich auszuführen. Aber wenn Sie sinnvoll, etwas tun wollen, wird dies schwierig sein - Sie müssen wissen, was der Prozess der Fall ist, welche Datenstrukturen verwendet es, etc., so werden Sie höchstwahrscheinlich es zerlegen müssen.
- Sie können einen neuen Thread im Zielprozess erstellen eine Funktion aus der DLL aufzurufen. Suspend die vorhandenen Threads zuerst Ihre geistige Gesundheit zu bewahren und funky Multithreading Fehler zu vermeiden.
- Wenn Sie eine bekannte DLL mit Ihrem eigenen ersetzt, wird der Prozess erwartet, dass Ihre DLL auf bestimmte Funktionsaufrufe reagieren - Sie besser wissen, was diese Funktionen und dessen Ersatz in der DLL bereitzustellen.
- Wenn Sie die ausführbare Datei rufen Sie Ihre DLL zusätzlich zu bekannten DLLs geändert. Sie hatte die ausführbare auseinander bereits zu nehmen. Nun gehen Sie einige interessante Orte finden, und legen Sie Anrufe an Ihre DLL-Funktionen gibt. Siehe Code Höhle.
Ich habe Injektion durchgeführt DLL durch den Zielprozess als Debuggee-Prozess startet, einige Bytes in seinem Startcode mit einer benutzerdefinierten Codesequenz zu überschreiben, die Loadlibrary ( „mydll.dll“) nennt; GetProcAddress (MyLib "myFunc") ;. und einen Code in den ausführbaren Umschreiben statt auf Funktionen in der DLL zu springen.
Mit dieser Methode ein paar Freunde und ich schrieb eine ziemlich große inoffizielle Bugfix / Erweiterung DLL für Command - Conquer: Red Alert 2 - heute, dass DLL etwa 15% ausführbare die Größe des ursprünglichen Spiels ist. Als Ergebnis wurde später offizieller Updates des Spiels beschränkt auf nur Dinge ihre Mitarbeiter ohne Neukompilierung die binären tun könnten, was untypisch nett von EA war.
beantwortet 14 '13 Juni um 16:02 Uhr