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 的检测精度, 因此本节将分别对
   88   89   90   91   92   93   94   95   96   97   98