Plugin BinaryNinja untuk membuat grafik pohon instruksi BNIL dan pencocokan instruksi meta-program python.
Instalasi didukung dua cara, yang pertama menggunakan manajer plugin baru dan yang kedua adalah instalasi manual.
Gunakan pengelola plugin baru dengan memilih "Kelola Plugin" dari menu "Edit". Cari daftar plugin untuk "BNIL Instruksi Grafik", klik kanan padanya dan klik "Instal" lalu klik kanan lagi dan pilih "Aktifkan".
$ git clone https://github.com/withzombies/bnil-graph.git
$ cd ~/Library/Application Support/Binary Ninja/plugins
$ ln -s ~/git/bnil-graph .
Untuk menggunakan bnil-graph, klik kanan pada instruksi dan pilih "BNIL Instruksi Graph". Ini membuat grafik instruksi BNIL yang terkait dengan alamat tersebut dan menampilkannya sebagai bentuk HTML.
Binary Ninja menambahkan pengakses operan secara dinamis, karena ini pengakses yang mudah digunakan tidak muncul dalam panggilan dir()
atau dalam dokumentasi api. bnil-graph menunjukkan struktur instruksi IL termasuk nama pengaksesnya yang bagus (seperti insn.src
untuk register sumber atau memori)
Contoh grafik:
Selain plugin grafik, bnil-graph juga akan menghasilkan fungsi pencocokan yang akan sama persis dengan instruksi yang dipilih. Fitur ini akan memungkinkan pengembang plugin baru untuk mencocokkan instruksi dengan cepat. Tujuan penggunaannya adalah untuk menemukan instruksi yang mirip dengan yang ingin Anda cocokkan, membuat fungsi pencocokan, lalu memodifikasi fungsi yang dihasilkan agar lebih mendukung kebutuhan Anda.
Contohnya adalah mencoba menemukan semua instruksi MediumLevelILSSA MLIL_CALL_SSA yang menggunakan 3 parameter. Saya membuat pencocokan terhadap fungsi yang tidak terkait dengan 0 parameter:
def match_MediumLevelILSSA_140001194_0 ( insn ):
# mem#1 = 0x14000d49c() @ mem#0
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
# invalid
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
if insn . output . dest_memory != 0x1 :
return False
if len ( insn . output . dest ) != 0 :
return False
# 0x14000d49c
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if insn . dest . constant != 0x14000d49c :
return False
if len ( insn . params ) != 0 :
return False
if insn . src_memory != 0x0 :
return False
return True
Kita dapat memodifikasinya untuk menghilangkan beberapa batasan tertentu:
def match_MediumLevelILSSA_140001194_0 ( insn ):
# mem#1 = 0x14000d49c() @ mem#0
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
# invalid
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
# 0x14000d49c
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if len ( insn . params ) != 0 :
return False
return True
Kami menghapus tujuan panggilan dan batasan versi memori. Selanjutnya, perbarui pemeriksaan params untuk memeriksa 3 parameter:
def match_3_param_MLIL_CALL_SSA ( insn ):
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if len ( insn . params ) != 3 :
return False
return True
Sekarang, kami memiliki pencocokan yang akan mengidentifikasi instruksi MLIL_CALL_SSA dengan 3 parameter! Sekarang ulangi instruksi MLIL SSA dan panggil matcher dan selesai:
if __name__ == '__main__' :
bv = binaryninja . BinaryViewType . get_view_of_file ( sys . argv [ 1 ])
bv . update_analysis_and_wait ()
for func in bv . functions :
mlil = func . medium_level_il
for block in mlil . ssa_form :
for insn in block :
if match_3_param_MLIL_CALL_SSA ( insn ):
print "Match: {}" . format ( insn )
Contoh pencocokan:
Hak cipta proyek ini adalah Ryan Stortz (@withzombies) dan tersedia di bawah LISENSI Apache 2.0.