เครื่องมือนี้สแกนไฟล์ที่เรียกใช้งานได้สำหรับข้อมูล Delphi รวมถึงตารางฟังก์ชัน RTTI และเสมือน มันส่งออกไฟล์ JSON พร้อมข้อมูลเกี่ยวกับคลาสและฟังก์ชั่นที่ระบุซึ่งสามารถใช้สำหรับการวิเคราะห์เพิ่มเติมได้เช่น:
สคริปต์ Idapython ที่สามารถโหลดเอาต์พุตลงใน IDA ได้
สคริปต์ถูกเขียนขึ้นเพื่อเสริมเครื่องมืออื่น ๆ สำหรับ 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 Mirror)
รายการแรกใน vftable คือ vmtSelfPtr ซึ่งชี้ไปที่จุดเริ่มต้นของตารางฟังก์ชั่นเสมือนจริง สคริปต์สแกนแต่ละส่วนโค้ดในไฟล์ PE สำหรับตำแหน่งใด ๆ ที่ชี้ไปข้างหน้า +0x4C ไบต์ โปรดทราบว่าคอมไพเลอร์ Delphi จัดตำแหน่ง Vftables ให้เป็นขอบเขต 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โปรดส่งตัวอย่างไบนารีที่เครื่องมือนี้ใช้งานไม่ได้ดังนั้นจึงสามารถปรับปรุงได้