このツールは、RTTIや仮想関数テーブルを含むDelphiデータの実行可能ファイルをスキャンします。識別されたクラスと関数に関する情報を含むJSONファイルを出力します。これは、追加の分析に使用できます。
出力をIDAにロードできるiDapythonスクリプトが提供されます。
このスクリプトは、リバースエンジニアリングデルフィの他のツールを補完するために書かれています。
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 Mirror)。
VFTABLEの最初の項目はvmtSelfPtrで、仮想関数テーブルの開始を指します。スクリプトは、PEファイルの各コードセグメントを、フォワード+0x4Cバイトを指す任意の場所をスキャンします。 Delphiコンパイラは、vftablesを4バイトの境界に並べることに注意してください(最適化のため)。
たとえば、次のVA 0x0046E1C8には、現在の場所よりも0x4Cのオフセット0x0046E214が含まれています。 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>>などの名前を使用しています。このツールが機能しないバイナリの例を送ってください。そうすれば、改善できます。