
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确认插件已启用从 Code Browser 选择File - Configure点击BSim条目的Configure链接勾选BSimSearchPlugin详见 BSimTutorial_Enabling.md。注册数据库从 Code Browser 选择BSim - Manage Servers点击绿色加号选择File单选按钮并选中example.mv.db依次点击OK与Dismiss。如果建库时勾选了 Add New Server to Server Manager这一步可跳过。发起查询以下任一方式都可以打开 BSim Search DialogCode Browser 菜单BSim - Search Functions...在 Listing 中右键选择BSim - Search Functions...点击 Code Browser 工具栏上的 BSim 图标。在对话框中设置字段并点击Search。对话框中与阈值相关的字段有字段说明见 BSimSearch.htmlSimilarity Threshold0.0 到 1.0 之间的分数按特征集计算两个函数的余弦相似度。两个大小相近的函数0.85 的相似度意味着大约共享 85% 的特征分数会考虑单个特征的相对重要性所以不一定等于原始特征百分比。Confidence Threshold无上限的分数衡量一对函数是因果匹配真正同源的可能性。confidence 是似然比的对数共同特征累加正分差异特征累加负分分数越大结果越有意义。Max Matches Per FunctionMatches per Function限制单个函数返回的结果条数。大数据库中某些小而常见的函数可能有大量完全相同的匹配需要靠这个上界控制。发起查询时被查询的函数取决于当前选择无选择时查询光标所在地址包含的函数有选择时查询所有入口点在选择范围内的函数在 Listing 中按Ctrl-A全选再发起查询即可查询整个程序的所有函数。也可以从反编译器窗口右键某个函数名 token 选择BSim...来查询单个函数。两个分数分别意味着什么设置阈值之前需要先理解两个分数的差异见 FeatureWeight.html 与 BSimTutorial_Basic_Queries.mdSimilarity是两个特征向量的余弦相似度取值固定在 0.0 到 1.0 之间越高表示两个函数向量越接近。数据库对 similarity 设置阈值默认值为 0.7返回与查询函数相似度超过该阈值的函数。对小函数来说similarity 高的匹配可能是假阳性因为小函数只有少量特征随机命中大部分特征比较容易。Confidence是一个开放区间分数文档明确说明 confidence 分数可以为负用来判断一个匹配是否显著。共享特征会提高分数差异特征会降低分数且共享稀有特征比共享常见特征贡献更大。它和 similarity 的关键区别在于similarity 是百分比式的confidence 是绝对数量式的——分数越高说明两个函数共同拥有的特征在数量上越多随机命中的概率越低。文档给出了一段针对 confidence 与假阳性率的粗略对应关系适用于 10.0 及以上的分数区间为近似值且假阳性率每增加 4 到 5 个 confidence 点约下降一半Confidence假阳性率Approximate101 in 4,000261 in 100,000431 in 1,000,000931 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 排序结果表中也有对应的Similarity和Confidence列。置信度阈值与数据库规模有关数据库较小时中低 confidence 阈值可能就足以产生唯一匹配数据库很大时中高 confidence 阈值仍可能偶尔出现假阳性。文档示例中的实际用法可供参照来自 BSimTutorial_Basic_Queries.md 的练习函数识别练习导入并用 Visual Studio 编译的demangler_gnu_v2_41.exe用默认查询选项查询地址140006760的函数结果恰好是一个匹配similarity 为 1.0且匹配函数带有非默认名称。文档提示it wont always be this easy即默认阈值下不总能直接得到唯一高匹配。跨架构匹配练习导入 arm64 版demangler_gnu_v2_41查询_expandargv时把 similarity 阈值设为 0.5才能看到那个与 x86 版本不同memmove/memcpy被替换为__memmove_chk/__memcpy_chk的匹配。这个例子说明预期匹配存在真实差异时需要主动调低 similarity 阈值而不是沿用默认值。验证阈值是否生效、结果是否合理查询执行后用以下方式核对Search Info在 BSim Search Results 工具栏点击Search Info图标弹出对话框显示本次结果集实际使用的搜索条件确认阈值与预期一致。结果表函数级结果在上表可执行文件级结果在下表每行显示查询函数名、匹配函数名及对应的 similarity、confidence 分数。点击行会导航到产生该匹配的查询函数。复用参数成功发起一次查询后某些上下文会出现Search Function(s)动作无省略号它跳过对话框、用上一次查询的参数对选中函数再次执行查询适合用同一组阈值连续检查多个函数。比对验证对感兴趣的匹配行右键执行Compare Functions在并排比较窗口的 Listing View / Decompiler View 中核对差异是否合理差异会以青色高亮判断该阈值下的匹配是否有效。文档示例结果来自上述练习供比对而非固定预期默认选项查询140006760得到唯一匹配且 similarity 为 1.0similarity 阈值 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),仅供参考