Page 84 - 《软件学报》2025年第7期
P. 84
贾昂 等: 面向函数内联场景的二进制到源代码函数相似性检测方法 3005
多”匹配问题. 第 3 节介绍本文在函数内联场景下进行的实证研究以及发现的内联规律. 第 4 节介绍面向函数内
联场景的“一对多”的二进制到源代码函数相似性匹配方法. 第 5 节通过实验验证所提方法的有效性. 最后总结
全文.
1 相关工作
1.1 二进制到源代码相似性检测
表 1 总结了现有的二进制到源代码相似性检测工作. 根据检测方法的不同, 这些工作可以分为 3 类: 基于特征
的方法、基于编译的方法和基于深度学习的方法.
表 1 现有的二进制到源代码相似性检测工作
方法类型 方法名称 方法粒度 是否考虑内联
BAT [1] 文件级 否
Resource [2] 文件级 否
JISIS14 [3] 函数级 否
BinPro [4] 文件级 否
基于特征的方法 [5]
OSSPolice 文件级 否
SANER19 [6] 文件级 否
B2SFinder [7] 文件级 否
B2SMatcher [8] 文件级 否
[9]
Buggraph 函数级 否
基于编译的方法
XLIR [10] 函数级 否
基于深度学习的方法 CodeCMR [11] 函数级 否
基于特征的工作 [1−8] 通过比较提取的特征来进行匹配. 用于比较的特征主要包括字符串常量、数值常量、控
制流结构以及函数参数信息. 表 1 中除 JISIS14 以外的所有工作几乎都用到了字符串进行直接比较, Resource、
BinPro、B2SFinder 和 B2SMatcher 则是对数值常量也进行比较. 另外, OSSPolice、SANER19、B2SFinder 还引入
了函数的控制信息, 而 JISIS14 和 B2SMatcher 还引入了函数的参数信息. 然而, 在函数内联场景下, 多个函数的函
数特征会组合到一起, 甚至如数字常量和函数的控制信息等特征在组合之后还会发生改变. 而使用基于特征的工
作进行检测时, 一个源函数的特征只是一个内联二进制函数的特征的一部分, 因此无法有效地检测出内联二进制
函数的组成成分.
[9]
基于编译的工作 [9,10] 利用编译来沟通源代码与二进制文件, 从而进行二进制到源代码的匹配. Buggraph 首先
使用与目标二进制文件相同的配置来编译源代码. 然后比较二进制函数以获得相似性. XLIR [10] 将源代码和二进制
文件都转换为 LLVM IR. 然后比较 LLVM IR 函数以获得相似性. 然而, 一方面, 由于编译选项的多样性, Buggraph
和 XLIR 的编译方法很难覆盖所有的内联情况; 另一方面, 并非所有的源代码项目都可以自动编译. 基于编译的工
作在函数内联场景下面临着扩展性差的问题.
基于深度学习的工作 [11] 通过训练神经网络来进行二进制到源代码的匹配. CodeCMR [11] 将二进制到源代码的
匹配建模为一种跨模态检索任务, 其中源函数和二进制函数是神经网络的两个输入. 输出是源函数和二进制函数
之间的相似性. 虽然 CodeCMR 目前在二进制到源代码相似性匹配中实现了最高的 Recall@1 值, 但是其训练过程
并未考虑到函数内联的存在, 因此其在函数内联场景中也面临巨大的挑战.
我们先前的工作 [12] 曾对现有的二进制相似性方法在函数内联场景下进行了一个系统性的调研, 发现现有的
二进制到源代码的相似性匹配工作都没有考虑到函数内联. 其中, 作为目前二进制到源代码相似性匹配的最新研
究成果, BinaryAI 在函数内联场景上也遭受了 30% 的性能损失. 本文将从函数内联场景出发, 旨在补全现有方法
的性能损失, 以提升现有方法在函数内联场景的检测准确率.

