
ปลั๊กอิน Ghidra รุ่นทดลองนี้ช่วยให้คุณสามารถจัดการกับการจำลอง pcode ดั้งเดิมได้อย่างง่ายดาย ไม่จำเป็นต้องใช้สคริปต์อีกต่อไป เพียงใช้โดยตรงจาก Ghidra มีประโยชน์อย่างยิ่งสำหรับการทำงานกับโปรเซสเซอร์แปลกใหม่หลายตัวที่อีมูเลเตอร์ทั่วไปไม่รองรับ
หาก Ghidra รองรับโปรเซสเซอร์/vm สำหรับวิศวกรรมย้อนกลับ ก็สามารถจำลองได้! ตัวอย่างเช่น การจำลองคำสั่ง eBPF จะแสดงไว้ด้านล่าง:

โดยพื้นฐานแล้ว ปลั๊กอินเป็นส่วนขยายเพิ่มเติมรอบๆ คลาสภายในแพ็คเกจ ghidra.app.emulator นี่คือสิ่งที่ได้ดำเนินการไปแล้ว:
แม้ว่าการจำลอง PCode จะสื่อถึงการรวมเป็นหนึ่งเดียว แต่โปรเซสเซอร์ส่วนใหญ่จำเป็นต้องมีแนวทางของตนเอง รู้สึกอิสระที่จะรายงานปัญหาใด ๆ ที่คุณพบ ฉันต้องการทดสอบโปรเซสเซอร์ทั้งหมดจริงๆ แต่แทบจะเป็นไปไม่ได้เลย

ประกอบด้วยหน้าต่างปลั๊กอินทั้งหมด: มุมมองสแต็ก, รีจิสเตอร์, มุมมองเบรกพอยต์ และหน้าต่างหลัก

ประกอบด้วยปุ่มลัดสำหรับการตั้งค่าจุดเริ่มต้นและจุดสิ้นสุดของการจำลอง เบรกพอยต์ และการใช้ไบต์ที่เปลี่ยนแปลงไปในสถานะโปรแกรมจำลอง

เปลี่ยนทะเบียนตามที่คุณต้องการ การตั้งค่าลิงค์รีจิสเตอร์ (ลูกศรสีเขียว) จะช่วยให้โปรแกรมจำลองเข้าใจว่ารีจิสเตอร์ใดมีที่อยู่ผู้ส่ง ปลั๊กอินรู้วิธีการทำงานผ่านสแต็ก, lr register, AARCH64 และ MIPS register หากคุณมีของแปลกใหม่ให้เลือกลิงค์ ลงทะเบียน แล้วกดปุ่ม

เมื่อคุณเปิดโปรแกรมของคุณใน СodeBrowser GhidraEmu จะแมปพื้นที่สแต็กโดยอัตโนมัติ ตัวชี้สแต็กจะถูกตั้งค่าไว้ตรงกลางของช่วงสแต็ก ซึ่งจะทำให้คุณสามารถตั้งค่าที่ด้านบนหรือด้านล่างของเฟรมสแต็กได้ เลื่อนไปหากคุณประสบปัญหาค้างขณะอัปเดตหรือรีเซ็ต ในระหว่างกระบวนการจำลอง หากโปรแกรมต้องการพื้นที่เพิ่มสำหรับสแต็ก ปลั๊กอินจะจัดสรรให้โดยอัตโนมัติ


หากไบต์ใดๆ เปลี่ยนแปลงระหว่างการจำลอง คุณจะเห็นไบต์เหล่านั้นใน ByteViewer แบบคลาสสิก ไม่ต้องกังวล ค่าเหล่านั้นจะถูกรีเซ็ตเป็นค่าเดิมหลังจากกดปุ่ม "รีเซ็ต"

หากคุณทำการเปลี่ยนแปลง ให้แจ้งให้โปรแกรมจำลองทราบเกี่ยวกับไบต์ที่เปลี่ยนแปลง (สแต็กการอัปเดตโดยอัตโนมัติ - ไม่จำเป็นต้องใช้) หลังจากเปลี่ยนแล้ว ให้เลือก (จะเป็นสีเขียว) แล้วกดตัวเลือกนี้ (หรือใช้ปุ่มลัด "M")

ที่นี่ปลั๊กอินจะพิมพ์ข้อมูลเอาต์พุต ตัวอย่างเช่น ข้อความแสดงข้อผิดพลาดการจำลองดังนี้:

คุณลักษณะ "ข้าม" ช่วยให้คุณสามารถข้ามไปข้างหน้าหนึ่งคำสั่งได้ หากคุณไม่ต้องการเลียนแบบคำสั่งปัจจุบันด้วยเหตุผลบางประการ เนื่องจากกระบวนการจำลองจะถูกยกเลิกหากตรวจพบความพยายามที่จะอ่านหน่วยความจำที่ไม่ได้เตรียมใช้งาน คุณลักษณะนี้จึงช่วยให้คุณสามารถข้ามไปได้ ดูตัวอย่าง นี่คือหนึ่งในคำแนะนำแรกๆ ในโปรแกรม x86_64 หลายโปรแกรม การบันทึก canary stack:
MOV RAX, qword ptr FS:[0x28]
เราจะพยายามโกงนิดหน่อยแล้วข้ามไปโดยการเพิ่มมูลค่าพีซี หากต้องการทำสิ่งนี้ ให้หยุดที่คำสั่งที่คุณไม่ต้องการเลียนแบบแล้วกดปุ่มลัด J มิฉะนั้น การก้าวต่อไปอาจส่งผลให้เกิดข้อผิดพลาดในการอ่านหน่วยความจำที่ไม่ได้เตรียมใช้งาน

หากคุณหยุดที่คำสั่งที่นำไปสู่รูทีนย่อย (การโทรภายใน) และคุณต้องการจำลองทุกอย่างจนถึงคำสั่งถัดไป (แบบคลาสสิก "ก้าวข้าม") ให้กดปุ่มลัด F6 และมันจะเกิดขึ้นอย่างแน่นอน:

ประเด็นสำคัญบางประการที่ควรพิจารณา :
ใช้ gradle เพื่อสร้างส่วนขยาย: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle และใช้ Ghidra เพื่อติดตั้ง: File → Install Extensions...
ใน CodeBrowser ไปที่ File → Configure → Miscellaneous และเลือกช่องทำเครื่องหมายสำหรับปลั๊กอิน GhidraEmu
พบข้อบกพร่องขณะใช้ปลั๊กอินหรือมีแนวคิดในการปรับปรุงหรือไม่ อย่าอายที่จะเปิดประเด็นใหม่ แล้วฉันจะเข้าใจ
ข้อจำกัดของ EmulatorHelper ไม่อนุญาตให้ใช้พื้นที่โปรแกรมในอีกที่หนึ่ง ดังนั้นไลบรารีที่ใช้ร่วมกันภายนอกของคุณจะไม่มีทางรู้เกี่ยวกับพื้นที่หน่วยความจำของโปรแกรมและในทางกลับกัน ดังนั้นคุณจึงไม่สามารถจำลองมันเป็นกระบวนการเดียวกับพื้นที่หน่วยความจำเดียวได้ แจ้งให้เราทราบหากฉันขาดอะไรบางอย่างที่นี่