基于基本块签名和跳转关系的二进制文件比对技(5)
时间:2025-04-21
时间:2025-04-21
崔宝江,等: 基于基本块签名和跳转关系的二进制文件比对技术1355
fo r(i=1;i<=20;i++)i=1;
{printf("%12ld%12ld",f1,f2);while(i<=20)
if(i%2==0)printf("\n");{printf("%12ld%12ld",f1,f2);
f1=f1+f2;if(i%2==0)pr int f("\n");
f2=f1+f2;f1=f1+f2;
}f2=f1+f2;
i++;
}
图3 f ortest.cpp中的for循环代码和whiletest.cpp中的while代码
表2 针对f or-while替换、for循环中增加冗余代码的相似度比对结果
测试用例源码语法比对/%源码文本比对/%二进制文件比对/%
for-w hile替换14.2968.899.22 for循环中增加冗余代码5096.9100
Addcomm ent.cpp和addco mment2.cpp同样是具有相同功能的2个源码文件;不同之处在于, addcomm ent2.cpp在addco mment.cpp的for循环中增加了一行不影响文件功能的冗余代码,如图4 所示。采用源码比对工具CodeCom pare和二进制文件比对工具BinCompar e进行文件相似度测试,其测试结果如表2。
综上可知,与源码比对技术相比,针对for-w hile
fo r(i=0;i<5;i++)for(i=0;i<5;i++)
{pr intf("\n please input N o.%d scor e:\n",i);{printf("\n please input No.%d sco re:\n",i); printf("stuN o:");flo at a,b,c;
scanf("%s",stu[i].num);pr intf("stuN o:");
scanf("%s",stu[i].num);
图4 addcomment.cpp和addcomment2.cpp中的部分代码
替换以及在源码for循环中增加冗余代码等语义不变,而源代码表现形式变化的抄袭情况,二进制比对技术的相似度检测准确度更高。
2.2 BinCompare与二进制补丁比对工具比较
Patchdiff2和BinDiff2是常见的2种二进制补丁比对工具。其中,Patchdiff2主要采用指令循环冗余校验和块地址信息技术;BinDiff2主要采用基本块结构化签名技术。为了检测本文提出的基于基本块签名和基本块之间跳转关系的二进制文件同源性检测技术的优略性,下面把BinCpmpar e与Patchdiff2、BinDiff2等几个二进制补丁比对工具进行比对。
为了进行更广泛的比较,本文构建了针对源代码中语句顺序变换、变量名变换、变量顺序变换、参数顺序变换、参数名变换、变量类型变换、函数名变换等情况的测试用例;然后把每组测试用例编译生成二进制文件,用以上二进制文件比对的工具分别进行文件相似度的比对实验,测试结果如表3所示。
表3 针对不同类型的测试用例BinC ompare与
二进制补丁比对工具的相似度比对结果/%
测试用例Patchdiff2BinDiff2BinCo mpar e 参数顺序变换86.3695.65100
变量名变换86.7695.74100
变量顺序变换86.7695.7499.7
参数顺序变换86.7695.7499.5
参数名变换73.38736.18100
函数名变换86.7690.4399.7
变量类型变换87.1495.83100
for-w hile替换86.3695.6599.22 for循环中增加冗余代码86.3695.65100
由表3可知,与几个常用的二进制补丁比对工具比较,基于基本块签名和基本块之间跳转关系技术的BinCompare对上述测试用例进行二进制文件同源性比对得出的相似度准确性更高。
3 结 论
为了研究应用于软件抄袭检测的二进制文件同