二进制可执行文件的相似度分析一直是一个难题。大家都知道,即使是同一份源代码,使用同一个编译器,可用不同的编译参数进行编译后,代码也会产生极大的差异。
当发生有人因为盗用别人的源代码而产生的侵权后,如果不能够将二者的源代码拿出进行比较的话,判断是否抄袭非常困难。因此,一直以来或多或少,总会有人无 所顾忌的将开放源代码的软件拿来加入到自己的软件中,或者干脆就是在那些源代码的基础上稍加修改和更换了版权信息就宣称是自己研发的。因为他们知道,只要 不把自己的源代码公诸于众,那么抄袭就很难判定。
下面我就详细说一下我采用的分析方法。
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%。
分享到:
相关推荐
与应用程序可执行文件安装在相同文件夹中的外部 .manifest 文件包括, 也可能以资源的形式包括在该可执行文件中。 ///////////////////////////////////////////////////////////////////////////// 其他注释: ...
文件类型分布如下:Java源文件65个,HTML页面11个,JavaScript脚本4个,配置文件2个,CSS样式文件2个,Git忽略配置1个,可执行JAR文件1个,Markdown说明文件1个,数据文件1个,以及分类文件1个。
Word2Vec 作者: Mathur电子邮件: LinkedIn: : 编写此python脚本的... 我将word2vec训练在可用于文件“ train.csv”的“产品标题”上。 您需要执行以下操作来训练Word2Vec python Word2Vec_AverageVectors.py 该脚本
应用程序差异 APK差异 这个 python 脚本对两个 Android ... 对可执行文件使用西葫芦而不是 bsdiff 实验仍在尝试 将所有内容加载到 RAM 中并执行强力“bsdiff”以查看是否会导致进一步减少时 使用 对于 bsdiff 实现。
易于部署:单个静态链接的可执行文件 安装 git clone https://github.com/mobarski/thorvald cd thorvald/src go build thorvald.go 简单的例子 输入文件 item users i1 u1,u2,u3,u4,u5,u6,u7 i2 u1,u3,u5,u7,u9 i3 ...
我们需要做的就是选择两个应用程序,然后按“比较”按钮。 只需等待几秒钟,它将为您提供两个应用程序的相似性。 相似度为0到1。 ##当前版本和开发环境 WuFan当前版本:1.0.2 JDK版本:Java 1.8.0_25 IDE:...
1.基于学术论文、维基百科等数据集,通过TextRank和Seq2Seq算法对模型进行优化和改进,构建一体化的文章摘要、标题和关键词辅助生成系统,设计、对接可视化界面,将程序封装为可执行文件并在PC端直接运行。...
它旨在以图形方式显示不同二进制可执行文件中的更改。 查看我们的以了解有关其设计的更多信息! 该插件使用作为二进制相似度的niave度量。 首先,将这些哈希值与基于图相似度的方法结合使用,以“对齐”二进制文件...
根据源代码生成的可执行文件为finger.exe,可直接运行 编译源代码所需Python环境为3.7,其他库在requirements.txt 【使用说明】 可直接运行finger.exe 参数说明 单人手指图片个数:训练集中一根手指录入的图片数,...
这将构建一个可移植的可执行文件,该文件可以在兼容的Matlab运行时环境中的任何位置运行,而无需复制许可证。 您的计算环境可能具有有关此过程的特定文档。 我根据Matlab 2015b构建代码,并避免使用近年来引入的数据...
# 执行 InfomationGet/InsertAdmissionData.py 插入数据 cd InfomationGet # create database and sheet python MysqlOperation.py # insert data python InsertAdmissionData.py # 5.打开软件 cd SystemUi python ...
可调整相似度水平的高效结果 易于使用的界面,轻松预览重复项,然后单击即可选择要删除的重复项 扫描时开始显示结果,您不必等待删除重复项 智能自动选择模式,可在删除图片时节省时间 在100.000张图片15Gb存档...
自动文档 该项目包含4个主要的python模块 ...qa_pairs.py-这是系统中的可执行代码,包含要运行的主类。 方法qa_pairs()加载安然电子邮件的子集以进行评估。 然后使用textblob库将电子邮件拆分为有
木兰湾是用于管理个人消费、锻炼、音乐、阅读、健康、饮食、人生经历等各个衣食住行信息的个人信息管理系统,通过提醒、计划模块利用调度系统来统计分析执行情况,并通过积分和评分体系来综合评估个人的总体状态。...
3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在...
【使用场景】任务相对比较简单一些或实时性要求高的任务,如语义相似度等句子对任务、分类任务;比较难的任务如阅读理解等,可以使用其他大模型。 例如,可以使用Tensorflow Lite在移动端进行部署,本文随后针对这...
实例099 比对论坛中帖子的相似度 132 实例100 对用户注册的密码进行加密和解密 132 实例101 保护URL地址中传递的参数 133 实例102 解析URL地址中传递的编码参数 134 实例103 转义帖子中的特殊字符 135 实例104 获取...
实例099 比对论坛中帖子的相似度 132 实例100 对用户注册的密码进行加密和解密 132 实例101 保护URL地址中传递的参数 133 实例102 解析URL地址中传递的编码参数 134 实例103 转义帖子中的特殊字符 135 实例104 获取...
文件结构相似度:60% 代码结构相似度:60% 代码相似度:80% ---------------------------------------------------------------- 【程序主要功能】 1、全站生成html静态页,分类页个性化的title、meta,易于搜索...