Ghidra-BSim测试
介绍
使用过程
GUI
创建一个non-shared项目,打开BSim功能(v11.0 默认关闭)
执行CreateH2BSimDatabaseScript.java脚本,修改name和dir字段,其他不修改。
分析一个二进制文件
执行AddProgramToH2BSimDatabaseScript.java脚本,使用name.mv.db数据库。脚本执行后会把这个二进制文件的函数签名加入数据库中
在BSim的菜单栏里选择Manage Servers指定database
把当前code view窗口选定的函数和database里的进行匹配,可以设置相似阈值和置信度阈值,也可以指定条件(二进制文件名、架构、调用了xx外部函数)
得到结果
比对的结果默认包含整个database里的函数,因此也包含了该二进制文件里的函数
可以对匹配到的函数名字进行替换、比对伪代码和汇编代码
在code browser里选择bsim->code overview,选择多行进行search可以在一个result窗口查看多个函数的匹配结果
CLI
TO BE CONTINUED …
提供的脚本
可以从这些脚本(部分)去看BSim的相似度、置信度的计算规则
JAVA
- AddProgramToH2BSimDatabaseScript.java:生成当前二进制文件所有函数的BSim信息并保存到数据库
- CompareBSimSignaturesScript.java:对两个待测的函数各跑一遍(两个函数可以在不同文件),输出BSim对这两个函数的比较结果
- CompareBSimSignaturesSpecifyWeightsScript.java:基本同上
- CompareExecutablesScript.java:由两个二进制文件所有的函数相似得分,得到两个二进制的得分(实际上是把二进制文件放到数据库里进行比对,需要再看一下如何选取函数进行比较,因为GUI比较里好像无法得到1对1的结果)
- CreateH2BSimDatabaseScript.java:创建数据库
- DumpBSimSignaturesScript.java:导出选定函数的函数特征哈希,每条汇编有一个哈希
- ExampleOverviewQueryScript.java:GUI的Overview功能
- ExampleQueryClientScript.java:查询特定函数的“一些信息”(</responseinfo>之前都相同,后续打印了callee函数)
- GenerateSignatures.java:生成签名
- LocalBSimQueryScript.java:在database里选一个二进制和当前的二进制进行函数比对
- QueryFunction.java:GUI里的search功能
- QueryWithFiltersScript.java:基本同上
- UpdateBSimMetadata.java:更新数据库
Python
- DumpBSimDebugSignaturesScript.py:导出选定函数的函数和调试信息
- DumpBSimSignaturesScript.py:导出选定函数的函数签名哈希(与java脚本导出的哈希值不同)
- ExampleOverviewQueryScript.py:GUI的Overview功能
- GenerateSignatures.py:生成签名
- QueryFunction.py:GUI里的search功能
匹配的例子
由于BSim会得到多个匹配结果,并且相似度值可能都相同,函数A的结果也可能和函数B匹配到的存在重复,因此比较fn,fp等对其他工具较为不公平。
单个函数的匹配
青绿色的是函数的差异
当用光标进行选择时,粉色是bsim关注的并且产生匹配的token;淡紫色是bsim关注但是没有匹配到的token;橘色表示token不会用作匹配
以下两对的相似值分别为1和0.777
二进制文件相似度
排除了较低hitcont和较小的函数
library score:当较小的二进制在另一个二进制里全都能找到匹配则为1
用提供的脚本跑的跨架构的例子,得到的文件相似度很低
recall
由于一个待匹配函数会得到多个匹配的结果,因此把这些结果都视为匹配
- 7zip-rar
(GT里119个函数匹配到126个)
- apache2-bin
(GT里1198个函数匹配到829个)