Plugin Ghidra eksperimental ini memungkinkan Anda menangani emulasi pcode asli dengan mudah. Tidak diperlukan script lagi, cukup gunakan langsung dari Ghidra. Ini bisa sangat berguna untuk bekerja dengan berbagai prosesor eksotik yang tidak didukung oleh emulator umum.
Jika prosesor/vm didukung oleh Ghidra untuk rekayasa balik, maka dapat ditiru! Misalnya, emulasi instruksi eBPF ditunjukkan di bawah ini:
Intinya, plugin ini merupakan pembungkus yang diperluas di sekitar kelas-kelas di dalam paket ghidra.app.emulator
. Inilah yang telah diterapkan:
Meskipun emulasi PCode idealnya menyiratkan penyatuan, sebagian besar prosesor memerlukan pendekatannya sendiri. Jangan ragu untuk melaporkan masalah apa pun yang Anda temui. Saya benar-benar ingin menguji semua prosesor, tapi itu hampir tidak mungkin.
Berisi semua jendela plugin: tampilan Stack, Register, tampilan Breakpoints, dan Jendela Utama.
Berisi tombol pintas untuk menyetel awal dan akhir emulasi, titik henti sementara, dan menerapkan byte yang diubah ke status emulator.
Ubah register sesuai keinginan Anda. Menyetel register tautan (panah hijau) akan membantu emulator memahami register mana yang berisi alamat pengirim. Plugin mengetahui cara kerjanya melalui register stack, lr, AARCH64, dan MIPS. Jika Anda memiliki yang eksotik, pilih tautan daftar dan tekan tombol.
Saat Anda membuka program di СodeBrowser, GhidraEmu akan memetakan ruang tumpukan secara otomatis. Penunjuk tumpukan akan diatur di tengah rentang tumpukan. Hal ini memungkinkan Anda untuk menetapkan nilai di bagian atas atau bawah bingkai tumpukan. Gulir jika Anda mengalami macet saat memperbarui atau mengatur ulang. Selama proses emulasi, jika program memerlukan lebih banyak ruang untuk tumpukan, plugin akan mengalokasikannya secara otomatis.
Jika ada byte yang berubah selama emulasi, Anda akan melihatnya di ByteViewer klasik. Jangan khawatir, nilai tersebut akan disetel ulang ke nilai aslinya setelah menekan tombol "Reset" .
Jika Anda melakukan perubahan, beri tahu emulator tentang byte yang diubah (tumpukan pembaruan secara otomatis -- tidak perlu). Setelah mengubahnya, pilih (warnanya hijau), dan tekan opsi ini (atau gunakan tombol pintas "M").
Di sini plugin mencetak informasi keluaran. Misalnya pesan kesalahan emulasi seperti ini:
Fitur "Jump Over" memungkinkan Anda untuk melompati satu instruksi jika Anda tidak ingin meniru instruksi saat ini karena alasan tertentu. Karena proses emulasi akan dibatalkan jika upaya membaca memori yang belum diinisialisasi terdeteksi, fitur ini memungkinkan Anda untuk melewatinya. Lihatlah sebuah contoh. Inilah salah satu instruksi pertama di banyak program x86_64, penyimpanan tumpukan canary:
MOV RAX, qword ptr FS:[0x28]
Kami hanya akan mencoba sedikit curang dan melompatinya dengan meningkatkan nilai PC. Untuk melakukannya, berhentilah pada instruksi yang tidak ingin Anda tiru dan tekan tombol pintas J
Jika tidak, melangkah lebih jauh akan mengakibatkan kesalahan pembacaan memori yang tidak diinisialisasi.
Jika Anda berhenti pada instruksi yang mengarah ke subrutin (panggilan internal) dan Anda ingin meniru semuanya hingga instruksi berikutnya ("step over" klasik), tekan tombol pintas F6
, dan itu pasti akan terjadi:
Beberapa poin penting untuk dipertimbangkan :
Gunakan gradle untuk membuat ekstensi: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle
dan gunakan Ghidra untuk menginstalnya: File → Install Extensions...
Di CodeBrowser, buka File → Configure → Miscellaneous
dan pilih kotak centang untuk plugin GhidraEmu.
Mengalami bug saat menggunakan plugin atau punya ide untuk perbaikan? Jangan malu untuk membuka terbitan baru dan saya akan mencari tahu.
Pembatasan EmulatorHelper tidak mengizinkan penggunaan ruang program di ruang lain. Jadi perpustakaan bersama eksternal Anda, misalnya, tidak akan pernah mengetahui ruang memori program dan sebaliknya. Jadi Anda tidak bisa menirunya sebagai satu proses dengan satu ruang memori. Beri tahu saya jika saya melewatkan sesuatu di sini.