Ghidra BSim 函数相似度查询如何设置 Similarity 与 Confidence 阈值
2026/9/9 19:31:26 网站建设 项目流程

Ghidra BSim 函数相似度查询如何设置 Similarity 与 Confidence 阈值

【免费下载链接】ghidraGhidra is a software reverse engineering (SRE) framework项目地址: https://gitcode.com/GitHub_Trending/gh/ghidra

当你在 Ghidra 中用 BSim 插件对某个函数发起"相似函数搜索"时,搜索结果能返回什么、能返回多少,取决于 BSim Search Dialog 里的两个阈值:Similarity Threshold 与 Confidence Threshold。设置得太高会漏掉真实但有差异的匹配;设置得太低,结果里会混入"碰巧共享了一些特征"的函数。这篇文章说明这两个阈值在哪里设置、各自代表什么、文档给出的取值依据是什么,以及如何在查询后核对实际生效的阈值。

适用前提:已启动 Ghidra、创建了非共享项目并打开 Code Browser,且 BSim 数据库(例如教程中的 H2 文件库example.mv.db)已注册。

在哪里设置:打开 BSim Search Dialog

两个阈值都设置在 BSim Search Dialog 中,操作路径如下(见 BSimTutorial_Basic_Queries.md):

  1. 确认插件已启用:从 Code Browser 选择File -> Configure,点击BSim条目的Configure链接,勾选BSimSearchPlugin(详见 BSimTutorial_Enabling.md)。
  2. 注册数据库:从 Code Browser 选择BSim -> Manage Servers,点击绿色加号,选择File单选按钮并选中example.mv.db,依次点击OKDismiss。如果建库时勾选了 Add New Server to Server Manager,这一步可跳过。
  3. 发起查询,以下任一方式都可以打开 BSim Search Dialog:
    • Code Browser 菜单BSim -> Search Functions...
    • 在 Listing 中右键选择BSim -> Search Functions...
    • 点击 Code Browser 工具栏上的 BSim 图标。
  4. 在对话框中设置字段并点击Search

对话框中与阈值相关的字段有(字段说明见 BSimSearch.html):

  • Similarity Threshold:0.0 到 1.0 之间的分数,按特征集计算两个函数的余弦相似度。两个大小相近的函数,0.85 的相似度意味着大约共享 85% 的特征;分数会考虑单个特征的相对重要性,所以不一定等于原始特征百分比。
  • Confidence Threshold:无上限的分数,衡量一对函数是"因果匹配"(真正同源)的可能性。confidence 是似然比的对数:共同特征累加正分,差异特征累加负分,分数越大结果越有意义。
  • Max Matches Per Function(Matches per Function):限制单个函数返回的结果条数。大数据库中某些小而常见的函数可能有大量完全相同的匹配,需要靠这个上界控制。

发起查询时,被查询的函数取决于当前选择:无选择时查询光标所在地址包含的函数;有选择时查询所有入口点在选择范围内的函数;在 Listing 中按Ctrl-A全选再发起查询,即可查询整个程序的所有函数。也可以从反编译器窗口右键某个函数名 token 选择BSim...来查询单个函数。

两个分数分别意味着什么

设置阈值之前需要先理解两个分数的差异(见 FeatureWeight.html 与 BSimTutorial_Basic_Queries.md):

Similarity是两个特征向量的余弦相似度,取值固定在 0.0 到 1.0 之间,越高表示两个函数向量越接近。数据库对 similarity 设置阈值,默认值为 0.7,返回与查询函数相似度超过该阈值的函数。对小函数来说,similarity 高的匹配可能是假阳性,因为小函数只有少量特征,随机命中大部分特征比较容易。

Confidence是一个开放区间分数(文档明确说明 confidence 分数可以为负),用来判断一个匹配是否显著。共享特征会提高分数,差异特征会降低分数,且共享稀有特征比共享常见特征贡献更大。它和 similarity 的关键区别在于:similarity 是百分比式的,confidence 是绝对数量式的——分数越高,说明两个函数共同拥有的特征在数量上越多,随机命中的概率越低。

文档给出了一段针对 confidence 与假阳性率的粗略对应关系(适用于 10.0 及以上的分数,区间为近似值,且假阳性率每增加 4 到 5 个 confidence 点约下降一半):

Confidence假阳性率(Approximate)
101 in 4,000
261 in 100,000
431 in 1,000,000
931 in 1,000,000,000

