Dieses Tool scannt eine ausführbare Datei für Delphi -Daten, einschließlich RTTI- und virtueller Funktionstabellen. Es gibt eine JSON -Datei mit Informationen zu identifizierten Klassen und Funktionen aus, die für die zusätzliche Analyse verwendet werden können, beispielsweise:
Ein Idapython -Skript, das die Ausgabe in IDA laden kann, wird bereitgestellt.
Das Skript wurde geschrieben, um andere Tools für Reverse Engineering Delphi zu ergänzen.
Veröffentlicht als Open Source 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 unter Lizenz.
Der hohe Niveaustrom ist:
Delphi Vftables sind gut dokumentiert. Informationen für die neueste Version finden Sie bei Embarcadero. Inoffizielle Dokumentationen finden Sie für Delphi 2005 (siehe hier).
Der Quellcode für kostenlose Pascal ist ebenfalls nützlich (Github Mirror).
Das erste Element in einem vftablen ist vmtSelfPtr , das auf den Beginn der virtuellen Funktionstabelle hinweist. Das Skript scannt jedes Codesegment in der PE -Datei für einen beliebigen Speicherort, der nach vorne +0x4C -Bytes zeigt. Beachten Sie, dass der Delphi -Compiler Vftables an einer 4 -Byte -Grenze ausrichtet (zur Optimierung).
Beispielsweise enthält der folgende VA 0x0046E1C8 den Offset 0x0046E214 , der 0x4C vor dem aktuellen Standort ist. 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 falsch positive Ergebnisse erzeugen, daher werden andere Felder im vftablen auf vernünftige Werte überprüft. Beispielsweise wird die vmtInstanceSize geprüft, um sicherzustellen, dass es nicht übermäßig ist und Funktionszeiger in einem ausführbaren Abschnitt überprüft werden. Während des Testens war die falsch positive Rate trotz der Brute -Force -Suchmethode sehr niedrig.
Jede in einem VFTable gefundene Funktion wird überprüft, um festzustellen, ob sie vom übergeordneten oder überlasteten geerbt wird. Delphi unterstützt nicht mehrfache Vererbung, daher kann dies erreicht werden, indem der Zeiger im übergeordneten vftable mit demselben Versatz prüft.
Wenn beide Zeiger auf die gleiche Funktion verweisen, wird sie vermittelt. Wenn das Kind einen anderen Zeiger hat, wurde es überladen.
Die primäre Ausgabe des Tools ist eine JSON -Datei, die in nachfolgende Verarbeitungs- / Tools eingespeist werden kann. Einige andere Ausgangsformate sind jedoch enthalten.
Verwenden Sie die Option --save-tree Option, um eine Datei wie:
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 passen Sie das Scannen für verschiedene vftbare Layouts an.call [ecx+3Fh] an eine Instanzmethode)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>> , die in IDA ziemlich unentschlossen werden.Bitte senden Sie mir Beispiele für Binärdateien, bei denen dieses Tool nicht funktioniert, sodass es verbessert werden kann.