CN111045670A - 一种二进制代码与源代码间复用关系的识别方法与装置 - Google Patents

一种二进制代码与源代码间复用关系的识别方法与装置 Download PDF

Info

Publication number
CN111045670A
CN111045670A CN201911282855.7A CN201911282855A CN111045670A CN 111045670 A CN111045670 A CN 111045670A CN 201911282855 A CN201911282855 A CN 201911282855A CN 111045670 A CN111045670 A CN 111045670A
Authority
CN
China
Prior art keywords
multiplexing
binary
code
open source
file
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201911282855.7A
Other languages
English (en)
Other versions
CN111045670B (zh
Inventor
袁子牧
冯牧玥
霍玮
李丰
肖扬
班固
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Institute of Information Engineering of CAS
Original Assignee
Institute of Information Engineering of CAS
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Institute of Information Engineering of CAS filed Critical Institute of Information Engineering of CAS
Priority to CN201911282855.7A priority Critical patent/CN111045670B/zh
Publication of CN111045670A publication Critical patent/CN111045670A/zh
Application granted granted Critical
Publication of CN111045670B publication Critical patent/CN111045670B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明涉及一种二进制代码与源代码间复用关系的识别方法与装置。该方法包括:构建用于展示开源组件的库文件与源文件间的映射关系的编译依赖图;利用编译依赖图,计算源代码与二进制代码间的相似度,识别出单一复用、混合复用和部分复用;通过对二进制代码与开源组件的已匹配特征集进行对比,识别嵌套复用;根据识别出的复用关系生成复用关系图。本发明从现实软件中常见的代码复用关系划分出四种复用类型,并针对四种复用类型判断二进制代码与源代码间是否确实存在复用关系,对干扰相似性检测的复用类型进行剔除,能够有效地识别二进制代码和源代码间的复用关系。

Description

一种二进制代码与源代码间复用关系的识别方法与装置
技术领域
本发明属于程序分析领域,关注代码静态分析方向,具体分类并识别二进制代码和源代码间的多类包含关系。
背景技术
复用关系识别用于准确识别并描述代码间的包含关系。尽管代码复用问题有很多相关研究,却通常只是作为代码相似性检测的研究背景,很少有研究讨论并处理不同的复用关系类型。在多数研究中,复用检测等价于代码相似性检测,只对开源组件的完整克隆进行识别。然而代码间的复用关系其实是复杂的多对多关系。一个二进制文件可能包含多个开源组件的代码,也可能只复用了一个开源组件的部分代码。另外,开源组件自身也可能复用了更基础的开源组件,这使得准确的复用关系识别和描述更加困难。本发明总结了四类复杂代码复用类型,分别是单一复用、混合复用、部分复用和嵌套复用。
单一复用指一个二进制文件仅复用了一个开源组件的完整代码,混合复用指一个二进制文件复用了多个开源组件的代码。这两类复用类型相对容易识别。计算代码相似度时,以一个开源组件为基本单元,而非一个二进制文件,就可以识别这两类复用。大部分代码复用检测方向的成果都能够识别这两类复用类型。
有时,一个开源组件可以被编译为多个二进制文件,每个二进制文件都只对应一部分源代码。这种只包含开源组件部分源代码的二进制文件属于部分复用。部分复用的分析比混合复用复杂很多,因为二进制文件与开源组件的代码相似度可能较低,其对应关系难以被识别出来。“Identifying Open-Source License Violation and 1-day SecurityRisk at Large Scale”一文所提出的OSSPolice方法就对这类复用进行了讨论,但OSSPolice无法正确识别这类复用,会出现系统性的误报。“Detecting software theftvia system call based birthmarks”可以检测代码部分复用,但并没有针对性的处理方法,也没有相关实验对结果进行有效验证,因此实际效果尚不明确。
当上层开源组件本身还复用了其他基础开源组件,那么复用了该上层组件的二进制软件就嵌套复用了其他基础开源组件,即如果包含了上层开源组件代码的同时,也包含了基础开源组件的代码。然而嵌套复用是一种假式复用,因为二进制软件中开源组件相同功能的代码看似来自于开源组件自身,实际来自于上层组件中的部分代码,这样的误报错判了漏洞分析中的源代码分析目标,应该被识别并去除。在现有研究成果中,只有OSSPolice能够正确识别嵌套复用。OSSPolice先对源代码进行源代码包结构分析和源代码特征提取,构建了复用关系,并将复用关系识别结果以层次索引的方式用于二进制代码与源代码间特征匹配中,以消除嵌套复用的影响。但是实现源代码复用关系构建需要花费较高的开发成本,而且相关技术与目标问题并不相关,并不是最佳的解决方案。
发明内容
本发明针对上述问题,提供一种二进制代码与源代码间复用关系的识别方法与装置,以有效识别二进制代码和源代码间的复用关系,得到合理的相似性检测结果。
本发明采用的技术方案如下:
一种二进制代码与源代码间复用关系的识别方法,包括以下步骤:
构建用于展示开源组件的库文件与源文件间的映射关系的编译依赖图;
利用编译依赖图,计算源代码与二进制代码间的相似度,识别出单一复用、混合复用和部分复用;
通过对二进制代码与开源组件的已匹配特征集进行对比,识别嵌套复用;
根据识别出的复用关系生成复用关系图。
进一步地,根据编译指令构建所述编译依赖图,分别获取库文件与对象文件间的生成关系,以及对象文件与源代码文件间的生成关系,从而将源文件映射到库文件上,并且识别出与库文件无关的源文件。
进一步地,所述利用编译依赖图,计算源代码与二进制代码间的相似度,识别出单一复用、混合复用和部分复用,包括:若二进制文件仅与一个开源组件的完整代码的相似度超过阈值,则二进制文件与开源组件存在单一复用关系;若二进制文件与多个开源组件库文件的相似度超过阈值,则存在混合复用关系;若二进制文件与包含多个库文件的开源组件存在复用关系,则存在部分复用关系。
进一步地,假设X为一个特定的二进制文件,Y为开源组件中的一个开源库,F(Y)为开源库Y的全部特征,length(F(Y))为特征个数,MF(X,Y)为开源库Y与二进制文件X的全部匹配特征,即已匹配特征集;对于两个开源库Y1和Y2,通过以下方式判定X是否复用Y1或Y2,以及Y1和Y2是否存在嵌套复用关系:
第一种情况:
Figure BDA0002317235100000021
Figure BDA0002317235100000031
第二种情况:
MF(X,Y1)≈MF(X,Y2)
Figure BDA0002317235100000032
其中,
Figure BDA0002317235100000033
表示得出结论,≈表示两者特征集合近似相等,根据设定的阈值来判断;reuses表示复用。
进一步地,采用以下步骤得到二进制代码与开源组件的已匹配特征集:
对源代码、二进制代码提取特征,包括:字符串、导出函数、字符串数组、全局常量数组、全局枚举数组、复杂Switch/Case结构、复杂If/Else结构;
对提取出的特征进行特征匹配,其中,字符串型特征采用精确匹配算法,数字型特征采用基于二进制片段检索的匹配算法,控制流型特征采用基于语义等价判断的匹配算法。
进一步地,所述复用关系图共包含四类结点,分别是二进制软件、二进制文件、库文件和开源组件;其中,二进制软件包含一个或多个二进制文件,开源组件包含一个或多个库文件,二进制文件复用一个或多个库文件;通过关联四类节点获得复用关系图,并构建二进制软件到开源组件的对应关系。
基于同一发明构思,本发明还提供一种二进制代码与源代码间复用关系的识别装置,其包括:
编译依赖图构建模块,负责构建用于展示开源组件的库文件与源文件间的映射关系的编译依赖图;
复用类型识别模块,负责利用所述编译依赖图构建模块构建的编译依赖图,计算源代码与二进制代码间的相似度,识别出单一复用、混合复用和部分复用;并通过对二进制代码与开源组件的已匹配特征集进行对比,识别嵌套复用;
生成复用关系图生成模块,负责根据所述复用类型识别模块识别出的复用类型生成复用关系图。
本发明的有益效果是:
实际上,复杂的代码复用关系在现实软件中普遍存在,而现有成果不能很好地处理复杂复用情况,得到合理的相似性检测结果。因此本发明从现实软件中常见的代码复用关系划分出四种复用类型,并针对四种复用类型判断二进制代码与源代码间是否确实存在复用关系,对干扰相似性检测的复用类型进行剔除,能够有效地识别二进制代码和源代码间的复用关系。
附图说明
图1是单一复用和混合复用的示例。
图2是部分复用的示例。
图3是嵌套复用的示例。
图4是编译依赖图示例。
图5是默认编译命令示例。
图6为嵌套复用代码特征匹配集示意图。
图7为复用关系图示例。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步详细说明。
在绝大多数现有的代码复用检测技术中,都没有对代码的多种复用类型进行讨论,而是将复用关系简单的理解为目标代码的完整复用。实际上,代码复用是一种复杂的多对多关系。本发明将代码复用类型划分为四类,分别为单一复用、混合复用、部分复用和嵌套复用。
单一复用指的是二进制代码包含且仅包含一个开源组件的完整代码,即二进制文件是由目标开源组件的完整代码编译所得。例如大量软件中存在的文件名为zlib.dll或zlib1.dll的二进制文件(如图1),通常是对开源组件zlib进行了单一复用,由zlib的源代码直接编译所得。单一复用是最常见的复用类型,也是现有研究成果普遍能有效处理的复用类型。
混合复用指的是二进制代码包含多个开源组件的完整代码,或同时包含开源组件的完整代码和软件定制代码,即二进制文件由不少于两个来源的完整代码编译所得。复杂软件的主程序和包含定制功能的动态链接库通常混合复用了多个开源组件。例如福昕阅读器(Foxit Reader)的入口程序FoxitReader.exe(如图1),同时包含了包括zlib,libjpeg,libtiff,libpng,libcurl等多个开源组件的完整代码和软件定制代码(customizedcode)。混合复用也是非常常见的复用类型,大部分现有研究成果在计算相似度时把开源组件作为被比较对象,可以有效处理混合复用。
部分复用指的是二进制代码仅包含一个开源组件的部分代码。当一个开源组件的完整代码可以编译出多个二进制文件,且单个二进制文件仅包含开源组件的部分代码时,可以说该二进制文件部分复用了目标开源组件。当二进制代码除包含开源代码的部分代码外,还包含软件定制代码时,也可以称为部分复用。对于较为复杂的开源库,部分复用也是较为常见的。例如开源组件OpenSSL的完整代码可以编译出两个二进制文件,libeay32.dll和ssleay32.dll,则两个动态链接库分别部分复用了OpenSSL。如果一个软件在libeay32.dll的基础上添加了定制代码进行封装,形成新的动态链接库,如图2所示,则该动态链接库也部分复用了OpenSSL。另外,广泛使用的开源组件ICU(InternationalComponents for Unicode)也是一个典型案例。ICU的完整源代码可以编译出六个动态链接库,但通常软件只需使用其中的部分库文件即可满足功能需求,因此复用ICU的软件通常只部分复用了ICU中的小部分代码和功能。
嵌套复用指的是二进制代码包含至少一个开源组件的完整代码,且该组件复用了其他基础开源组件的代码,从而出现二进制代码复用了基础开源组件的假象。嵌套复用是一类假式复用,出现的频率不是很高,但是对复用检测结果有极大的影响。例如修图软件美图秀秀存在一个动态链接库FreeImage.dll,该二进制代码复用了开源组件FreeImage,而FreeImage复用了libpng,libjpeg,openjpeg,openexr等9个基础开源组件的代码,如图3所示。这导致FreeImage.dll间接的复用了其他9个基础开源组件,可以说FreeImage.dll嵌套复用了这9个基础开源组件的代码。然而FreeImage.dll中基础开源组件相关的二进制代码并非来自于基础开源组件的源代码本身,而是来自于FreeImage库的源代码。对于漏洞分析场景来说,虽然FreeImage.dll中确实包含基础开源组件的代码,却只包含FreeImage的漏洞,而不包含9个基础开源组件的漏洞。如果不能排除这类误报,将大大增加漏洞发现过程的误报率,增加漏洞验证成本。
对于这四种复用类型,部分复用和嵌套复用需要经过针对性的复用关系识别来发现,而单一复用和混合复用则是不包含上述两种复杂复情况的复用类型。通过已有代码相似度计算工具的识别,可以直接识别出单一复用、混合复用和部分复用。当二进制文件仅与一个开源组件的完整代码的相似度超过阈值,则二进制文件与开源组件存在单一复用关系。当二进制文件与多个开源组件库文件的相似度超过阈值,则存在混合复用关系。当二进制文件与包含多个库文件的开源组件存在复用关系,则存在部分复用关系。
嵌套复用关系和二进制代码与源代码间代码相似度无关,是开源组件内部复用关系引出的一类复用类型。嵌套复用是一类假式复用,将导致复用验证过程成本大大增加,因此需要对此类复用类型进行识别并剔除。可以通过对某个特定二进制文件与所有开源组件库文件匹配上的特征集进行对比,识别嵌套复用。本发明通过比对开源组件与指定二进制程序的已匹配特征集来识别真实复用关系与嵌套复用关系。假设X为一个特定的二进制文件,Y为开源组件中的一个开源库,F(Y)为开源库Y的全部特征,length(F(Y))为特征个数,MF(X,Y)为开源库Y与二进制文件X的全部匹配特征。对于两个开源库Y1和Y2:
第一种情况:当存在
Figure BDA0002317235100000064
Figure BDA0002317235100000061
第二种情况:当存在
MF(X,Y1)≈MF(X,Y2)
Figure BDA0002317235100000062
其中,
Figure BDA0002317235100000063
表示得出结论,≈表示两者特征集合近似相等,根据设定的阈值来判断;reuses表示复用。
至此,可判定X是否复用Y1或Y2,Y1和Y2是否存在嵌套复用关系。
其中,关于“开源组件与指定二进制程序的已匹配特征集”也即“开源库Y与二进制文件X的全部匹配特征”,可以采用现有的特征匹配方法来得到匹配特征集。下面本发明提出一种新的方式来进行特征匹配以得到匹配特征集:
1)对源代码、二进制代码提取7种特征,分别是字符串、导出函数、字符串数组、全局常量数组、全局枚举数组、复杂Switch/Case结构、复杂If/Else结构。
a)常用特征:导出函数和字符串特征。排除非导出和被去除的情况,导出函数和字符串几乎不受编译优化影响。
b)常量特征和控制流特征:字符串数组、全局常量数组、全局枚举数组、复杂Switch/Case结构、复杂If/Else结构。其中,字符串数组、全局常量数组和全局枚举数组可统称为全局常量数组。与整数常量相比,全局常量数组并不是汇编指令中的立即数,而是二进制文件数据段(.data段和.rdata段)中的一段固定的连续二进制数据,不受编译优化影响。复杂switch/case结构和复杂if/else特征这两类控制流型特征在代码中也相对稳定,其中复杂指特征值长度相较于一般switch/case、if/else更长,因而在复用比对中辨识度更高。虽然其具体的代码指令可能会受编译优化影响有所变化,但是其核心代码逻辑,即switch/case结构中case取值和分支的分布情况,以及if/else中连续嵌套的常数比较过程中的常数序列,是几乎不受编译优化影响的。
2)对源代码、二进制代码中同时提取的7种特征进行匹配(比对)。
这7种代码特征可以划分为三种类型,分别是导出函数、字符串和字符串数组等字符串型特征,全局常量数组和全局枚举数组等数字型特征,以及复杂switch/case结构和复杂if/else结构等控制流型特征。这三类特征有完全不同的表达方式,所以需要使用不同的匹配算法。其中,字符串型特征采用精确匹配算法,数字型特征采用基于二进制片段检索的匹配算法,控制流型特征采用基于语义等价判断的匹配算法。分别说明如下:
a)字符串型特征采用精确匹配算法:检测二进制代码中是否存在与源代码特征完全相同的特征。这种匹配算法不考虑特征可能出现的转换,以实现海量字符串型特征的快速匹配;
b)数字型特征采用基于二进制片段检索的匹配算法:将源代码中提取出的数字型全局数组特征转化成二进制数据流,通过在二进制文件的数据段(.data段和.rdata段)中进行检索,以判断源代码特征是否在二进制文件中存在;
c)控制流型特征采用基于语义等价判断的匹配算法:Switch/case特征的核心语义信息是单个switch/case结构中case的数量、分支的数量以及分布关系;当源代码switch/case特征与二进制代码switch/case特征的case数量一致,分支数量相同,以及没有default分支的源代码switch/case特征可以与任意一个减去一个分支的二进制代码switch/case特征相匹配,则认为二进制代码与源代码的switch/case特征具有相同语义,匹配成功。If/else特征的核心语义是函数内的最长常数比对路径,二进制代码的if/else特征中受编译优化过程中等价指令替换的影响,会引入大量的源码无关常数0,因此对源代码和二进制代码中的最长常数比对路径进行匹配,得到匹配结果。
本发明的代码复用关系识别步骤依次为:构建编译依赖图、识别复用类型、生成复用关系图。
(1)构建编译依赖图。开源组件编译依赖图用来展示开源组件库文件与源文件间的映射关系。图4展示了一个编译依赖图的示例。如图中所示,本发明根据编译指令构建编译依赖图,分别获取库文件(.so文件或.a文件)与对象文件(.o文件)间的生成关系,以及对象文件(.o文件)与源代码文件(.c文件或.cpp文件)间的生成关系,从而将源代码文件映射到库文件上,并且识别出与库文件无关的源文件。
获取的编译命令如图5所示。编译命令中可以提取出每个操作的输入文件和输出文件,对于没有显式声明输出文件名的,将采用默认名称进行填充。例如示例中的第一个编译命令可以得到源文件stubdata.cpp到对象文件stubdata.o的映射关系,第二个编译命令可以获得errorcode.o等多个对象文件与库文件libicuuc.so.60的映射关系。另外,还可以通过编译命令中的-shared和-soname等参数识别出输出文件libicuuc.so.60是一个库文件。
经过上述映射关系的构建,可以获得开源组件库文件与源文件的完整映射关系。以开源组件ICU为例,ICU共能够编译出6个库文件。编译依赖图可以识别出全部6个库文件所依赖的源文件,结果见表1。可以发现高达62.3%的源代码文件与库文件无关,去除掉这些无关代码的特征后,相似性分析的准确率会显著提升。另外还可以发现ICU的6个库文件由互不交叉的6组源代码编译生成,但并非所有开源组件都有这样的特性。很多开源组件中不同的库文件中会使用部分相同源文件,在这种情况下,各去向的源文件数量的和将大于源文件总数量。
表1.开源组件ICU库文件与源文件映射关系统计
源文件去向 源文件数量 占比
libicui18n.so 214 18.2%
libicuuc.so 186 15.9%
libicutu.so 24 2.0%
libicuio.so 12 1.0%
libicutest.so 6 0.5%
libicudata.so 1 0.1%
其它(示例、测试等) 731 62.3%
全部源文件 1174 100%
(2)识别复用类型。经过工具或人工分析,通过代码相似度的计算,可以直接识别出单一复用、混合复用和部分复用。嵌套复用关系和二进制代码与源代码间代码相似度无关,是开源组件内部复用关系引出的一类复用类型。
利用构建的编译依赖图,通过计算源代码与二进制代码间的相似度,识别出单一复用、混合复用和部分复用;通过将二进制代码与开源组件的库文件的已匹配特征集进行对比,识别嵌套复用,具体见前文的计算公式。
以开源组件FreeImage和zlib为例,FreeImage复用了基础库zlib,这导致复用了FreeImage库的二进制程序与zlib的相似度也很高,而复用了zlib的二进制程序与FreeImage也有相似的匹配特征集,从而引入了复用关系识别上的一些困难。如图6所示,对于复用了FreeImage的二进制程序FreeImage.dll来说((a)图),当其与FreeImage库和zlib库的相似度都高于阈值时,难以判断究竟是否与FreeImage、zlib都存在复用关系;而对于复用了zlib的二进制程序zlib.dll来说((b)图),当与zlib、FreeImage库的相似度都高于阈值时,同样难以判断真实复用情况。
在FreeImage和zlib的例子中,FreeImage.dll与FreeImage、zlib库的复用关系符合第一种情况,
Figure BDA0002317235100000081
而F(FreeImage)的规模远大于F(zlib),因此可以识别出FreeImage库复用了zlib库,而FreeImage.dll复用了FreeImage,嵌套复用了zlib,与zlib不存在真实复用关系。Zlib.dll与FreeImage、zlib库的复用关系则符合第二种情况,zlib.dll与zlib存在复用关系,与FreeImage不存在复用关系。
(3)生成复用关系图。复用关系图用来记录并直观的展示二进制软件与开源组件间的复用关系。如图7所示,复用关系图共包含四类结点,分别是二进制软件、二进制文件、库文件和开源组件。其中,二进制软件包含一个或多个二进制文件,开源组件包含一个或多个库文件,二进制文件复用了一个或多个库文件。通过关联上述四类节点,可以获得复用关系图,并构建二进制软件到开源组件的对应关系,从而开展进一步的探索,如通过代码复用关系发现复杂闭源软件的组件复用型漏洞。
基于同一发明构思,本发明的另一个实施例提供一种二进制代码与源代码间复用关系的识别装置,其包括:
编译依赖图构建模块,负责构建用于展示开源组件的库文件与源文件间的映射关系的编译依赖图;
复用类型识别模块,负责利用所述编译依赖图构建模块构建的编译依赖图,计算源代码与二进制代码间的相似度,识别出单一复用、混合复用和部分复用;并通过对二进制代码与开源组件的已匹配特征集进行对比,识别嵌套复用;
生成复用关系图生成模块,负责根据所述复用类型识别模块识别出的复用类型生成复用关系图。
其中各模块的具体实施过程参加前文对本发明方法的描述。
基于同一发明构思,本发明的另一个实施例提供一种电子装置(计算机、服务器、智能手机等),其包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行本发明方法中各步骤的指令。
基于同一发明构思,本发明的另一个实施例提供一种计算机可读存储介质(如ROM/RAM、磁盘、光盘),所述计算机可读存储介质存储计算机程序,所述计算机程序被计算机执行时,实现本发明方法的各个步骤。
以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的原理和范围,本发明的保护范围应以权利要求书所述为准。

