ส่วนขยายผู้ส่งออกไฟล์วัตถุสำหรับ Ghidra
ส่วนขยาย Ghidra นี้ช่วยให้สามารถส่งออกบางส่วนของโปรแกรมเป็นไฟล์อ็อบเจ็กต์ได้ ไฟล์อ็อบเจ็กต์เหล่านี้มีข้อมูลเมตาที่ถูกต้อง (สัญลักษณ์ ตารางการย้ายตำแหน่ง…) และด้วยเหตุนี้จึงสามารถนำกลับมาใช้ใหม่ได้โดยตรงโดย toolchain เพื่อการประมวลผลต่อไป
กรณีการใช้งานได้แก่:
- การแพตช์ไบนารีขั้นสูง โดยใช้ประโยชน์จากตัวเชื่อมโยงเพื่อซ่อมทั้งชิ้นส่วนดั้งเดิมและชิ้นส่วนที่แก้ไขร่วมกัน แทนที่จะทำงานนี้ด้วยมือ
- พอร์ตซอฟต์แวร์ โดยการแยกโค้ดที่ไม่ขึ้นอยู่กับระบบออกจากโปรแกรมและแทนที่ส่วนที่เหลือ
- การแปลงโปรแกรมหรือไฟล์ออบเจ็กต์จากรูปแบบไฟล์หนึ่งไปเป็นอีกรูปแบบหนึ่ง
- การสร้างไลบรารี่โดยการแยกส่วนของโปรแกรมและนำกลับมาใช้ใหม่ในบริบทอื่น
- โครงการแยกส่วนโดยการแบ่งโปรแกรมออกเป็นไฟล์อ็อบเจ็กต์หลายไฟล์และปรับใช้ Ship of Theseus -style เหล่านี้ใหม่
- -
เมทริกซ์ของสถาปัตยกรรมชุดคำสั่งที่รองรับและไฟล์อ็อบเจ็กต์:
| x86 | เอ็มไอพีเอส |
---|
คอฟ | | |
เอลฟ์ | | |
อาคาร (CLI)
- โคลนพื้นที่เก็บข้อมูลนี้
- กำหนดตัวแปรสภาพแวดล้อม
GHIDRA_INSTALL_DIR
เพื่อชี้ไปยังไดเร็กทอรีการติดตั้ง Ghidra ของคุณ - เรียกใช้
gradle buildExtension
ไฟล์เก็บถาวรส่วนขยาย Ghidra จะถูกสร้างขึ้นภายในไดเร็กทอรี dist/
การติดตั้ง
- ดาวน์โหลดส่วนขยายจากหน้าเผยแพร่หรือสร้างในเครื่อง
- ติดตั้งส่วนขยายในอินสแตนซ์ Ghidra ของคุณด้วย
File > Install Extensions…
; - เปิดใช้งานปลั๊กอิน
RelocationTableSynthesizedPlugin
ด้วย File > Configure
ภายในหน้าต่าง CodeBrowser
การใช้งาน
- เลือกชุดที่อยู่ในมุมมองรายการ
- เรียกใช้ตัววิเคราะห์
Relocation table synthesizer
(พร้อมใช้งานในโหมดช็อตเดียว) ; - เรียกใช้ผู้ส่งออกไฟล์อ็อบเจ็กต์ที่ย้ายตำแหน่งได้ด้วย
File > Export Program…
สามารถดูการย้ายตำแหน่งที่สร้างขึ้นใหม่ได้ด้วย Window > Relocation table (synthesized)
- เครื่องวิเคราะห์ ซินธิไซเซอร์ตารางการย้าย ตำแหน่งอาศัยฐานข้อมูล Ghidra ที่มีประชากรครบถ้วน (พร้อมสัญลักษณ์ ประเภทข้อมูล และการอ้างอิงที่ประกาศอย่างถูกต้อง) เพื่อให้ทำงานได้ ข้อมูลที่ไม่ถูกต้องหรือขาดหายไปอาจนำไปสู่การย้ายตำแหน่งที่เสียหายหรือไม่พบ ในระหว่างการวิเคราะห์
- ผู้ส่งออกไฟล์อ็อบเจ็กต์อาศัยผลลัพธ์ของตัววิเคราะห์ซิน ธิไซเซอร์ตารางการย้ายตำแหน่ง เพื่อให้ทำงาน หากมีข้อสงสัย ให้เรียกใช้ตัววิเคราะห์นี้ก่อนส่งออกไฟล์อ็อบเจ็กต์ เพื่อให้แน่ใจว่าเนื้อหาตารางการย้ายตำแหน่งเป็นข้อมูลล่าสุดด้วยสถานะปัจจุบันของโปรแกรม
มันทำงานอย่างไร?
ไฟล์อ็อบเจ็กต์ประกอบด้วยสามส่วน:
- ไบต์ของส่วนที่ย้ายตำแหน่งได้ ;
- ตารางสัญลักษณ์ ;
- ตารางการย้ายถิ่นฐาน
เมื่อลิงเกอร์ถูกเรียกใช้เพื่อสร้างไฟล์ปฏิบัติการจากไฟล์อ็อบเจ็กต์จำนวนมาก มันจะ:
- จัดวางส่วนต่างๆ ในหน่วยความจำ ;
- คำนวณที่อยู่ของสัญลักษณ์ในพื้นที่ที่อยู่เสมือน
- ใช้การย้ายตำแหน่งตามที่อยู่สุดท้ายของสัญลักษณ์บนไบต์ของส่วน
โดยปกติแล้ว ตารางการย้ายตำแหน่งจะถูกละทิ้งหลังจากกระบวนการนี้ เช่นเดียวกับตารางสัญลักษณ์ ถ้าไม่ได้เก็บสัญลักษณ์การดีบักไว้ เหลือเพียงไบต์ของส่วนที่ไม่สามารถย้ายตำแหน่งได้ อย่างไรก็ตาม ด้วยการวิเคราะห์อย่างรอบคอบ ข้อมูลนี้จึงสามารถสร้างขึ้นใหม่ได้ ซึ่งช่วยให้เราสามารถ ยกเลิกการเชื่อมโยง โปรแกรมกลับเข้าไปในไฟล์อ็อบเจ็กต์ได้อย่างมีประสิทธิภาพ