首页 / 专利库 / 人工智能 / 相似性得分 / 一种基于代码特征的二进制代码与源代码相似性分析方法与装置

一种基于代码特征的二进制代码与源代码相似性分析方法与装置

阅读:789发布:2020-05-08

专利汇可以提供一种基于代码特征的二进制代码与源代码相似性分析方法与装置专利检索,专利查询,专利分析的服务。并且本 发明 涉及一种基于代码特征的二进制代码与源代码相似性分析方法与装置。该方法包括:提取源代码与二进制代码中共同存在的具备抗编译优化特性的代码特征;通过对提取出的代码特征进行特征匹配,计算源代码与二进制代码间的相似度;根据计算出的相似度得出 软件 的二进制代码是否复用源代码的结论。提取的所述代码特征包括:字符串、导出函数、字符串数组、全局常量数组、全局枚举数组、复杂Switch/Case结构、复杂If/Else结构。本发明能够提供准确的代码相似性检测,能够广泛处理跨源代码和二进制代码间的比较,克服现有方法仅依赖于特定字符串或符号信息的局限性。,下面是一种基于代码特征的二进制代码与源代码相似性分析方法与装置专利的具体信息内容。

1.一种基于代码特征的二进制代码与源代码相似性分析方法,其特征在于,包括以下步骤:
提取源代码与二进制代码中共同存在的具备抗编译优化特性的代码特征;
通过对提取出的代码特征进行特征匹配,计算源代码与二进制代码间的相似度;
根据计算出的相似度得出软件的二进制代码是否复用源代码的结论。
2.根据权利要求1所述的方法,其特征在于,所述的提取源代码与二进制代码中共同存在的具备抗编译优化特性的代码特征,采用两个评价标准挑选比对特征:特征能否体现开源组件的核心功能或算法,以及特征能否抗编译优化影响。
3.根据权利要求1所述的方法,其特征在于,提取的所述代码特征包括:字符串、导出函数、字符串数组、全局常量数组、全局枚举数组、复杂Switch/Case结构、复杂If/Else结构。
4.根据权利要求1所述的方法,其特征在于,所述的对提取出的代码特征进行特征匹配,包括:字符串型特征采用精确匹配算法,数字型特征采用基于二进制片段检索的匹配算法,控制流型特征采用基于语义等价判断的匹配算法。
5.根据权利要求4所述的方法,其特征在于,所述基于二进制片段检索的匹配算法,将源代码中提取出的数字型特征转化成二进制数据流,通过在二进制文件的数据段中进行检索,以判断源代码特征是否在二进制文件中存在。
6.根据权利要求4所述的方法,其特征在于,所述基于语义等价判断的匹配算法包括:
对于Switch/case特征,当源代码switch/case特征与二进制代码switch/case特征的case数量一致,分支数量相同,以及没有default分支的源代码switch/case特征能够与任意一个减去一个分支的二进制代码switch/case特征相匹配,则认为二进制代码与源代码的switch/case特征具有相同语义,匹配成功;
对于If/else特征,通对源代码和二进制代码中的最长常数比对路径进行匹配,得到匹配结果。
7.根据权利要求1所述的方法,其特征在于,通过将匹配上的代码特征集的加权得分总和除以被匹配对象的全部特征集的加权得分和,计算源代码与二进制代码间的相似度;所述相似度的计算公式为:
其中,X表示一段二进制代码,Y表示一段源代码,F(Y)是源代码Y所包含的全部代码特征,MF(X,Y)是二进制代码X与源代码Y的已匹配特征集,i和j是单个代码特征,Score(i)和Score(j)是代码特征i和j的权重。
8.根据权利要求7所述的方法,其特征在于,代码特征的权重的计算公式为:
其中,x指单个代码特征,N是源代码库的数量,N(x)是包含代码特征x的开源库数量;
W(x)是代码特征的信息量权重,其计算公式为:
其中,GetStrWeight(x)是基于字符串特殊字符和特殊字符组合计算字符串型特征的信息量权重,基于现有TF-IDF算法对字符串在所有开源代码库中的出现频率进行计算;li为二进制流中第i个连续的0或1数据的长度;GetLength(x)为控制流特征中特征内容的长度。
9.一种基于代码特征的二进制代码与源代码相似性分析装置,其特征在于,包括:
特征提取模,负责提取源代码与二进制代码中共同存在的具备抗编译优化特性的代码特征;
特征匹配模块,负责通过对提取出的代码特征进行特征匹配;
相似度计算模块,负责计算源代码与二进制代码间的相似度,根据计算出的相似度得出软件的二进制代码是否复用源代码的结论。
10.一种电子装置,其包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行权利要求1~8中任一权利要求所述方法的指令。

