該工具將掃描可執行文件中的Delphi數據,包括RTTI和虛擬功能表。它輸出一個帶有有關已識別類和功能的信息的JSON文件,例如:
提供一個可以將輸出加載到IDA的IDAPYTHON腳本。
該腳本的編寫是為了補充其他用於反向工程Delphi的工具。
NCC Group plc -http://www.nccgroup.com/發行作為開源。
由David Cannings(@edeca)開發[email protected]
http://www.github.com/nccgroup/pythia
該項目根據AGPL許可發布。請參閱許可證以獲取更多信息。
高水平流量是:
Delphi Vftables有充分的記錄。最新版本的信息可從Embarcadero獲得。 Delphi 2005可以使用非官方文檔(請參閱此處)。
免費pascal的源代碼也很有用(github鏡像)。
Vftable中的第一項是vmtSelfPtr ,指向虛擬函數表的開始。腳本將PE文件中的每個代碼段掃描,以指向前方的任何位置+0x4C字節。請注意,Delphi編譯器將VFTABLE對準4個字節邊界(用於優化)。
例如,以下VA 0x0046E1C8包含偏移0x0046E214 ,即比當前位置前0x4C 。如IDA所示:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
此方法可以產生誤報,因此,檢查VFTABLE中的其他字段是否有明智的值。例如,檢查vmtInstanceSize ,以確保它不會過多,並且功能指針被驗證為可執行的部分。在測試期間,儘管使用了蠻力搜索方法,在測試假陽性率很低。
檢查Vftable中發現的每個函數,以查看其是否從父遺傳或過載中繼承。 Delphi不支持多個繼承,因此可以通過檢查父vftable中的指針與相同偏移量來實現這一目標。
如果兩個指針都將其繼承的相同函數引用。如果孩子有不同的指針,那麼它已被超載。
該工具的主要輸出是一個JSON文件,可以將其輸入後續處理 /工具中。但是,還包括其他一些輸出格式。
使用--save-tree選項生成類似的文件:
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或DVCLAL資源),並對不同的Vftable佈局進行調整。call [ecx+3Fh]與實例方法)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>>等名稱,在IDA中相當難以理解。請給我發送該工具不起作用的二進製文件的示例,以便對其進行改進。