
Ein Werkzeug zum Extrahieren von RTTI-Informationen aus Delphi-Executables, geschrieben in reinem Python.
Dieses Tool durchsucht eine ausführbare Datei nach Delphi-Daten, einschließlich RTTI und virtuellen Funktionstabellen. Es gibt eine JSON-Datei mit Informationen über identifizierte Klassen und Funktionen aus, die für weitere Analysen verwendet werden kann, zum Beispiel:
Ein IDAPython-Skript, das die Ausgabe in IDA laden kann, wird bereitgestellt.
Das Skript wurde geschrieben, um andere Werkzeuge zum Reverse Engineering von Delphi zu ergänzen.
Als Open Source veröffentlicht von NCC Group Plc - http://www.nccgroup.com/
Entwickelt von David Cannings (@edeca) [email protected]
http://www.github.com/nccgroup/pythia
Dieses Projekt wird unter der AGPL-Lizenz veröffentlicht. Weitere Informationen finden Sie in der Datei LICENSE.
Der Ablauf auf hoher Ebene ist:
Delphi-vftables sind gut dokumentiert. Informationen für die neueste Version sind verfügbar von Embarcadero. Inoffizielle Dokumentation ist für Delphi 2005 verfügbar (siehe hier).
Der Quellcode von Free Pascal ist ebenfalls nützlich (GitHub-Mirror).
Das erste Element in einer vftable ist vmtSelfPtr, das auf den Anfang der virtuellen Funktionstabelle zeigt. Das Skript scannt jedes Code-Segment in der PE-Datei nach einer Stelle, die +0x4C Bytes vorwärts zeigt. Beachten Sie, dass der Delphi-Compiler vftables an einer 4-Byte-Grenze ausrichtet (zur Optimierung).
Zum Beispiel enthält die folgende VA 0x0046E1C8 den Offset 0x0046E214, der 0x4C Bytes voraus liegt. Wie in IDA gezeigt:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
Dieser Ansatz kann False Positives erzeugen, daher werden andere Felder in der vftable auf plausible Werte geprüft. Zum Beispiel wird vmtInstanceSize geprüft, um sicherzustellen, dass es nicht übermäßig groß ist, und es wird verifiziert, dass Funktionszeiger in einem ausführbaren Abschnitt liegen. Während der Tests war die False-Positive-Rate trotz der Brute-Force-Suchmethode sehr niedrig.
Jede in einer vftable gefundene Funktion wird daraufhin geprüft, ob sie von der Elternklasse geerbt oder überladen wurde. Delphi unterstützt keine Mehrfachvererbung, daher kann dies erreicht werden, indem der Zeiger in der vftable der Elternklasse mit dem gleichen Offset geprüft wird.
Wenn beide Zeiger auf dieselbe Funktion verweisen, wurde sie geerbt. Wenn das Kind einen anderen Zeiger hat, wurde sie überladen.
Die primäre Ausgabe des Tools ist eine JSON-Datei, die in nachfolgende Verarbeitungen / Werkzeuge eingespeist werden kann. Es sind jedoch einige weitere Ausgabeformate enthalten.
Verwenden Sie die Option --save-tree, um eine Datei wie die folgende zu erzeugen:
TObject (at 0x0040112c)
|-- Exception (at 0x004081f8)
| |-- EAbort (at 0x00408260)
| |-- EAbstractError (at 0x00408ad4)
| |-- EAssertionFailed (at 0x00408a74)
| |-- EBcdException (at 0x004bd110)
| | +-- EBcdOverflowException (at 0x004bd16c)
| |-- EBitsError (at 0x0041ab04)
| |-- EComponentError (at 0x0041abbc)
| |-- EConvertError (at 0x00408850)
| |-- EDCP_cipher (at 0x0046a0ac)
| | +-- EDCP_blockcipher (at 0x0046a29c)
| |-- EDCP_hash (at 0x00469f20)
.. etc ..
PACKAGEINFO- oder DVCLAL-Ressource) und passe das Scannen an verschiedene vftable-Layouts an.vmtTypeInfo in der vftable)call [ecx+3Fh] einer Instanzmethode zuordnen)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>>, die in IDA ziemlich unentzifferbar sind.Bitte senden Sie mir Beispiele von Binärdateien, bei denen dieses Tool nicht funktioniert, damit es verbessert werden kann.