说明书全文

一种基于代码特征的二进制代码与源代码相似性分析方法与

装置

技术领域

[0001] 本发明属于程序分析领域,关注代码静态分析方向,具体验证二进制代码和源代码是否包含重合的特征集合,以进一步确认二进制代码是否复用源代码,这是一种基于特征比对的静态分析技术。

背景技术

[0002] 目前,绝大部分商业软件均为闭源软件,即源代码不公开的软件。随着近年来软件复杂度的提升,难以很好地应对针对复杂闭源软件的安全审计。本发明以复杂软件中普遍存在的组件复用为切入点,发现二进制代码中所复用的源代码。因流行源代码库更新时,常会描述其在安全方面的修补,通过比对确认二进制代码和源代码之间的复用关系,可进一步发现复杂软件所存在的安全问题。
[0003] 代码间的复用比对可根据分析目标的不同而划分为源代码间、二进制代码间、二进制代码与源代码间三类。由于源代码和二进制代码所包含的代码信息内容和粒度不同,导致针对源代码和针对二进制代码的分析技术有很大差异,也导致三类代码比对所使用的技术有较大差异。
[0004] 特征提取和比较是基于静态分析方式进行比对的主要步骤。源代码间的比对依赖于代码文本本身,变量名、数据结构、表达式等信息可直接从文本中获取,因此可直接采用文本分析的方式;进一步的,可以对源代码进行语法和语义的分析,提取抽象语法树、控制流结构、函数调用关系等信息进行更精确地比对。二进制代码是计算机中最底层的代码表达形式,损失了很多代码语义特征,同时增加了底层特征,如栈结构等,在进行二进制代码间比对时无法判断差异是来自源代码间的区别还是底层实现的区别;因此,复杂特征,如基本的I/O行为、执行序列、语义哈希等,以及基于流图和调用关系图的比对算法被业界设计出来用于二进制间代码比对。
[0005] 本发明主要应用于跨源代码和二进制代码间的比较,相关研究成果相对较少,且通常只能分析比对带有保留符号信息的二进制代码。尤其是众多复杂软件选择去除符号信息,以增加软件被逆向分析的难度,使得一些研究成果不能很好地应用于源代码与二进制代码间的比对。Binary Analysis Tool(BAT)是近年所提出的首个可识别二进制代码与源代码间复用关系的系统工具,主要通过常量字符串识别固件二进制代码中的开源库代码;不过,对于Windows下的可执行程序而言,开源库代码的字符串不一定会被其保留,且一些开源库作为组件发布时,也有可能不包含可用于比对的有效字符串信息,仅仅使用字符串特征用于比对并不可靠。OSSPolice是用于Android C++/Java代码复用识别的工具,它的一部分工作室基于字符串和导出函数进行特征匹配,其通过层次索引的方式应用于大规模分析,但Android C++代码会暴露出导出函数,而像Windows下的可能将开源组件的导出函数封装为内部函数调用,使得OSSPolice并不适用。FIBER通过分析开源库安全补丁对代码的影响生成补丁的语义特征,并匹配二进制代码以判断软件是否已打上安全补丁,但FIBER假设二进制程序中的所有符号信息都是已知的,与通常闭源软件中二进制代码符号信息不可得的情形不符。
[0006] 综上,现有研究成果依赖于符号信息或字符串信息,不能广泛处理跨源代码和二进制代码间的比较,尤其是对Windows下的可执行文件适用性比较差。

发明内容