Claims (10)

1.一种二进制代码与源代码间复用关系的识别方法,其特征在于,包括以下步骤:
构建用于展示开源组件的库文件与源文件间的映射关系的编译依赖图;
利用编译依赖图,计算源代码与二进制代码间的相似度,识别出单一复用、混合复用和部分复用;
通过对二进制代码与开源组件的已匹配特征集进行对比,识别嵌套复用;
根据识别出的复用关系生成复用关系图。
2.根据权利要求1所述的方法,其特征在于,根据编译指令构建所述编译依赖图,分别获取库文件与对象文件间的生成关系,以及对象文件与源代码文件间的生成关系,从而将源文件映射到库文件上,并且识别出与库文件无关的源文件。
3.根据权利要求1所述的方法,其特征在于,所述利用编译依赖图,计算源代码与二进制代码间的相似度,识别出单一复用、混合复用和部分复用,包括:
若二进制文件仅与一个开源组件的完整代码的相似度超过阈值,则二进制文件与开源组件存在单一复用关系;
若二进制文件与多个开源组件库文件的相似度超过阈值,则存在混合复用关系;
若二进制文件与包含多个库文件的开源组件存在复用关系,则存在部分复用关系。
4.根据权利要求1所述的方法,其特征在于,假设X为一个特定的二进制文件,Y为开源组件中的一个开源库,F(Y)为开源库Y的全部特征,length(F(Y))为特征个数,MF(X,Y)为开源库Y与二进制文件X的全部匹配特征,即已匹配特征集;对于两个开源库Y1和Y2,通过以下方式判定X是否复用Y1或Y2,以及Y1和Y2是否存在嵌套复用关系:
第一种情况:
Figure FDA0002317235090000011
第二种情况:
Figure FDA0002317235090000012
其中,
Figure FDA0002317235090000013
表示得出结论,≈表示两者特征集合近似相等,根据设定的阈值来判断;reuses表示复用。
5.根据权利要求1或4所述的方法,其特征在于,采用以下步骤得到二进制代码与开源组件的已匹配特征集:
对源代码、二进制代码提取特征,包括:字符串、导出函数、字符串数组、全局常量数组、全局枚举数组、复杂Switch/Case结构、复杂If/Else结构;
对提取出的特征进行特征匹配,其中,字符串型特征采用精确匹配算法,数字型特征采用基于二进制片段检索的匹配算法,控制流型特征采用基于语义等价判断的匹配算法。
6.根据权利要求5所述的方法,其特征在于,所述基于二进制片段检索的匹配算法,将源代码中提取出的数字型特征转化成二进制数据流,通过在二进制文件的数据段中进行检索,以判断源代码特征是否在二进制文件中存在。
7.根据权利要求5所述的方法,其特征在于,所述基于语义等价判断的匹配算法包括:对于Switch/case特征,当源代码switch/case特征与二进制代码switch/case特征的case数量一致,分支数量相同,以及没有default分支的源代码switch/case特征能够与任意一个减去一个分支的二进制代码switch/case特征相匹配,则认为二进制代码与源代码的switch/case特征具有相同语义,匹配成功;对于If/else特征,通对源代码和二进制代码中的最长常数比对路径进行匹配,得到匹配结果。
8.根据权利要求1所述的方法,其特征在于,所述复用关系图共包含四类结点,分别是二进制软件、二进制文件、库文件和开源组件;其中,二进制软件包含一个或多个二进制文件,开源组件包含一个或多个库文件,二进制文件复用一个或多个库文件;通过关联四类节点获得复用关系图,并构建二进制软件到开源组件的对应关系。
9.一种二进制代码与源代码间复用关系的识别装置,其特征在于,包括:
编译依赖图构建模块,负责构建用于展示开源组件的库文件与源文件间的映射关系的编译依赖图;
复用类型识别模块,负责利用所述编译依赖图构建模块构建的编译依赖图,计算源代码与二进制代码间的相似度,识别出单一复用、混合复用和部分复用;并通过对二进制代码与开源组件的已匹配特征集进行对比,识别嵌套复用;
生成复用关系图生成模块,负责根据所述复用类型识别模块识别出的复用类型生成复用关系图。
10.一种电子装置,其特征在于,包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行权利要求1~8中任一权利要求所述方法的指令。
CN201911282855.7A 2019-12-13 2019-12-13 一种二进制代码与源代码间复用关系的识别方法与装置 Active CN111045670B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911282855.7A CN111045670B (zh) 2019-12-13 2019-12-13 一种二进制代码与源代码间复用关系的识别方法与装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911282855.7A CN111045670B (zh) 2019-12-13 2019-12-13 一种二进制代码与源代码间复用关系的识别方法与装置

