
Ein Plugin, um interaktive Symbole von Ihrem Dekompiler in Ihren Debugger einzuführen.
Reverse Engineering umfasst sowohl statische (Decompiler) als auch dynamische (Debugger) Analyse, dennoch werden diese Analysen oft verwendet, ohne Wissen zwischen beiden auszutauschen. Beim Reversen statischer Binärdateien kann das Wechseln zwischen Debugger-Assembly und den Symbolen, die man in der Dekompilierung wiederhergestellt hat, ineffizient sein.
decomp2dbg zielt darauf ab, die Lücke des Kontextwechsels zwischen Decompiler und Debugger zu verkleinern, indem eine generische API zur Synchronisation von Decompiler-zu-Debugger-Symbolen eingeführt wird. Im Effekt gibt dies dem Reverser die Leistungsfähigkeit seines Debuggers mit den Symbolen und Dekompilierungszeilen, die er in seinem Decompiler wiederhergestellt hat.

Interessiert zu sehen, wie decomp2dbg in der Praxis aussieht? Schauen Sie sich den aufgezeichneten Vortrag auf der CactusCon 2023 an, der das Debuggen einer fernen arm32-Binärdatei von einer x64-Maschine mit Ghidra-Symbolen zeigt.
Für aktive Hilfe treten Sie dem untenstehenden BinSync-Discord bei, wo wir decomp2dbg-Fragen beantworten:
Installation über pip, dann den integrierten Installer für Decompiler verwenden:
pip3 install decomp2dbg && decomp2dbg --install
Dies öffnet eine Eingabeaufforderung, in der Sie nach dem Pfad zu Ihrem Decompiler und Debugger Ihrer Wahl gefragt werden. Für Ghidra müssen Sie im PyGhidra-Modus starten und das Plugin (d2d_client.py) aktivieren, wie hier gezeigt. Wenn Sie die Decompiler-Seite im Binja-Plugin-Manager installiert haben, müssen Sie dennoch die Debugger-Seite mit dem obigen Befehl installieren. Hinweis: Sie müssen decomp2dbg in derselben Python-Umgebung wie Ihren Decompiler und Debugger installieren.
Hinweis: Möglicherweise müssen Sie eingehende Verbindungen auf Port 3662 (oder dem von Ihnen verwendeten Port) zulassen, damit decomp2dbg eine Verbindung zum Decompiler herstellen kann. Wenn Sie decomp2dbg mit GEF oder pwndbg installieren, ist es wichtig, dass in Ihrer ~/.gdbinit die d2d.py-Datei nach GEF oder pwndbg eingebunden wird.
Überspringen Sie diesen Abschnitt, wenn Sie die obige Installation fehlerfrei durchführen konnten. Falls Sie das obige integrierte Skript nicht verwenden können (z. B. bei einer Nicht-WSL-Windows-Installation für den Decompiler), befolgen Sie die folgenden Schritte:
Wenn Sie nur die Decompiler-Seite benötigen, kopieren Sie das entsprechende Decompiler-Plugin in den Plugin-Ordner des Decompilers. So geht es in IDA:
Klonen Sie zunächst das Repository:
git clone https://github.com/mahaloz/decomp2dbg.git
Installieren:
pip install .
Kopieren Sie alle Serverdateien:
cp ./decomp2dbg/d2d_server.py /path/to/ida/plugins/
Wenn Sie auch die gdb-Seite installieren müssen, verwenden Sie die folgende Zeile:
cp ./decomp2dbg/d2d_client.py ~/.d2d.py && echo "source ~/.d2d.py" >> ~/.gdbinit
Starten Sie zunächst den Dekompilierungsserver in Ihrem Decompiler. Möglicherweise möchten Sie warten, bis Ihr Decompiler seine normale Analyse abgeschlossen hat, bevor Sie ihn starten. Nach der normalen Analyse kann dies mit dem Hotkey Ctrl-Shift-D oder durch Auswahl des Tabs decomp2dbg: configure im entsprechenden Plugin-Reiter erfolgen. Nach dem Start des Servers sollte eine Meldung in Ihrem Decompiler erscheinen:
[+] Starting XMLRPC server: localhost:3662
[+] Registered decompilation server!
Führen Sie als Nächstes in Ihrem Debugger aus:
decompiler connect <decompiler_name>
Wenn Sie den Decompiler auf einer VM oder einem anderen Rechner ausführen, können Sie optional den Host und Port für die Verbindung angeben. Hier ist ein Beispiel:
decompiler connect ida --host 10.211.55.2 --port 3662
Sie können herausfinden, wie Sie alle Befehle verwenden, indem Sie den decompiler-Befehl mit dem Flag --help ausführen.
Die erste Verbindung kann je nach Anzahl der globalen Variablen in der Binärdatei bis zu 30 Sekunden dauern. Wenn alles gut läuft, sollten Sie sehen:
[+] Connected to decompiler!
Wenn Sie decomp2dbg für eine Bibliothek verwenden, d. h. die Hauptbinärdatei, an die Ihr Debugger angeschlossen ist, nicht die Binärdatei ist, für die Sie Quellcode möchten, dann sollten Sie sich den Abschnitt Erweiterte Nutzung - Shared Libraries dieser README ansehen.
Bei jedem Breakpoint-Ereignis wird nun die Dekompilierung ausgegeben und die Zeile, auf der Sie sich befinden, mit der Break-Adresse verknüpft.
Funktionen und globale Variablen aus Ihrer Dekompilierung werden nun wie normale Source-Level-Symbole in Ihr GDB eingebunden. Dies bedeutet, dass normale GDB-Befehle wie print und x nativ funktionieren:
b sub_46340
x/10i sub_46340
p dword_267A2C
x dword_267A2C
Einige Variablen, die lokal in einer Funktion gespeichert sind, sind Stack-Variablen. Für die Variablen, die auf den Stack oder Register abgebildet werden können, importieren wir sie als Convenience-Variablen. Sie können deren Inhalt wie eine normale GDB-Convenience-Variable anzeigen:
p $v4
Stack-Variablen speichern immer ihre Adresse auf dem Stack. Um den tatsächlichen Wert in dieser Stack-Variable zu sehen, dereferenzieren Sie einfach die Variable:
x $v4
Dies funktioniert auch mit Funktionsargumenten, falls zutreffend (Ergebnisse können variieren):
p $a1
Hinweis: $v4 wird in diesem Fall nur so lange zugeordnet, wie Sie sich in derselben Funktion befinden. Sobald Sie die Funktion verlassen, kann sie aufgehoben oder einem anderen Wert zugeordnet werden.
Wenn die Dekompilierung (und Symbole) für einen Speicherbereich angezeigt werden sollen, der nicht die Hauptbinärdatei ist, z. B. beim Debuggen einer Shared Library, müssen Sie einige zusätzliche Schritte durchführen. Derzeit unterstützt d2d nur einen gleichzeitig verbundenen Decompiler. Das bedeutet, wenn Sie derzeit einen Decompiler verbunden haben, der nicht die Bibliothek ist, müssen Sie die Verbindung trennen.
Befolgen Sie die normale Einrichtung, um Ihren Decompiler mit dem d2d-Server für Ihre Shared Library zu starten. Danach müssen Sie die Basisadresse dieser Bibliothek und ihre Endadresse manuell festlegen:
decompiler connect ida --base-addr-start 0x00007ffff7452000 --base-addr-end 0x00007ffff766d000
Um die Basisadresse zu finden, unter der Ihre Bibliothek im Speicher geladen ist, wird empfohlen, einen Befehl wie vmmap von GEF zu verwenden, um nach dem Namen der Bibliothek im Speicherbereich zu suchen. Nach der Verbindung mit dieser manuell festgelegten Adresse funktionieren Symbole wie bei normalem d2d. Die Dekompilierung wird nur auf dem Bildschirm ausgegeben, wenn Sie sich im Bereich dieses Adressraums befinden.