Page 94 - 《软件学报》2025年第7期
P. 94

贾昂 等: 面向函数内联场景的二进制到源代码函数相似性检测方法                                                 3015


                 O2NMatcher 和  ECOCCJ48  的检测精度进行实验评估.

                 5.2.1    O2NMatcher 的检测精度分析
                    在  O2NMatcher 的检测精度评估中, 首先衡量了         O2NMatcher 与  BinaryAI 在函数内联场景下的二进制到源代
                 码相似性搜索的效果, 以评估         O2NMatcher 对现有“一对一”匹配工作的提升效果. 随后, 本节将              O2NMatcher 和两
                 个内联策略方法      Bingo  和  Asm2Vec 对比, 以评估  O2NMatcher 的有效性. 最后, 本节将生成的源代码函数集合与
                 内联的二进制函数进行了对比, 分析           O2NMatcher 在寻找内联源代码函数上的准确率.
                    表  4  展示了  BinaryAI 和  O2NMatcher 在匹配内联二进制函数时的实验效果. 首先, 当对比             O2NMatcher 与
                 BinaryAI 的检测效果时, O2NMatcher 在检测内联的二进制函数时给             BinaryAI 带来了显著的提升, Recall@1    由
                 34.50%  上升到  40.93%. 在函数内联场景下, O2NMatcher 对     BinaryAI 在  Recall@1  上的提升幅度为   (40.93%–
                 34.50%)/34.50%=18.6%. 表  4  中也展示了  Bingo  和  Asm2Vec 的匹配效果, 可以看到, Bingo  和  Asm2Vec 只能使
                 BinaryAI 的性能分别提高了     0.98%  和  0.46%.

                                               表 4 O2NMatcher 的实验结果 (%)

                                指标           BinaryAI      Bingo      Asm2Vec       O2NMatcher
                              Recall@1        34.50        34.84        34.65         40.93
                             集合增加比例            0.00        23.78        22.09         87.63

                    通过结果可以看出, Bingo      和  Asm2Vec 人工设计的规则很难适应多种分类器, 多种优化选项下的函数内联情
                 况, 而  O2NMatcher 通过识别内联函数调用并进一步模拟内联实施构建源代码函数集合的方法能够更好拟合各种
                 编译设置下的函数内联情况. 这是因为, 在            O2NMatcher 的内联预测部分, 通过对多种编译条件下的函数内联规律
                 进行归纳和整合, O2NMatcher 所设计的多标签分类方法             ECOCCJ48  能够学习更多编译选项的函数内联规律, 从
                 而识别更多的内联函数调用, 最终构建出更为完整和准确的源代码函数集合. 相比                             Bingo  和  Asm2Vec, 由于
                 O2NMatcher 能够生成与内联二进制函数更为接近的源代码函数集合, 因此其在二进制到源代码函数相似性匹配
                 场景下能够实现更为精确的匹配效果.
                    尽管源代码函数集合能够帮助提升现有二进制到源代码相似性检测工作的性能, 但源代码函数集合也会增加
                 查询二进制函数的匹配时间. 如表          4  所示, 对于含有内联的二进制函数, O2NMatcher 需要额外生成            87.63%  的源代
                 码函数集合. 考虑到内联的二进制函数仅占二进制函数的一部分, 由于源代码函数集合所增加的匹配时间也是可
                 以接受的.
                    接下来, 本节评估了      O2NMatcher 在寻找内联源代码函数上的准确率. 本文利用发生内联的二进制函数与其
                 对应源代码函数集合之间的相似度来衡量针对特定发生内联的二进制函数所找到的源代码函数的完整性. 具体来
                 说, 本文采用公式     (2) 计算这一相似度:

                                                            (           )
                                                             |BFI ∩SFS|×2
                                                Sim BFI-SFS = max                                     (2)
                                                         SFSs  |BFI|+|SFS|
                 其中,  BFI  代表含有内联的二进制函数,        SFS 表示源代码函数集合.      |BFI ∩SFS| 表示同时出现在    BFI  和  SFS 中的源
                 函数数量.   |BFI| 和  |SFS| 分别代表发生内联的二进制函数映射到的源函数数量以及生成的源代码函数集合中的源
                 函数数量. max   意味着从属于     BFI  根函数生成的所有     SFS 中选择最大相似度. 如果给定的         BFI  没有生成任何    SFS,
                 此相似度将为     0.
                    图  8  展示了所有内联二进制函数与源代码函数集合之间的相似度的分布情况. 如图所示, 超过                          50%  的内联二
                 进制函数能找到相似度超过          80%  的源代码函数集合. 33.5%     的内联二进制函数能找到完全匹配的源代码函数集
                 合. 这说明对于内联的二进制函数来说, 其中             50%  的二进制函数能够找到参与其编译过程的              80%  的源代码函数,
                 33.5%  的二进制函数能够找到生成该二进制函数的所有源代码函数. 因此, O2NMatcher 生成的源代码函数集合能
                 帮助已有工作为内联的二进制函数找到更多其复用的源代码函数.
   89   90   91   92   93   94   95   96   97   98   99