
このツールは、実行可能ファイルをスキャンして、RTTIや仮想関数テーブルなどのDelphiデータを探します。特定されたクラスと関数に関する情報を含むJSONファイルを出力し、追加の分析に使用できます。例えば次のような用途です:
出力をIDAに読み込むことができるIDAPythonスクリプトが提供されています。
このスクリプトは、Delphiのリバースエンジニアリング用の他のツールを補完するために作成されました。
NCC Group Plc によりオープンソースとして公開 - http://www.nccgroup.com/
開発者: David Cannings (@edeca) [email protected]
http://www.github.com/nccgroup/pythia
このプロジェクトはAGPLライセンスの下で公開されています。詳細はLICENSEを参照してください。
大まかな流れは以下の通りです:
Delphiのvftableは十分に文書化されています。最新バージョンの情報はEmbarcaderoから入手できます。非公式のドキュメントはDelphi 2005向けにあります(こちらを参照)。
Free 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ではかなり解読が困難です。このツールが機能しないバイナリの例を送ってください。改善に役立てます。