二进制可执行文件的相似度分析一直是一个难题。大家都知道,即使是同一份源代码,使用同一个编译器,可用不同的编译参数进行编译后,代码也会产生极大的差异。
当发生有人因为盗用别人的源代码而产生的侵权后,如果不能够将二者的源代码拿出进行比较的话,判断是否抄袭非常困难。因此,一直以来或多或少,总会有人无 所顾忌的将开放源代码的软件拿来加入到自己的软件中,或者干脆就是在那些源代码的基础上稍加修改和更换了版权信息就宣称是自己研发的。因为他们知道,只要 不把自己的源代码公诸于众,那么抄袭就很难判定。
下面我就详细说一下我采用的分析方法。
2.1 ELF可执行文件相似度分析方法
这次分析起始,我就碰到了一些难题。如果对二进制可执行文件进行基于字节的相似性分析,即使匹配上某些字节,也很难说明两段代码的相似性,另外匹配也很容 易受到各种噪音的干扰而产生很低的相似度,可是噪音却无法被去除。
因此,使最小比较单元具有明确的语义和合理的过滤噪音是我首先要解决的问题。
2.1.1 反汇编
二进制文件的比较难以确定最小单元语义的根本问题在于二进制文件是以字节为单位,然而每个字节却没有特定的含义。你很难说89e5和83 EC89中的89相同说明什么,在这个例子中,前者的89 e5是i386的一条指令,而后者的89则是一个立即数,所以他们相同实际上什么都不说明。
针对这次分析,由于都是可执行代码,而且都采用了ELF的文件格式。由于这个特点,我首先将所有操作系统的内核通过objdump反汇编成汇编代码。这样 做有一个直接的好处,就是每一行都是一条汇编语句,而每一条汇编语句又是一个程序不可分的最小逻辑单元。这样,接下来的分析就可以基于行来进行相似性的分 析,因为每出现一行相同就说明有一个最小的逻辑单元相同,如果出现连续的行相似,那么就说明有连续的代码段相似。相同的行越多两个内核就越相似。
并且经过反汇编后,就避免了因文件内包含的其他无关信息,如字符串、资源文件、数据文件等,对分析结果产生的影响。
这个方法依旧无法避免因编译参数差异所造成的相似度下降的影响。虽然如此,但是我很幸运,从这次分析的结果看,依旧得到了不低的相似度。
2.1.2 过滤噪音
噪音的出现有很多原因,可能是内存分布不同、代码的增删导致的偏移地址的变化,对相同含义的常量而数值却不同等等。这些值的差异,可能会造成不同的执行结 果,但是却对两段代码的相似性比较影响不大。请看下列两个代码段:
左边的代码是来自FreeBSD 5.3内核的,而右边的代码来自麒麟2.0.21/18的内核。通过人的分析,我们可以得出这两段代码实际上是相同的。可是对于计算机程序比较的时候,就 不尽然。
请注意上述的有颜色的数字。用蓝色表示的代码地址[4]、绿色表示的偏移地址、红色表示的立即数、深蓝色表示的函数偏移地址和粉色表示的函数地址,这些数字的不同,就造成了代码比较时候的失败。上述13行代码,如果就这样比较的话,只有函数名一行可以匹配。因此虽然是相同的代码,却只有7.7%的相似度。下面我们就来去除这些干扰。
首先,我们将代码行地址、函数跳转地址和函数偏移地址去除。代码行所在的地址,实际上是说明了代码所在内存的位置,内存的位置会随着代码的删改而很容易产 生变动,这些对我们比较代码逻辑没有意义。其中有些绝对地址,我们将其替换为“{Address}”,这样既不受地址变化的影响,又不至影响了代码的含 义。
然后我们将绿色的偏移地址替换成特定字符串“{Offset}”。产生偏移地址的原因一般有两种,一种是结构体,另一种是数组。即使不对结构体删改,而仅 仅是对结构体的声明顺序的变动都可以造成偏移地址的不同,我们在这里只关心程序在这里用到了一个偏移地址,而不关心用的到底是偏移了多少。数组的用法虽然 不常出现,但是即使出现其中的位置也是很容易发生变动的。因此在这里,我们也将偏移地址的数值替换成统一的字符串。
最后,我们来处理红色的立即数。当然立即数并不是只有上述的几种情况下出现,虽然在上述的例子中,两边的立即数都完全一样,单是在某些情况下还是会出现不同。
立即数在程序中一般是常量,而常量有可能是与系统相关的数值,或者仅仅是一个符号,而不在乎具体数值。无论是什么含义,常量虽然在执行过程中不会改变,在 设计过程中却很容易发生变动。不过对我们分析代码逻辑没有太大的影响,因此,在分析的时候我们对数值进行模糊化,将其替换为“{Number}”这个特定 字符串。
至此,上述代码将会变为:
<freebsd4_sigcode>: | <freebsd4_sigcode>:
freebsd4_sigcode(): | freebsd4_sigcode():
call *{Offset}(%esp) | call *{Offset}(%esp)
lea{Offset}(%esp),%eax | lea{Offset}(%esp),%eax
push %eax | push %eax
testl{Number},{Offset}(%eax) | testl{Number},{Offset}(%eax)
jne <freebsd4_sigcode+{Offset}> | jne <freebsd4_sigcode+{Offset}>
movl{Offset}(%eax),%gs | movw{Offset}(%eax),%gs
mov{Number},%eax | mov{Number},%eax
push %eax | push %eax
int{Number} | int{Number}
jmp <freebsd4_sigcode+{Offset}> | jmp <freebsd4_sigcode+{Offset}>
nop | nop
|
现在这两段代码的相似度将变成真实的100%。
分享到:
相关推荐
而程序可执行文件相似度方法则是关注于可执行文件的相似性分析。这些方法对于安全领域、软件工程以及逆向工程等具有重要的意义。 在应用层面,二进制代码相似度计算的应用场景非常广泛。例如,在软件剽窃检测方面,...
最后,压缩包中的"Ex_FileSimilarity"可能是源代码文件夹或者可执行文件,包含实现上述功能的所有代码和资源文件。通过分析这些代码,我们可以深入理解MFC如何被用来创建用户界面,以及LCS算法如何被集成到MFC应用...
首先,让我们深入理解文件相似度计算的概念。文件相似度通常是指两个或多个文件在内容上的相近程度。这可以通过比较它们的字节序列、文本结构、关键词出现频率等多种方式来实现。在这个案例中,俄罗斯数学家的算法...
在实际应用中,"TFIDFMeasure"可能是一个类或者模块,它封装了上述的所有操作,包括读取文件、预处理文本、计算TF-IDF值、执行余弦相似度计算以及展示结果。开发者可以调用这个模块,输入一组文章或图片,获取相似度...
4. `LevenshteinProject.exe`:这是编译后的可执行文件,可以直接运行查看算法效果。 5. `LevenshteinUnit.pas`:这是Delphi的源代码文件,其中应该包含了实现Levenshtein算法的函数或类。 6. `LevenshteinProject....
开发者可以通过查看源代码学习如何在DELPHI中实现这个算法,也可以直接使用提供的可执行文件进行快速的字符串相似度计算。在实际应用中,这样的工具对于文本分析、搜索引擎优化、拼写检查等领域都具有很高的价值。
- LCSProject.exe: 已编译的可执行文件,可以直接运行以查看程序效果。 - LCSUnit.pas: 这是DELPHI的单元文件,包含了LCS算法的实现代码,可能包括字符串处理和动态规划数组的声明及填充逻辑。 - LCSProject.res: ...
"代码相似度分析工具"可能是一款能够自动化执行这些比较任务的软件。它可以处理多种编程语言,对代码进行深度分析,找出潜在的相似或复制粘贴的代码段。工具的准确性通常取决于其使用的算法和优化策略。 三、应用...
"Debug"文件夹则可能包含编译后的可执行文件和调试信息。 通过阅读源代码和说明文档,你可以深入了解这个C++实现的TF-IDF算法是如何工作的,以及如何应用到实际的文本相似度计算任务中。对于学习和理解TF-IDF算法,...
这个Java可执行文件提供了PathSim算法的实现,使得用户无需编写代码即可进行路径相似度计算。 首先,我们要理解PathSim算法的基本原理。在图论中,路径是连接两个节点的一系列连续边。PathSim算法假设,如果两个...
与应用程序可执行文件安装在相同文件夹中的外部 .manifest 文件包括, 也可能以资源的形式包括在该可执行文件中。 ///////////////////////////////////////////////////////////////////////////// 其他注释: ...
提供的`Detection.jar`文件是Java的可执行文件,用户可以直接运行,无需编译源代码。这表明程序可能已经打包成了一个可部署的Java应用程序,使用了Java的JAR(Java Archive)格式,便于分发和执行。 6. **源代码和...
6. `diffimg.exe`是程序的主执行文件,`uninstall.exe`则用于卸载软件,`icon.ico`是程序的图标,而`有问题点我!安装教程!.png`可能是一个指向帮助文档或安装指南的图片链接。 7. 使用过程中,用户可以根据`有...
执行文件通常接受输入参数,例如蛋白质相互作用网络文件、同源性组信息等,并输出聚类结果。 3. **DIP.txt**:这是一个蛋白质相互作用数据文件,可能包含了蛋白质间的相互作用关系,是COACH算法的输入。DIP...
压缩包中的"pdf2word"可能是该软件的执行文件或安装程序,用户可以通过运行这个程序来实现PDF到Word的转换。在实际使用中,用户应注意以下几点: 1. **文件兼容性**:确认软件支持的PDF版本,确保能处理不同来源和...
从压缩包子文件的名称来看,“程序”可能包含了项目的执行文件或者源代码文件,这些文件通常以.py为扩展名,是Python代码的载体。“数据库”可能包含了用于存储和检索数据的结构,如SQLite、MySQL等关系型数据库,...
7. **执行文件**:包含“可执行文件”表明项目可能还包括了将Python代码打包成独立的可执行程序的步骤,这通常会用到py2exe、PyInstaller等工具,以便在没有Python环境的计算机上运行。 8. **版本控制**:良好的...
在提供的压缩包文件"人脸相似度检测sface480X64D"中,"480X64D"可能代表模型的特定配置,例如网络结构的输入尺寸(480x480像素)和特征层的维度(64维)。这个模型可能经过了特定的参数优化,适用于特定大小的输入...
- BCompare.exe和BComp.exe:这是BCompare主程序的可执行文件,前者可能是32位版本,后者可能是64位版本。 - License.html:包含软件的许可协议,用户在使用前应阅读并同意。 - 飞翔下载说明.txt:可能是下载站...