Publications (2)

Publication Number Publication Date
CN111045670A true CN111045670A (zh) 2020-04-21
CN111045670B CN111045670B (zh) 2021-07-13

Family

ID=70236132

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911282855.7A Active CN111045670B (zh) 2019-12-13 2019-12-13 一种二进制代码与源代码间复用关系的识别方法与装置

Country Status (1)

Country Link
CN (1) CN111045670B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112000339A (zh) * 2020-07-09 2020-11-27 北京大学 安卓apk文件依赖组件识别方法及装置
WO2022156056A1 (zh) * 2021-01-19 2022-07-28 南京大学 基于程序源码切片重组的软件动态更新热补丁合成方法
CN114968351A (zh) * 2022-08-01 2022-08-30 北京大学 分级多特征的代码同源分析方法及系统

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101697121A (zh) * 2009-10-26 2010-04-21 哈尔滨工业大学 一种基于程序源代码语义分析的代码相似度检测方法
US20140033186A1 (en) * 2008-08-20 2014-01-30 International Business Machines Corporation Using build history information to optimize a software build process
CN107844705A (zh) * 2017-11-14 2018-03-27 苏州棱镜七彩信息科技有限公司 基于二进制代码特征的第三方组件漏洞检测方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140033186A1 (en) * 2008-08-20 2014-01-30 International Business Machines Corporation Using build history information to optimize a software build process
CN101697121A (zh) * 2009-10-26 2010-04-21 哈尔滨工业大学 一种基于程序源代码语义分析的代码相似度检测方法
CN107844705A (zh) * 2017-11-14 2018-03-27 苏州棱镜七彩信息科技有限公司 基于二进制代码特征的第三方组件漏洞检测方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
RUIAN DUAN,ASHISH BIJLANI等: ""Identifying Open-Source License Violation and 1-day Security"", 《CCS "17:PROCEEDINGS OF THE 2017 ACM SIGSAC CONFERENCE ON COMPUTER AND COMMUNICATIONS SECURITY》 *
王涛: ""面向软件复用的大规模开源资源定位技术研究"", 《中国博士学位论文全文数据库信息科技辑》 *

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112000339A (zh) * 2020-07-09 2020-11-27 北京大学 安卓apk文件依赖组件识别方法及装置
WO2022156056A1 (zh) * 2021-01-19 2022-07-28 南京大学 基于程序源码切片重组的软件动态更新热补丁合成方法
CN114968351A (zh) * 2022-08-01 2022-08-30 北京大学 分级多特征的代码同源分析方法及系统
CN114968351B (zh) * 2022-08-01 2022-10-21 北京大学 分级多特征的代码同源分析方法及系统

