Ghidra-BSim测试

介绍

使用过程

GUI

创建一个non-shared项目,打开BSim功能(v11.0 默认关闭)
1
执行CreateH2BSimDatabaseScript.java脚本,修改name和dir字段,其他不修改。
分析一个二进制文件
执行AddProgramToH2BSimDatabaseScript.java脚本,使用name.mv.db数据库。脚本执行后会把这个二进制文件的函数签名加入数据库中
在BSim的菜单栏里选择Manage Servers指定database
20231230140608
把当前code view窗口选定的函数和database里的进行匹配,可以设置相似阈值和置信度阈值,也可以指定条件(二进制文件名、架构、调用了xx外部函数)
20231230142324
得到结果
20231230181838
比对的结果默认包含整个database里的函数,因此也包含了该二进制文件里的函数
可以对匹配到的函数名字进行替换、比对伪代码和汇编代码
20231230183247

在code browser里选择bsim->code overview,选择多行进行search可以在一个result窗口查看多个函数的匹配结果
20240103190919
20240103190936

CLI

TO BE CONTINUED …

提供的脚本

可以从这些脚本(部分)去看BSim的相似度、置信度的计算规则

JAVA

  • AddProgramToH2BSimDatabaseScript.java:生成当前二进制文件所有函数的BSim信息并保存到数据库
  • CompareBSimSignaturesScript.java:对两个待测的函数各跑一遍(两个函数可以在不同文件),输出BSim对这两个函数的比较结果
  • CompareBSimSignaturesSpecifyWeightsScript.java:基本同上
  • CompareExecutablesScript.java:由两个二进制文件所有的函数相似得分,得到两个二进制的得分(实际上是把二进制文件放到数据库里进行比对,需要再看一下如何选取函数进行比较,因为GUI比较里好像无法得到1对1的结果
    20240103194149
  • CreateH2BSimDatabaseScript.java:创建数据库
  • DumpBSimSignaturesScript.java:导出选定函数的函数特征哈希,每条汇编有一个哈希
    20240103195804
  • ExampleOverviewQueryScript.java:GUI的Overview功能
  • ExampleQueryClientScript.java:查询特定函数的“一些信息”(</responseinfo>之前都相同,后续打印了callee函数)
    20240103202052
  • GenerateSignatures.java:生成签名
  • LocalBSimQueryScript.java:在database里选一个二进制和当前的二进制进行函数比对
    20240103201611
  • QueryFunction.java:GUI里的search功能
  • QueryWithFiltersScript.java:基本同上
  • UpdateBSimMetadata.java:更新数据库

Python

  • DumpBSimDebugSignaturesScript.py:导出选定函数的函数和调试信息
    20240103195635
  • DumpBSimSignaturesScript.py:导出选定函数的函数签名哈希(与java脚本导出的哈希值不同)
    20240103200008
  • ExampleOverviewQueryScript.py:GUI的Overview功能
  • GenerateSignatures.py:生成签名
  • QueryFunction.py:GUI里的search功能

匹配的例子

由于BSim会得到多个匹配结果,并且相似度值可能都相同,函数A的结果也可能和函数B匹配到的存在重复,因此比较fn,fp等对其他工具较为不公平。

单个函数的匹配

青绿色的是函数的差异
当用光标进行选择时,粉色是bsim关注的并且产生匹配的token淡紫色是bsim关注但是没有匹配到的token橘色表示token不会用作匹配

以下两对的相似值分别为1和0.777
20240104165115
20240104165141

二进制文件相似度

排除了较低hitcont和较小的函数
library score:当较小的二进制在另一个二进制里全都能找到匹配则为1

用提供的脚本跑的跨架构的例子,得到的文件相似度很低

20240104112320
20240104163037

recall

由于一个待匹配函数会得到多个匹配的结果,因此把这些结果都视为匹配

  1. 7zip-rar
    (GT里119个函数匹配到126个)
    20240104155104
  2. apache2-bin
    (GT里1198个函数匹配到829个)
    20240104164252