[0007] 为了实现跨源代码与二进制代码的复用比对,克服现有方法仅依赖于特定字符串或符号信息的局限性,本发明选取能同时从源代码与二进制代码中提取且具备抗编译优化特性的代码特征,经特征比对和匹配计算代码相似度,并得出软件的二进制代码是否复用比对开源代码库的结论。
[0008] 本发明提出一种抗编译优化的源代码与二进制代码特征提取和比对方法,该方法选取在源代码及其同源二进制代码中共同存在的代码特征,特征选取很少或不受编译优化过程影响,并通过特征匹配计算源代码与二进制代码间的相似程度,使得比对不仅仅依赖于特定字符串或符号信息。
[0009] 本发明所采用的技术方案是:
[0010] 一种基于代码特征的二进制代码与源代码相似性分析方法,包括以下步骤:
[0011] 提取源代码与二进制代码中共同存在的具备抗编译优化特性的代码特征;
[0012] 通过对提取出的代码特征进行特征匹配,计算源代码与二进制代码间的相似度;
[0013] 根据计算出的相似度得出软件的二进制代码是否复用源代码的结论。
[0014] 进一步地,采用两个评价标准挑选比对特征:特征能否体现开源组件的核心功能或算法,以及特征能否抗编译优化影响。因二进制代码作为低级语言,损失了很多源代码中的语义信息,如不再有变量名称,数据结构信息也难以还原,结构体被展开,数据仅在取值类指令中保留有长度信息;同时,编译器会在二进制代码中引入额外的编译器行为和特征,如栈保护函数,系统异常处理机制等。这些变化使得源代码与二进制代码较难被比对,而这两个标准将有助于克服这些影响,提高比对成功率。具体所选取的特征如表1所示,其中V表示使用该特征。
[0015] 表1.所选取的特征及其受编译优化影响程序的说明
[0016]
[0017] a)常用特征:导出函数和字符串特征。排除非导出和被去除的情况,导出函数和字符串几乎不受编译优化影响。
[0018] b)常量特征和控制流特征:字符串数组、全局常量数组、全局枚举数组、复杂Switch/Case结构、复杂If/Else结构。其中,字符串数组、全局常量数组和全局枚举数组可统称为全局常量数组。与整数常量相比,全局常量数组并不是汇编指令中的立即数,而是二进制文件数据段(.data段和.rdata段)中的一段固定的连续二进制数据,不受编译优化影响。复杂switch/case结构和复杂if/else特征这两类控制流型特征在代码中也相对稳定,其中复杂指特征值长度相较于一般switch/case、if/else更长,因而在复用比对中辨识度更高。虽然其具体的代码指令可能会受编译优化影响有所变化,但是其核心代码逻辑,即switch/case结构中case取值和分支的分布情况,以及if/else中连续嵌套的常数比较过程中的常数序列,是几乎不受编译优化影响的。
[0019] 本发明选择7种特征,分别是字符串、导出函数、字符串数组、全局常量数组、全局枚举数组、复杂Switch/Case结构、复杂If/Else结构。
[0020] 进一步地,对源代码、二进制代码中同时提取的7种抗编译优化特征进行比对。这7种代码特征可以划分为三种类型,分别是导出函数、字符串和字符串数组等字符串型特征,全局常量数组和全局枚举数组等数字型特征,以及复杂switch/case结构和复杂if/else结构等控制流型特征。这三类特征有完全不同的表达方式,所以需要使用不同的匹配算法。其中,字符串型特征采用精确匹配算法,数字型特征采用基于二进制片段检索的匹配算法,控制流型特征采用基于语义等价判断的匹配算法。分别说明如下:
[0021] a)字符串型特征采用精确匹配算法:检测二进制代码中是否存在与源代码特征完全相同的特征。这种匹配算法不考虑特征可能出现的转换,以实现海量字符串型特征的快速匹配;
[0022] b)数字型特征采用基于二进制片段检索的匹配算法:将源代码中提取出的数字型全局数组特征转化成二进制数据流,通过在二进制文件的数据段(.data段和.rdata段)中进行检索,以判断源代码特征是否在二进制文件中存在;
[0023] c)控制流型特征采用基于语义等价判断的匹配算法:Switch/case特征的核心语义信息是单个switch/case结构中case的数量、分支的数量以及分布关系;当源代码switch/case特征与二进制代码switch/case特征的case数量一致,分支数量相同,以及没有default分支的源代码switch/case特征可以与任意一个减去一个分支的二进制代码switch/case特征相匹配,则认为二进制代码与源代码的switch/case特征具有相同语义,匹配成功。If/else特征的核心语义是函数内的最长常数比对路径,二进制代码的if/else特征中受编译优化过程中等价指令替换的影响,会引入大量的源码无关常数0,因此对源代码和二进制代码中的最长常数比对路径进行匹配,得到匹配结果。
[0024] 进一步地,完成特征匹配之后,可根据匹配结果计算源代码与二进制代码间的比对相似度。相似度的核心思路为,将匹配上的代码特征集的加权得分总和除以被匹配对象的全部特征集的加权得分和,其计算公式如下:
[0025]
[0026] 其中,X表示一段二进制代码,Y表示一段源代码,F(Y)是源代码Y所包含的全部代码特征,MF(X,Y)是二进制代码X与源代码Y的已匹配特征集,i和j是单个代码特征,Score(i)和Score(j)是代码特征i和j的权重。
[0027] 进一步地,代码特征的权重的计算公式为:
[0028]
[0029] 对于上一式子,x指单个代码特征,N是源代码库的数量,N(x)是包含代码特征x的开源库数量。同时,W(x)是代码特征的信息量权重,其计算方法如下:
[0030]
[0031] 其中,GetStrWeight(x)是基于字符串特殊字符和特殊字符组合计算字符串型特征的信息量权重,基于现有TF-IDF算法对字符串在所有开源代码库中的出现频率进行计算,这是因为当比对代码规模较大时,数量庞大的代码特征就会体现出较强的重复性;li为二进制流中第i个连续的0或1数据的长度;GetLength(x)为控制流特征中特征内容的长度。
[0032] 进一步地,基于公式Similarity(X,Y)的计算,可得出二进制代码段X和源代码段Y的相似度。用户可自行设定相似度阈值,判断X是否复用了Y。
[0033] 基于同一发明构思,本发明还提供一种基于代码特征的二进制代码与源代码相似性分析装置,其包括:
[0034] 特征提取模块,负责提取源代码与二进制代码中共同存在的具备抗编译优化特性的代码特征;
[0035] 特征匹配模块,负责通过对提取出的代码特征进行特征匹配;
[0036] 相似度计算模块,负责计算源代码与二进制代码间的相似度,根据计算出的相似度得出软件的二进制代码是否复用源代码的结论。
[0037] 本发明的有益效果是:
[0038] 本发明设计了一种面向源代码和二进制代码的抗编译特征提取和比对方法。二进制代码是机器语言,而源代码是高级语言,两者在代码表达和所含代码信息上存在巨大差异。本发明所设计实现的方法选择提取相应抗编译代码特征并进行特征匹配,通过计算相似度得出二进制代码与源代码的复用关系,以此提供准确的代码相似性检测。该方法能广泛处理跨源代码和二进制代码间的比较,克服现有方法仅依赖于特定字符串或符号信息的局限性。附图说明
[0039] 图1是本发明方法的步骤流程图
[0040] 图2是switch/case和if/else结构代码片段示例。
[0041] 图3是全局常量数组W(x)计算示例。