Also Published As

Publication number Publication date
CN111045670B (zh) 2021-07-13

Similar Documents

Publication Publication Date Title
Bader et al. Getafix: Learning to fix bugs automatically
CN110245496B (zh) 一种源代码漏洞检测方法及检测器和其训练方法及系统
CN111045670B (zh) 一种二进制代码与源代码间复用关系的识别方法与装置
US7340475B2 (en) Evaluating dynamic expressions in a modeling application
US20190138731A1 (en) Method for determining defects and vulnerabilities in software code
CN102279738B (zh) 标识强连通分量的入口和出口的技术
CN102339252B (zh) 基于xml中间模型以及缺陷模式匹配的静态检测系统
Mahapatra et al. Machine-learning based simulated annealer method for high level synthesis design space exploration
US20190317879A1 (en) Deep learning for software defect identification
CN103729580A (zh) 一种检测软件抄袭的方法和装置
CN111767547B (zh) 一种基于复杂网络社团的软件漏洞检测方法
CN113591093B (zh) 基于自注意力机制的工业软件漏洞检测方法
Wang Learning scalable and precise representation of program semantics
CN112364352A (zh) 可解释性的软件漏洞检测与推荐方法及系统
Rahim et al. Software defect prediction with naïve Bayes classifier
CN116305158A (zh) 一种基于切片代码依赖图语义学习的漏洞识别方法
CN103176905A (zh) 一种缺陷关联方法及装置
Gonzalez et al. Almost rerere: Learning to resolve conflicts in distributed projects
CN110737469A (zh) 一种功能粒度上基于语义信息的源代码相似度评估方法
TW201218008A (en) Intelligent architecture creator
CN116975881A (zh) 一种基于llvm的漏洞细粒度定位方法
CN115130043B (zh) 基于数据库的数据处理方法、装置、设备及存储介质
CN115640155A (zh) 基于语句依赖和补丁相似性的程序自动修复方法与系统
CN111078227B (zh) 一种基于代码特征的二进制代码与源代码相似性分析方法与装置
CN115576840A (zh) 基于机器学习的静态程序插桩检测方法及装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant