ปลั๊กอิน 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 ไม่อนุญาตให้ใช้พื้นที่โปรแกรมในอีกที่หนึ่ง ดังนั้นไลบรารีที่ใช้ร่วมกันภายนอกของคุณจะไม่มีทางรู้เกี่ยวกับพื้นที่หน่วยความจำของโปรแกรมและในทางกลับกัน ดังนั้นคุณจึงไม่สามารถจำลองมันเป็นกระบวนการเดียวกับพื้นที่หน่วยความจำเดียวได้ แจ้งให้เราทราบหากฉันขาดอะไรบางอย่างที่นี่