bnil graph
vailable
一个 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 许可证使用。