一個 BinaryNinja 插件,用於繪製 BNIL 指令樹和元程式 python 指令匹配器。
支援兩種方式安裝,第一種使用新的插件管理器,第二種是手動安裝。
透過從「編輯」選單中選擇「管理外掛」來使用新的外掛程式管理器。在插件列表中搜尋“BNIL指令圖”,右鍵單擊它並單擊“安裝”,然後再次右鍵單擊並選擇“啟用”。
$ git clone https://github.com/withzombies/bnil-graph.git
$ cd ~/Library/Application Support/Binary Ninja/plugins
$ ln -s ~/git/bnil-graph .
若要使用 bnil-graph,請右鍵點選指令並選擇“BNIL 指令圖”。這會繪製與該位址關聯的 BNIL 指令並將其顯示為 HTML 表單。
Binary Ninja 動態新增操作數存取器,因此方便的存取器不會出現在dir()
呼叫或 api 文件中。 bnil-graph 顯示了 IL 指令的結構,包括其漂亮的存取器名稱(例如表示來源暫存器或記憶體的insn.src
)
範例圖:
除了圖形插件之外,bnil-graph 還將產生一個匹配器函數,該函數將精確匹配所選指令。此功能將允許新插件開發人員快速匹配指令。預期用途是找到與您要匹配的指令相似的指令,產生匹配器函數,然後修改生成的函數以更好地支援您的需求。
一個範例是嘗試尋找所有採用 3 個參數的 MediumLevelILSSA MLIL_CALL_SSA 指令。我針對具有 0 個參數的不相關函數產生了一個匹配器:
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
我們可以修改它以消除一些特定的約束:
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
我們刪除了呼叫目的地和記憶體版本控制約束。接下來,更新參數檢查以檢查 3 個參數:
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
現在,我們有一個匹配器,它將識別具有 3 個參數的 MLIL_CALL_SSA 指令!現在迭代 MLIL SSA 指令並呼叫匹配器,我們就完成了:
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 )
匹配器範例:
此專案版權歸 Ryan Stortz (@withzombies) 所有,可根據 Apache 2.0 許可證使用。