基于基本块签名和跳转关系的二进制文件比对技(4)
时间:2025-04-21
时间:2025-04-21
1354
清华大学学报(自然科学版)2011,51(10)
S file= (F sim[i] F val[i])
F val[i] 100%
(0 i N1).(5)
其中:F sim[i]是样本文件中每个函数的最大相似度,F val[i]是该函数的权重,S file为文件整体相似度。
早期的二进制比对算法大多数忽视函数之间的个体性差异,将所有的函数无差别处理,仅仅对函数个数进行统计。这种做法存在很大的偏差,不同的基本块、函数之间差异很大。为了体现不同函数之间的差异,引入函数权重这一概念,用于表示函数在当前文件中所占的 比重 。函数权重计算公式如下:
F val=F2nod+F2edg+F2call,(6)其中:F2nod、F2edg、F2call分别是函数的内部基本块数量,内部基本块跳转数量和内部子调用数量。
2 试验结果及分析
由于应用于软件抄袭检测的二进制文件同源性比对工具的稀缺,本文把自主研发的BinCompar e 工具与文[1]中的针对源码检测的CodeCom pare工具以及Patchdiff2、BinDiff2等二进制补丁比对工具进行比较。
2.1 BinCompare与源码比对工具比较
1)针对源码常见抄袭情况的检测
针对源代码中语句顺序变换、变量名变换、变量顺序变换、变量类型变换、函数名变换等情况,各构建一组测试用例。然后用源码比对工具CodeCom pare得出每组测试用例的源码语法比对相似度、源码文本比对相似度;用BinCompare得出每组测试用例编译生成的二进制文件比对的相似度。例如针对源代码中语句顺序变化的情况部分测试用例如图2。
lo ng f1,f2; int i;
int i;long f1,f2;
f1=f2=1;f1=f2=1;
图2 源代码中语句顺序变化情况的部分测试用例
针对上述常见抄袭情况,采用源码比对工具CodeCom pare的语法比对和文本比对技术以及采用二进制比对工具BinCom pare,对文件的相似度测试结果如表1所示。
表1 针对不同测试用例的文件相似度比对结果
测试用例源码语法比对/%源码文本比对/%二进制文件比对/%语句顺序变化10085.7100
变量名变换10065.8100
变量顺序变换10094.199.7
变量类型变换10095.3100
函数名变换10080.899.7
表1的测试结果表明:针对上述源码常见抄袭情况,二进制比对工具BinCompare与源码比对工具CodeCompare的源码语法比对技术相比,两者检测的文件相似度基本相同。与Co deCompar e的源码文本比对技术相比,二进制比对工具BinCompar e 的准确度更高。
2)针对语义不变,源码表现形式变化的检测
软件抄袭行为中,包括一些通过改变源代码的语句形式,从而实现语义不变的抄袭手段。例如,将for循环用w hile循环替换;又如,在源码for 循环中增加冗余代码,从而改变语法和文本特征,但不改变语义。针对语义不变,源码表现形式变化的情况,源码比对工具从语法和文本的相似性匹配角度进行分析,因此难以进行准确的检测。而由于编译器优化原理,针对语义不变、源码表现形式变化的情况,二进制文件比对技术可以进行准确的比对。本文以for-w hile替换以及在源码for 循环中增加冗余代码为例,对二进制文件比对技术进行检测。
Whiletest.cpp和fortest.cpp是2个具有相同功能的源码文件;不同之处在于,在w hiletest.cpp 中,w hile循环代替了fortest.cpp中的具有相同功能的for循环,如图3所示,采用源码比对工具CodeCom pare和二进制文件比对工具BinCompare 进行文件相似度测试,其相似度测试结果如表2所示。