具体实施方式

[0042] 为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步详细说明。
[0043] 本实施例的一种基于代码特征的二进制代码与源代码相似性分析方法,其总体步骤流程如图1所示,首先提取源代码与二进制代码中共同存在的具备抗编译优化特性的代码特征,然后通过对提取出的代码特征进行特征匹配,计算源代码与二进制代码间的相似度,然后根据计算出的相似度得出软件的二进制代码是否复用源代码的结论。
[0044] 本实施例从源代码、二进制代码中同时提取7种抗编译优化特征并进行比对,特征提取是其中的第一步且关键的实施步骤。以下分别介绍源代码特征和二进制代码特征的提取实施步骤。
[0045] (1)源代码特征提取方法:LLVM和Clang是非常成熟的开源C/C++编译器,提供众多源代码分析接口,本发明通过接口获取源代码特征。源代码特征提取基于开源编译框架Clang和LLVM开发工具来实现。源代码包含字符串、导出函数、字符串数组、全局常量数组、全局枚举量数组、复杂switch/case结构、复杂if/else结构等全部7类代码特征。前5类特征可以从Clang分析源代码后生成的抽象语法树中提取。其中,字符串在抽象语法树中是类型为LITERAL的语素(Token),函数名在抽象语法树中是类型为FUNCTION_DECL或CXX_METHOD的游标(Cursor)。三类数组特征在抽象语法树中的结构相对复杂,如表2所示,需要由多层结构来判断。
[0046] 表2.源代码特征在抽象语法树中的对应结构
[0047]
[0048] (2)二进制代码特征提取方法:二进制代码中提取的特征与源代码有所不同。因为源代码损失了数据结构等信息,三个数组特征是无法从二进制代码中还原出来的。因此针对这三类特征,本发明没有从二进制代码中直接提取,而是将源代码中提取出的特征转化成二进制数据流,在二进制文件的数据段直接进行检索来判断是否存在。对于导出函数、字符串、switch/case结构和if/else结构,字符串特征通过IDAPython的get_strlist_qty等接口实现提取。export特征通过PE文件结构解析工具来提取。Switch/case特征从IDA提供的控制流图中通过get_switch_info等函数提取。If/else特征通过分析控制流图中的基本块与跳转关系来获取,对于每个函数,从返回基本块(Return Block)开始向前回溯。如果一个基本块的所有前驱都已经分析获得了最长if/else比对常数序列,则其最长if/else对比常数序列为所有前驱中最长的常数序列,再加上自身所包含的比较指令中的常量。如果还存在没有分析过的前驱,则先分析前驱。待所有基本块分析完成后,函数内最长的比较常数序列为多个返回基本块中最长的常数序列。
[0049] (3)对源代码和二进制代码特征进行比对:代码特征匹配采用了精确匹配、基于二进制片段检索的匹配和基于语义等价判断的匹配等三种方式来实现。
[0050] a)字符串型特征采用精确匹配算法:检查源代码和二进制代码中的字符串是否完全一致;
[0051] b)数字型特征采用基于二进制片段检索的匹配算法:将源代码中的全局常量数组和全局枚举数组等两类数字型特征转换为二进制数据流,并在二进制文件的数据段中直接进行检索来判断是否匹配;
[0052] c)控制流型特征采用基于语义等价判断的匹配算法:其方法如前文的发明内容所述。
[0053] 图2为switch/case和if/else结构代码片段示例。其中switch/case结构,其中case数量为6个,分支数量为2个,分布关系为[[8],[0,3,4,5,10]],即数值8将进入第一个分支,数值[0,3,4,5,10]将进入第二个分支。考虑到源代码中会有缺省default分支,而这一分支所对应的取值是从源代码的case列表中无法分析获得的,因此在源代码与二进制代码特征比对的过程中,会将没有default分支的源代码switch/case特征与减去任意一个分支的二进制代码switch/case特征进行匹配。另外在编译过程中,case的取值可能会被优化为从0开始的取值,如一个case取值序列[100,101,102]可能会被优化为[0,1,2]。因此,当分支分布完全相同,或当源代码分支分布被优化为从0开始的取值后与二进制代码的分支分布完全相同,就认为两者的分支分布匹配。总的来说,当源代码switch/case特征与二进制代码switch/case特征的case数量一致,分支数量相同,以及没有default分支的源代码switch/case特征可以与任意一个减去一个分支的二进制代码switch/case特征相匹配,则认为二进制代码与源代码的switch/case特征具有相同语义,匹配成功。对于if/else特征,图2中代码片段的最长常数比对路径为[0x80,0x800,0x10000,0x200000]。而二进制代码的if/else特征中受编译优化过程中等价指令替换的影响,会引入大量的源码无关常数0。如判断两值是否相等的源代码if(a>b),可能被转换为判断两值的差是否为0的二进制指令sub r1,r2和cmp r1,0从而引入常数0,因此需要去掉二进制代码最长常数比对路径中的常数0。对二进制代码特征处理后,可对两者源代码和二进制代码中的最长常数比对路径进行匹配,得到匹配结果。
[0054] (4)计算相似度:主要在于发明内容中所述的W(x)计算,其中,字符串型特征的计算GetStrWeight(x)采用既有的TD-IDF方法计算基于出现频率的信息量权重;控制流型特征的计算GetLength(x)为特征内容的长度。当特征x为数字型特征时,如图3所示,以全局常量数组[0x1,0x10,0x100,0x1000]和[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a]为例,前者的计算方法为 后者为即当0与1切换越频繁,即连续的0或1越短时,数据的出现概率更低,其所包含的信息量越大。
[0055] 在计算相似度后,可进一步设置相似度阈值,判定二进制代码段是否复用了源代码段。
[0056] 为说明方法效果,本发明选取了1000个商业软件和264个常用开源库项目,通过源代码与二进制代码特征提取比对,统计出以下10个最常被复用的开源库项目。
[0057] 表3. 10个最常被复用的开源库项目
[0058] 开源库名称 复用频率 开源库名称 复用频率zlib 384次 tinyxml 106次
libjpeg 257次 libpng 94次
sqlite 138次 ffmpeg 94次
openssl 124次 libtiff 84次
qt 112次 libjpeg 77次
[0059] 基于同一发明构思,本发明的另一个实施例提供一种基于代码特征的二进制代码与源代码相似性分析装置,其包括:
[0060] 特征提取模块,负责提取源代码与二进制代码中共同存在的具备抗编译优化特性的代码特征;
[0061] 特征匹配模块,负责通过对提取出的代码特征进行特征匹配;
[0062] 相似度计算模块,负责计算源代码与二进制代码间的相似度,根据计算出的相似度得出软件的二进制代码是否复用源代码的结论。
[0063] 基于同一发明构思,本发明的另一个实施例提供一种电子装置(计算机、服务器、智能手机等),其包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行本发明方法中各步骤的指令。
[0064] 基于同一发明构思,本发明的另一个实施例提供一种计算机可读存储介质(如ROM/RAM、磁盘、光盘),所述计算机可读存储介质存储计算机程序,所述计算机程序被计算机执行时,实现本发明方法的各个步骤。
[0065] 以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的原理和范围,本发明的保护范围应以权利要求书所述为准。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