Page 93 - 《软件学报》2025年第7期
P. 93
3014 软件学报 2025 年第 36 卷第 7 期
分类方法进行比较研究, 并总结了 5 种最先进的 (state-of-the-art, SOTA) 方法: RFPCT [25] 、RFDTBR [26] 、ECCJ48 [27] 、
EBRJ48 [27] 和 AdaBoost [28] . 其中, ECCJ48 同样使用了分类器链的结构来进行内联函数调用预测, 但这些标签间的
依赖关系是随机定义的.
5.1.3 参数设置
实验采用十折交叉验证来评估 O2NMatcher 的有效性. 具体来说, 从数据集中随机选取 90% 的项目作为训练
集, 剩余 10% 作为测试集. O2NMatcher 中的分类器在训练集上训练并为测试集产生源代码函数集合.
测试集的二进制文件被剥离符号信息后, O2NMatcher 即使用 BinaryAI 将二进制函数与源代码函数及源代码
函数集合匹配. 在实验过程中, O2NMatcher 仅采用 BinaryAI 发布的模型而不进行重新训练. 这一过程重复 10 次,
并计算平均指标.
在 ECOCCJ48 的基分类器 J48 设置中, 决策树的默认最大深度设置为无限大, 这与 RFDTBR, ECCJ48,
EBRJ48 的默认设置一致. AdaBoost 也使用了其默认设置, 其决策树深度为 1. 而 RFPCT 则是使用了其论文提供的
默认设置.
5.1.4 评估指标
实验采用 Recall@1 来衡量 O2NMatcher 的效果, 它在现有二进制到源代码相似性检测研究中被广泛应用.
Recall@1 表示在返回的第 1 个源函数中找到匹配函数的比例.
为评估 O2NMatcher 的成本, 本文引入了一个“集合增加比例”的指标, 计算生成的源代码函数集合数量与原
始源函数数量之比. 源代码函数集合增加会扩大语料库规模, 因此会增加查询时间, 并降低匹配性能.
为了评估 ECOCCJ48 的效果, 本文使用了多标签分类中常用的 3 个指标: 准确率、召回率和 F1 分数. 具体度
量指标如表 3 所示. 这些指标在多标签分类评估中与单标签分类相似, 可以通过取所有标签的平均值得到.
表 3 多标签分类相关度量指标
名词 缩写 定义
真阳例 TP 被正确检测为内联调用的内联调用的数量
真阴例 TN 被正确检测为普通调用的普通函数的数量
假阴例 FN 被错误检测为普通调用的内联调用的数量
假阳例 FP 被错误检测为内联调用的普通调用的数量
误报率 FPR FP/(FP+TN)
漏报率 FNR FN/(TP+FN)
准确率 P TP/(TP+FP)
召回率 R TP/(TP+FN)
F1分数 F1 2PR/(P+R)
5.1.5 具体实现
在数据集标记过程中, O2NMatcher 利用 Understand 解析源代码项目, 通过 IDA Pro 反汇编二进制文件. 在函
数调用图构建时, 同样使用 Understand 构造源代码 FCG, 使用 IDA Pro 构建二进制 FCG. 在函数调用特征提取上,
使用 tree-sitter 提取调用函数/被调用函数中的相关特征及调用指令特征, 并使用 Understand 提取函数调用特征.
模型训练阶段, 使用 Python 工具包 scikit-multilearn 实现 ECOCCJ48 及其他多标签分类方法. 论文的数据集和源
代码可在 https://github.com/island255/binary2source-matching-under-function-inlining 获取.
整个程序以 Python 编写, 并在配备了 Ubuntu 18.04 系统、Intel Xeon Gold 6266C 处理器和 1 024 GB DDR4
RAM 的工作站上进行所有实验.
5.2 检测精度分析
本节将对 O2NMatcher 进行检测精度的分析. 由于 O2NMatcher 中包含了一个内联函数调用预测的方法
ECOCCJ48, 其中 ECOCCJ48 的分类精度在很大程度上决定了 O2NMatcher 的检测精度, 因此本节将分别对

