Alat ini memindai file yang dapat dieksekusi untuk data Delphi, termasuk RTTI dan tabel fungsi virtual. Ini menghasilkan file JSON dengan informasi tentang kelas dan fungsi yang diidentifikasi, yang dapat digunakan untuk analisis tambahan, misalnya:
Skrip Idapython yang dapat memuat output ke IDA disediakan.
Script ditulis untuk melengkapi alat lain untuk Reverse Engineering Delphi.
Dirilis sebagai Open Source oleh NCC Group PLC - http://www.nccgroup.com/
Dikembangkan oleh David Cannings (@Edeca) [email protected]
http://www.github.com/nccgroup/pythia
Proyek ini dirilis di bawah lisensi AGPL. Silakan lihat lisensi untuk informasi lebih lanjut.
Aliran level tinggi adalah:
Delphi Vftables didokumentasikan dengan baik. Informasi untuk versi terbaru tersedia dari Embarcadero. Dokumentasi tidak resmi tersedia untuk Delphi 2005 (lihat di sini).
Kode sumber untuk Pascal gratis juga berguna (Github Mirror).
Item pertama dalam vftable adalah vmtSelfPtr , yang menunjuk ke awal tabel fungsi virtual. Script memindai setiap segmen kode dalam file PE untuk setiap lokasi yang menunjuk ke depan +0x4C byte. Perhatikan bahwa kompiler Delphi menyelaraskan vftable ke batas 4 byte (untuk optimasi).
Misalnya, VA 0x0046E1C8 berikut ini berisi offset 0x0046E214 , yang 0x4C di depan lokasi saat ini. Seperti yang ditunjukkan di Ida:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
Pendekatan ini dapat menghasilkan positif palsu, oleh karena itu bidang lain dalam VFTable diperiksa untuk nilai -nilai yang masuk akal. Misalnya vmtInstanceSize diperiksa untuk memastikan tidak berlebihan dan pointer fungsi diverifikasi untuk terletak di bagian yang dapat dieksekusi. Selama pengujian tingkat positif palsu sangat rendah, meskipun metode pencarian gaya brute.
Setiap fungsi yang ditemukan dalam vftable diperiksa untuk melihat apakah diwarisi dari induk atau kelebihan beban. Delphi tidak mendukung warisan berganda sehingga ini dapat dicapai dengan memeriksa pointer di induk vftable dengan offset yang sama.
Jika kedua pointer merujuk fungsi yang sama, ia diwarisi. Jika anak memiliki pointer yang berbeda maka itu telah kelebihan beban.
Output utama dari alat ini adalah file JSON yang dapat dimasukkan ke dalam pemrosesan / alat berikutnya. Namun, beberapa format output lainnya disertakan.
Gunakan opsi --save-tree untuk menghasilkan file seperti:
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 atau sumber daya DVCLAL ) dan sesuaikan pemindaian untuk tata letak VFTable yang berbeda.call [ecx+3Fh] ke metode instance)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>> yang cukup tidak dapat diuraikan di IDA.Tolong kirimkan saya contoh binari di mana alat ini tidak berfungsi, sehingga dapat ditingkatkan.