两点文档给出的修正条件需要注意:BSim 对特定 wrapper 形式固定给出 10.0 的分数,wrapper 和其他小函数的频率会随软件类型波动,因此上表低于 10.0 的区间可能失真;另外,单个函数能达到的 confidence 上限是它的self-significance(该函数与自己比较时的 confidence),大致与函数大小成正比——小函数在单独查看单个匹配时不可能达到高 confidence。

文档还给了一个直观例子:很多可执行文件里都有一个"直接返回常量"的函数,两个这样的函数 BSim 向量相似度为 1.0,但 confidence 很低,说明它们"共享"这段代码并不显著。这正是单靠 similarity 阈值不够、需要 confidence 阈值配合的原因。

阈值取值的权衡与推荐做法

文档对取值给出了明确的权衡描述:

  • 阈值设得低,数据库更可能返回"是真正匹配但存在显著差异"的函数,同时也更可能返回碰巧共享部分特征的匹配。
  • 文档指出的通用做法是:把阈值设得相对低一些,然后按 similarity 和/或 confidence 降序查看匹配结果。BSim 查询结果支持按 similarity、confidence 排序,结果表中也有对应的SimilarityConfidence列。
  • 置信度阈值与数据库规模有关:数据库较小时,中低 confidence 阈值可能就足以产生唯一匹配;数据库很大时,中高 confidence 阈值仍可能偶尔出现假阳性。

文档示例中的实际用法可供参照(来自 BSimTutorial_Basic_Queries.md 的练习):

  • 函数识别练习:导入并用 Visual Studio 编译的demangler_gnu_v2_41.exe,用默认查询选项查询地址140006760的函数,结果恰好是一个匹配,similarity 为 1.0,且匹配函数带有非默认名称。文档提示"it won't always be this easy",即默认阈值下不总能直接得到唯一高匹配。
  • 跨架构匹配练习:导入 arm64 版demangler_gnu_v2_41,查询_expandargv把 similarity 阈值设为 0.5,才能看到那个与 x86 版本不同(memmove/memcpy被替换为__memmove_chk/__memcpy_chk)的匹配。这个例子说明:预期匹配存在真实差异时,需要主动调低 similarity 阈值,而不是沿用默认值。

验证阈值是否生效、结果是否合理

查询执行后,用以下方式核对:

  1. Search Info:在 BSim Search Results 工具栏点击Search Info图标,弹出对话框显示本次结果集实际使用的搜索条件,确认阈值与预期一致。
  2. 结果表:函数级结果在上表,可执行文件级结果在下表;每行显示查询函数名、匹配函数名及对应的 similarity、confidence 分数。点击行会导航到产生该匹配的查询函数。
  3. 复用参数:成功发起一次查询后,某些上下文会出现Search Function(s)动作(无省略号),它跳过对话框、用上一次查询的参数对选中函数再次执行查询,适合用同一组阈值连续检查多个函数。
  4. 比对验证:对感兴趣的匹配行右键执行Compare Functions,在并排比较窗口的 Listing View / Decompiler View 中核对差异是否合理(差异会以青色高亮),判断该阈值下的匹配是否有效。

文档示例结果(来自上述练习,供比对而非固定预期):默认选项查询140006760得到唯一匹配且 similarity 为 1.0;similarity 阈值 0.5 的跨架构查询得到单条匹配,decompiler diff 中可见__chk版本调用多出的参数。

限制:阈值设为 0 不等于返回全部

如果将 similarity 和 confidence 阈值都设为 0.0,查询不会返回数据库中的全部函数,原因有三(来自 BSimTutorial_Basic_Queries.md 末尾的说明):

  • 对索引型数据库(PostgreSQL 和 Elasticsearch),索引设计使得比较只发生在"可能相近"的向量之间,大多数向量根本不会作为候选被考虑;
  • 无论数据库类型如何,匹配只有在 confidence 分数高于查询的 confidence 阈值时才会显示。界面不允许设置负数 confidence 阈值,但 confidence 分数本身可以为负;
  • Matches per Function参数同样控制返回的函数数量。

另外,文档的练习默认要求使用默认查询设置与自动分析选项,除非明确指定(例如跨架构练习指定 similarity 0.5)——如果你复现实习结果时发现差异,先检查阈值是否被改动过。

阈值设置只是 BSim 查询的第一步;对返回结果如何评估、以及如何把匹配信息(名称、签名)应用到查询函数上,参见 BSimTutorial_Evaluating_Matches.md;按可执行文件聚合匹配的思路见 BSimTutorial_Exe_Results.md。

【免费下载链接】ghidraGhidra is a software reverse engineering (SRE) framework项目地址: https://gitcode.com/GitHub_Trending/gh/ghidra

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询