CN113553056A - 基于图匹配的llvm中间语言差分分析方法及系统 - Google Patents

基于图匹配的llvm中间语言差分分析方法及系统 Download PDF

Info

Publication number
CN113553056A
CN113553056A CN202110825310.7A CN202110825310A CN113553056A CN 113553056 A CN113553056 A CN 113553056A CN 202110825310 A CN202110825310 A CN 202110825310A CN 113553056 A CN113553056 A CN 113553056A
Authority
CN
China
Prior art keywords
function
matched
basic block
instruction
matching
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
CN202110825310.7A
Other languages
English (en)
Other versions
CN113553056B (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.)
Zhejiang University ZJU
Original Assignee
Zhejiang University ZJU
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 Zhejiang University ZJU filed Critical Zhejiang University ZJU
Priority to CN202110825310.7A priority Critical patent/CN113553056B/zh
Publication of CN113553056A publication Critical patent/CN113553056A/zh
Application granted granted Critical
Publication of CN113553056B publication Critical patent/CN113553056B/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/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/22Matching criteria, e.g. proximity measures

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Artificial Intelligence (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Evolutionary Biology (AREA)
  • Evolutionary Computation (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于图匹配的LLVM中间语言差分分析方法及系统,包括:收集并编译两个版本源代码,获取两个版本源代码的待匹配LLVM中间代码;根据待匹配LLVM中间代码进行函数匹配得到待匹配函数对,依据函数的哈希值对未改动的函数对进行过滤,以获得发生改动的函数对;确定发生改动的函数对中的敏感指令;获取并静态分析发生改动的函数对的程序控制流图,依据静态分析结果对程序控制流图进行基本块的细粒度划分;依据细粒度划分结果,对发生改动的函数对中包含敏感指令的基本块进行匹配后,再对剩下的基本块进行匹配,最终得到所有匹配的基本块对;对匹配的基本块对进行指令序列对比,以确认删除指令、增加指令。

Description

基于图匹配的LLVM中间语言差分分析方法及系统
技术领域
本发明涉及软件工程代码分析领域,尤其涉及一种基于图匹配的LLVM中间语言差分分析方法及系统。
背景技术
在软件工程领域,随着软件代码的更新迭代,软件代码复用变得十分普遍。例如很多手机厂商或物联网厂商使用的内核均复用了开源的Linux内核。软件工程鼓励软件开发者对软件进行复用,以减少软件开发成本和开发周期。软件复用减少了软件开发人员的工作量,然而在软件代码的复用过程中,由于软件应用场景和功能需求的变化,下游软件开发人员需要对上游软件代码进行定制。在软件代码定制化的过程中,软件开发者在原有代码版本的基础上,增加开发者所需功能并且删除不必要的代码实现。由于软件代码版本更新的频率加快,参与软件开发的开发者人数变多,软件复用的情况变得越来越复杂,软件开发人员对软件的管理变得越来越困难。
为了准确定位软件代码在定制过程中的代码删除和代码增加信息,以便对开发的软件进行规范化和安全管理(软件漏洞分析和补丁存在性分析等),研究人员提出了多种代码差分分析方法。目前,源代码的软件代码差分分析方法有的基于文本对比,有的基于抽象语法树匹配。然而基于文本对比的代码差分分析方法对程序的结构特征不敏感,因此无法对简单的代码移动进行定位。在对代码进行差分分析时,使用基于文本对比的代码差分分析方法会造成很高的误报(将未曾改动的代码段报告为新增/删除的代码段)和漏报(将新增/删除的代码段报告为未曾改动的代码段)。基于文本对比的代码差分分析方法过于粗粒度,其处理方式与源代码的代码结构并不匹配。为了克服基于文本的代码差分分析方法的局限性,研究人员提出了基于抽象语法树的代码差分分析方法。基于抽象语法树的代码差分分析方法将同一份源代码的两个版本均转化为抽象语法树,然后对两个抽象语法树的结点进行匹配,从而获取代码的修改信息。然而,对于结构复杂的源代码程序来说,将源代码解析为抽象语法树并且对抽象语法树中的结点进行正确的匹配是十分困难的。因此,基于抽象语法树的代码差分分析方法的对比精度仍有待提升。除了对源代码进行差分分析,相关研究人员提出了底层虚拟机(LLVM)中间语言(IR)差分分析方法LLVM diff。然而LLVMdiff对程序的控制流十分敏感,只有程序基本块的结束指令相同时,LLVM diff才会对该基本块的后续基本快进行分析。因此,使用LLVM diff对代码中间语言进行分析时,代码后续差异很难被LLVM diff捕捉到。此外,为了对二进制代码进行差分分析,近年来,很多基于图神经网络的二进制代码差分分析方法被广泛使用。这些基于图神经网络的二进制代码差分分析方法提出将软件代码中的函数、基本块和代码指令转化为对应的函数嵌入、基本块嵌入和指令嵌入(能够表征函数、基本块和指令特征的数学向量)。通过对函数嵌入、基本块嵌入和指令嵌入进行向量相似度比较,能够获得两个函数、基本快和指令的相似度。然而,二进制代码的差分分析是非确定性的,其仅仅能输出两个对比的函数的相似度,无法输出两个函数确切的差异。因此二进制代码的差分分析无法直接用于准确定位软件代码在定制过程中的代码删除和代码增加信息。
为了对软件代码在定制化过程中的修改部分进行准确的定位,图匹配方法可以用来对函数基本块进行匹配,进而报告代码的修改部分。图匹配方法不仅考虑了图结构特征,还能对图语义特征进行分析,因此可以用来对软件代码进行差分分析。在图匹配方法中,软件代码首先被划分为多个函数,每个函数被表征为包含函数特征的函数控制流图。通过对函数控制流图中的结点进行匹配,准确定位函数的修改部分。然而,被广泛使用的图匹配方法McGregor和Koch存在以下两个缺点:(1)这两种方法只能匹配完全相同的代码基本块,无法匹配存在部分修改的代码基本块;(2)这两种图匹配方法的时间复杂的非常高,无法对大规模的软件代码进行快速分析。
综上,在软件工程领域中,对两个软件代码版本进行全面快速准确地差分分析是十分有必要的,且仍然需要克服以下两个挑战:(1)由于程序定制化过程中,软件开发人员对代码的修改十分复杂,函数控制流图结点的匹配情况比较复杂,不容易对函数控制流图结点进行匹配;(2)准确的图匹配是NP难问题,时间复杂度非常高,降低修改部分代码定位的时间复杂度是具有挑战性的。
发明内容
鉴于上述,本发明的目的是提供一种基于图匹配的LLVM中间语言差分分析方法及系统,通过图匹配的方式对软件工程领域中不同版本的中间语言的增删进行准确定位。
第一方面,实施例提供的一种基于图匹配的LLVM中间语言差分分析方法,包括以下步骤:
收集并编译两个版本源代码,获取两个版本源代码的待匹配LLVM中间代码;
根据待匹配LLVM中间代码进行函数匹配得到待匹配函数对,依据函数的哈希值对未改动的函数对进行过滤,以获得发生改动的函数对;
确定发生改动的函数对中的敏感指令;
获取并静态分析发生改动的函数对的程序控制流图,依据静态分析结果对程序控制流图进行基本块的细粒度划分;
依据细粒度划分结果,对发生改动的函数对中包含敏感指令的基本块进行匹配后,再对剩下的基本块进行匹配,最终得到所有匹配的基本块对;
对匹配的基本块对进行指令序列对比,以确认删除指令、增加指令。
在一个实施例中,编译源代码过程中,尽可能多地打开编译配置选项对源代码进行编译以覆盖更多的源代码;使用-o2优化级别且打开-g编译选项允许编译开发者获取调试信息;当一个版本的源代码编译完成后,在编译与其对比的另外一版本源代码时,采用相同的makefile文件进行编译以减少编译选项不同带来的误报和漏报,最终获取两个版本源代码的待匹配LLVM中间代码。
在一个实施例中,获取待匹配函数对的过程为:静态分析待匹配LLVM中间代码获取源代码中每个函数的函数名,依据函数名对两个版本源代码中函数进行匹配,以形成待匹配函数对。
在一个实施例中,所述依据函数的哈希值对未改动的函数对进行过滤包括:
对待匹配函数对中的每个函数进行归一化,包括:对函数中的每条指令,删除编译过程中附带的编译信息;遍历函数中每条指令的操作数,将每一个静态单赋值变量重新命名为字符串常量,且添加操作数的位置;
对归一化的函数进行哈希值计算,包括:遍历函数中的每个基本块,将基本块中的每条指令当作字符串常量拼接起来,对拼接结果进行哈希值计算以得到函数的哈希值;
若待匹配函数对中的两个函数的哈希值相同,表明函数没有发生改动,则过滤掉未改动的函数对;若待匹配函数对中的两个函数的哈希值不相同,表明函数发生改动,即获得发生改动的函数对。
在一个实施例中,所述确定发生改动的函数对中的敏感指令包括:
对发生改动的函数对中的每一条指令进行遍历,当遍历到敏感指令时,记录敏感指令、敏感指令类别、指令所在的基本块号;其中,敏感指令包括变量初始化指令、加/减锁指令、资源释放指令、安全检查指令;
其中,变量初始化指令通过函数调用memset、memcpy、__memcpy、memmove、strncpy、strncpy_from_user、copy_from_user、__copy_from_user、init等进行识别;加/减锁指令通过函数调用lock、unlock进行识别;资源释放指令通过函数调用kfree、devfree、dev_kfree_skb、dev_kfree_skb_any、vfree、free、kfree_rcu、kfree_skb、usb_free_urb进行识别;安全检查指令本质是条件语句指令,条件语句的后续分支应当至少有一条错误处理分支和一条程序运行分支。
在一个实施例中,对发生改动的函数对的程序控制流图进行静态分析时,分析函数中所有条件语句、条件语句中的条件变量、条件语句所在基本块中条件变量赋值的位置;然后在条件变量赋值的位置新增一条无条件跳转指令,通过该无条件跳转指令将条件语句所在的基本块划分为两个基本块,实现细粒度划分。
在一个实施例中,通过LLVM Store指令识别条件变量赋值的位置;调用LLVMsplitBasicBlock函数对基本块进行细粒度划分。
在一个实施例中,通过相似度比较实现对包含敏感指令的基本块的匹配,并将匹配成功的基本块对存入公共子图。
在一个实施例中,所述对剩下的基本块再进行匹配包括:
(a)对公共子图中每对基本块对的邻居结点进行相似度比较,实现邻居结点的匹配,获得匹配的基本块对,其中,邻居节点为基本块对中基本块的邻居基本块;
(b)将发生改动的函数对中未匹配的基本块分分别划分到第一集合和第二集合,计算第一集合中每个第一基本块与第二集合中所有第二基本块的相似度,将相似度大于第一阈值的第二基本块加入每个第一基本块对应的第三集合;将第三集合中所有第二基本块按照函数控制流的顺序拼接形成新基本块;
(c)计算新基本块与对应的第一基本块的相似度,将相似度大于第二阈值的第一基本块与第三集合中所有第二基本块匹配起来;
(d)当相似度小于第二阈值时,重新排列组合第三集合中所有第二基本块形成新基本块,并重新执行步骤(c),直到第三集合中第二基本块能够与第一基本块匹配起来或遍历完第三集合中所有排列组合获得的新基本块。
在一个实施例中,在获取发生改动的函数对的程序控制流图后,遍历函数对的基本块,以获取每个基本块特征,依据基本块特征计算基本块的相似度。
在一个实施例中,采用通过levenshtein算法、Jaccard算法计算基本块特征的相似度,将每对基本块的所有基本块特征相似度的均值作为每对基本块的相似度。
第二方面,实施例提供的一种基于图匹配的LLVM中间语言差分分析系统,包括:
收集编译模块,用于收集并编译两个版本源代码,获取两个版本源代码的待匹配LLVM中间代码;
过滤模块,用于根据待匹配LLVM中间代码进行函数匹配得到待匹配函数对,依据函数的哈希值对未改动的函数对进行过滤,以获得发生改动的函数对;
敏感指令识别模块,用于确定发生改动的函数对中的敏感指令;
分析划分模块,用于获取并静态分析发生改动的函数对的程序控制流图,依据静态分析结果对程序控制流图进行基本块的细粒度划分;
图匹配模块,用于依据细粒度划分结果,对发生改动的函数对中包含敏感指令的基本块进行匹配后,再对剩下的基本块进行匹配,最终得到所有匹配的基本块对;
比对模块,对匹配的基本块对进行指令序列对比,以确认删除指令、增加指令。
上述实施例提供的技术方案,具有的有益效果至少包括:
提出了基于图匹配的中间语言差分分析方法,解决了软件工程领域中,快速并准确定位软件代码在定制过程中的代码删除和代码增加信息问题。能够高效实现代码的差分分析,具有实用性;
采用使用基本块中包含的敏感指令作为快速区分基本块的特征进行快速图匹配的方法,以提高中间代码差分分析效率;采用的基于公共子图的邻居结点匹配方法,能够提高基本块的邻居结点匹配成功的概率;
再者,图匹配方法能够全面考虑函数结构信息,与基于文本匹配和基于抽象语法树匹配的差分分析方法相比,基于图匹配的匹配方式提高了基本块匹配的精度,进而提高了代码差分分析的精度。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图做简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动前提下,还可以根据这些附图获得其他附图。
图1和图2为一实施例提供的基于图匹配的LLVM中间语言差分分析方法的流程示意图;
图3为一实施例提供的函数细粒度控制流图的生成示意图;
图4为一实施例提供的函数图匹配流程图;
图5为一实施例提供的基于图匹配的LLVM中间语言差分分析系统的结构示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施方式仅仅用以解释本发明,并不限定本发明的保护范围。
图1和图2为一实施例提供的基于图匹配的LLVM中间语言差分分析方法的流程示意图。如图1和图2所示,实施例提供的基于图匹配的LLVM中间语言差分分析方法适用于软件版本管理和软件安全分析目的,具体包括以下步骤:
步骤1,收集并编译两个版本源代码,获取两个版本源代码的待匹配LLVM中间代码。
实施例中,对两个版本源代码进行编译的过程即是对待匹配的源代码进行预处理的过程,具体为:尽可能多地打开编译配置选项对源代码进行编译以覆盖更多的源代码;使用-o2优化级别且打开-g编译选项允许编译开发者获取调试信息;当一个版本的源代码编译完成后,在编译与其对比的另外一版本源代码时,采用相同的makefile文件进行编译以减少编译选项不同带来的误报和漏报,最终获取两个版本源代码的待匹配LLVM中间代码。
步骤2,根据待匹配LLVM中间代码进行函数匹配得到待匹配函数对,依据函数的哈希值对未改动的函数对进行过滤,以获得发生改动的函数对。
实施例中,根据待匹配LLVM中间代码进行函数匹配得到待匹配函数对的过程为:通过静态分析对LLVM中间代码进行遍历,获取源代码中每个函数的函数名;通过函数名对两个源代码版本中的函数进行匹配,得到待匹配函数对。
实施例中,在获得待匹配函数对之后,依据函数的哈希值对未改动的函数对进行过滤的过程为:
首先,对待匹配函数对中的每个函数进行归一化。归一化的主要目的在于:(1)删除LLVM中间语言中无需进行差分分析的编译信息。(2)对中间语言中静态单赋值变量进行统一命名,以减少代码差分分析的误报。具体地,函数归一化过程包括:对于每一条LLVM指令,删除编译过程中附带的编译信息,其中,编译信息包括prefecth指令、metadata和signext信息等;遍历LLVM指令的每一个操作数,将每一个静态单赋值变量重新命名为字符串常量“VAR”,并加该操作数的位置。
然后,对归一化后的函数进行哈希值计算,若函数对中的两个函数的哈希值相同,表明函数没有发生改动,则去除该函数对,不做进一步差分分析。否则,认为该函数对发生改动,则将这些发生改动的函数对加入到待分析队列中。
具体地,遍历函数中的每一个基本块,将基本块中的每一条指令当作字符串常量拼接起来,用拼接结果代表函数的字符串,对字符串使用MD5信息摘要方法获取对应的函数哈希值;对每一对函数的函数哈希值进行比对,若函数哈希值相同,则说明定制化过程中函数没有发生修改,无需进行差分分析。否则认为函数对发生改动并将函数对加入待分析队列。
步骤3,确定发生改动的函数对中的敏感指令。
实施例中,在识别敏感指令时,取出待分析队列中的每一对函数,对函数中的每一条指令进行遍历,当遍历到敏感指令时,记录下敏感指令、敏感指令类别和指令所在的基本块号;实施例中,认为变量初始化指令、加/减锁指令、资源释放指令和安全检查指令为敏感指令。获取的敏感指令可用于进行快速基本块匹配。因为函数中包含的敏感指令数目是有限的和易于区分的。此外,包含相同敏感指令的基本块的相似度可能是非常高的,很可能被匹配起来。
具体实现时,变量初始化指令可通过函数调用memset、memcpy、__memcpy、memmove、strncpy、strncpy_from_user、copy_from_user、__copy_from_user、init等进行识别;加/减锁指令可通过lock和unlock等函数调用进行识别;资源释放指令可通过kfree、devfree、dev_kfree_skb、dev_kfree_skb_any、vfree、free、kfree_rcu、kfree_skb、usb_free_urb等函数调用进行识别;安全检查指令本质是条件语句指令,此外该条件语句的后续分支应当至少有一条错误处理分支和一条程序运行分支。通过以上特征可对安全检查指令进行识别。
步骤4,获取并静态分析发生改动的函数对的程序控制流图,依据静态分析结果对程序控制流图进行基本块的细粒度划分。
实施例中,对程序控制流图进行细粒度切分来避免函数基本块匹配过程中,安全检查指令匹配的误报和漏报。其核心是将与其他指令连接的条件指令切分为一个单独的基本块,以便进行细粒度的基本块匹配。如图3所示,具体过程为:首先获取发生改动的函数对的程序控制流图,并对程序控制流图进行静态分析,分析函数中所有条件语句、条件语句中的条件变量、条件语句所在基本块中条件变量赋值的位置;然后在条件变量赋值的位置新增一条无条件跳转指令,通过该无条件跳转指令将条件语句所在的基本块划分为两个基本块,获取函数的属性控制流图,实现细粒度划分。
具体实现时,条件变量赋值的位置可通过LLVM Store指令进行识别;可调用LLVMsplitBasicBlock函数对基本块进行划分。
步骤5,依据细粒度划分结果,对发生改动的函数对中包含敏感指令的基本块进行匹配后,再对剩下的基本块进行匹配,最终得到所有匹配的基本块对。
实施例中,基本块的匹配过程是基于图匹配来实现的,包括对两个函数中包含敏感指令的基本块进行快速匹配,将匹配好的包含敏感指令的基本块加入公共子图;对公共子图中的所有基本块的邻居结点进行匹配,完成所有一对一基本块匹配;完成一对一基本块匹配后,进行一对多基本块匹配,以得到多个基本块对。
实施例中,如图4所示,具体的匹配过程为:
(a)对函数对中每一个函数包含的基本块进行划分,每一个函数的所有的基本块可分为两组:包含敏感指令的基本块的SBB组、不含敏感指令的基本块的CBB组;通过基本块相似度比较,对包含敏感指令的基本块进行快速遍历和匹配,将能够匹配起来的基本块对存入公共子图。
(b)对公共子图中的一对基本块,获取每个基本块的邻居结点,对每一对基本块的邻居结点进行遍历和相似度计算,快速完成邻居结点的匹配;循环执行步骤(b)直到公共子图中的所有匹配的基本块的邻居结点都被遍历过。其中,邻居节点为基本块对中基本块的邻居基本块。优先匹配公共子图的邻居结点是因为如果两个基本块指向或来自公共子图中匹配的基本块,则这两个基本块很有可能是相似。
(c)将发生改动的函数对中所有未匹配的基本块分别归入第一集合RBB1和第二集合RBB2,对于RBB1中的每个第一基本块rbb1,计算其与RBB2中每个第二基本块rbb2的相似度,若基本块相似度大于阈值θ1,则将rbb2加入每个rbb1对应的第三集合N中;将加入第三集合N中的每个rbb2按照函数控制流的顺序拼接起来,形成一个新基本块bbn。
(d)对新基本块bbn和对应的rbb1进行相似度计算,若相似度大于阈值θ0,则将rbb1与第三集合N中的所有rbb2匹配起来,否则,按照排列组合重新拼接第三集合N中的rbb2形成新基本块,重新执行步骤(d),直到第三集合N中基本块能够与rbb1匹配起来或遍历完集合N中的所有排列组合。
实施例中,在获取发生改动的函数对的程序控制流图后,还遍历函数对的基本块,以获取每个基本块特征,其中,基本块特征包括:指令序列、函数调用序列、指令分布、敏感指令、字符串/整型常量等。
对基本块进行相似度计算时,可通过获取的基本块特征对基本块进行相似度计算。每一对基本块的相似度为所有基本块特征相似度的平均值。特征的相似度可通过levenshtein算法和Jaccard算法进行计算。若两个基本块的相似度大于规定的阈值θ0,则认为两个基本块应该被匹配起来。将匹配好的基本块加入公共子图中。
步骤6,对匹配的基本块对进行指令序列对比,以确认删除指令、增加指令。
实施例中,遍历所有匹配起来的基本块对,对基本块对的指令序列进行比较,报告软件代码的增加和删除。
基于同样的发明构思,如图5所示,实施例还提供了一种基于图匹配的LLVM中间语言差分分析系统500,包括:
收集编译模块510,用于收集并编译两个版本源代码,获取两个版本源代码的待匹配LLVM中间代码;
过滤模块520,用于根据待匹配LLVM中间代码进行函数匹配得到待匹配函数对,依据函数的哈希值对未改动的函数对进行过滤,以获得发生改动的函数对;
确定模块530,用于确定发生改动的函数对中的敏感指令;
分析划分模块540,用于获取并静态分析发生改动的函数对的程序控制流图,依据静态分析结果对程序控制流图进行基本块的细粒度划分;
匹配模块550,用于依据细粒度划分结果,对发生改动的函数对中包含敏感指令的基本块进行匹配后,再对剩下的基本块进行匹配,最终得到所有匹配的基本块对;
比对模块560,对匹配的基本块对进行指令序列对比,以确认删除指令、增加指令。
需要说明的是,上述实施例提供的LLVM中间语言差分分析装置在进行LLVM中间语言差分分析时,应以上述各功能模块的划分进行举例说明,可以根据需要将上述功能分配由不同的功能模块完成,即在终端或服务器的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的LLVM中间语言差分分析装置与LLVM中间语言差分分析方法实施例属于同一构思,其具体实现过程详见LLVM中间语言差分分析方法实施例,这里不再赘述。
上述实施例提供提出的基于图匹配的中间语言差分分析技术,解决了软件工程领域中,快速并准确定位软件代码在定制过程中的代码删除和代码增加信息问题。能够高效实现代码的差分分析,具有实用性;实施例提出的快速进行图匹配的方法(使用基本块中包含的敏感指令作为快速区分基本块的特征),为提高中间代码差分分析的效率提供了一种新的解决思路。实施例提出的基于图匹配的基本块匹配算法,也就是基于公共子图进行邻居结点匹配的新方法,能够提高基本块结点匹配成功的概率。此外,图匹配方法能够全面考虑函数结构信息,与基于文本匹配和基于抽象语法树匹配的差分分析方法相比,本发明提出的基于图匹配方法提高了基本块匹配的精度,进而提高了代码差分分析的精度。
以上所述的具体实施方式对本发明的技术方案和有益效果进行了详细说明,应理解的是以上所述仅为本发明的最优选实施例,并不用于限制本发明,凡在本发明的原则范围内所做的任何修改、补充和等同替换等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种基于图匹配的LLVM中间语言差分分析方法,其特征在于,包括以下步骤:
收集并编译两个版本源代码,获取两个版本源代码的待匹配LLVM中间代码;
根据待匹配LLVM中间代码进行函数匹配得到待匹配函数对,依据函数的哈希值对未改动的函数对进行过滤,以获得发生改动的函数对;
确定发生改动的函数对中的敏感指令;
获取并静态分析发生改动的函数对的程序控制流图,依据静态分析结果对程序控制流图进行基本块的细粒度划分;
依据细粒度划分结果,对发生改动的函数对中包含敏感指令的基本块进行匹配后,再对剩下的基本块进行匹配,最终得到所有匹配的基本块对;
对匹配的基本块对进行指令序列对比,以确认删除指令、增加指令。
2.如权利要求1所述的基于图匹配的LLVM中间语言差分分析方法,其特征在于,编译源代码过程中,尽可能多地打开编译配置选项对源代码进行编译以覆盖更多的源代码;使用-o2优化级别且打开-g编译选项允许编译开发者获取调试信息;当一个版本的源代码编译完成后,在编译与其对比的另外一版本源代码时,采用相同的makefile文件进行编译以减少编译选项不同带来的误报和漏报,最终获取两个版本源代码的待匹配LLVM中间代码。
3.如权利要求1所述的基于图匹配的LLVM中间语言差分分析方法,其特征在于,获取待匹配函数对的过程为:静态分析待匹配LLVM中间代码获取源代码中每个函数的函数名,依据函数名对两个版本源代码中函数进行匹配,以形成待匹配函数对。
4.如权利要求1所述的基于图匹配的LLVM中间语言差分分析方法,其特征在于,所述依据函数的哈希值对未改动的函数对进行过滤包括:
对待匹配函数对中的每个函数进行归一化,包括:对函数中的每条指令,删除编译过程中附带的编译信息;遍历函数中每条指令的操作数,将每一个静态单赋值变量重新命名为字符串常量,且添加操作数的位置;
对归一化的函数进行哈希值计算,包括:遍历函数中的每个基本块,将基本块中的每条指令当作字符串常量拼接起来,对拼接结果进行哈希值计算以得到函数的哈希值;
若待匹配函数对中的两个函数的哈希值相同,表明函数没有发生改动,则过滤掉未改动的函数对;若待匹配函数对中的两个函数的哈希值不相同,表明函数发生改动,即获得发生改动的函数对。
5.如权利要求1所述的基于图匹配的LLVM中间语言差分分析方法,其特征在于,所述确定发生改动的函数对中的敏感指令包括:
对发生改动的函数对中的每一条指令进行遍历,当遍历到敏感指令时,记录敏感指令、敏感指令类别、指令所在的基本块号;其中,敏感指令包括变量初始化指令、加/减锁指令、资源释放指令、安全检查指令;
其中,变量初始化指令通过函数调用memset、memcpy、__memcpy、memmove、strncpy、strncpy_from_user、copy_from_user、__copy_from_user、init进行识别;加/减锁指令通过函数调用lock、unlock进行识别;资源释放指令通过函数调用kfree、devfree、dev_kfree_skb、dev_kfree_skb_any、vfree、free、kfree_rcu、kfree_skb、usb_free_urb进行识别;安全检查指令本质是条件语句指令,条件语句的后续分支应当至少有一条错误处理分支和一条程序运行分支。
6.如权利要求1所述的基于图匹配的LLVM中间语言差分分析方法,其特征在于,对发生改动的函数对的程序控制流图进行静态分析时,分析函数中所有条件语句、条件语句中的条件变量、条件语句所在基本块中条件变量赋值的位置;然后在条件变量赋值的位置新增一条无条件跳转指令,通过该无条件跳转指令将条件语句所在的基本块划分为两个基本块,实现细粒度划分。
7.如权利要求6所述的基于图匹配的LLVM中间语言差分分析方法,其特征在于,通过LLVM Store指令识别条件变量赋值的位置;调用LLVM splitBasicBlock函数对基本块进行细粒度划分。
8.如权利要求1所述的基于图匹配的LLVM中间语言差分分析方法,其特征在于,通过相似度比较实现对包含敏感指令的基本块的匹配,并将匹配成功的基本块对存入公共子图;
所述对剩下的基本块再进行匹配包括:
(a)对公共子图中每对基本块对的邻居结点进行相似度比较,实现邻居结点的匹配,获得匹配的基本块对,其中,邻居节点为基本块对中基本块的邻居基本块;
(b)将发生改动的函数对中未匹配的基本块分别划分到第一集合和第二集合,计算第一集合中每个第一基本块与第二集合中所有第二基本块的相似度,将相似度大于第一阈值的第二基本块加入每个第一基本块对应的第三集合;将第三集合中所有第二基本块按照函数控制流的顺序拼接形成新基本块;
(c)计算新基本块与对应的第一基本块的相似度,将相似度大于第二阈值的第一基本块与第三集合中所有第二基本块匹配起来;当相似度小于第二阈值时,重新排列组合第三集合中所有第二基本块形成新基本块;
(d)重新执行步骤(c),直到第三集合中第二基本块能够与第一基本块匹配起来或遍历完第三集合中所有排列组合得到的新基本块。
9.如权利要求8所述的基于图匹配的LLVM中间语言差分分析方法,其特征在于,在获取发生改动的函数对的程序控制流图后,还遍历函数对的基本块,以获取每个基本块特征,依据基本块特征计算基本块的相似度;
优选地,采用通过levenshtein算法、Jaccard算法计算基本块特征的相似度,将每对基本块的所有基本块特征相似度的均值作为每对基本块的相似度。
10.一种基于图匹配的LLVM中间语言差分分析系统,其特征在于,包括:
收集编译模块,用于收集并编译两个版本源代码,获取两个版本源代码的待匹配LLVM中间代码;
过滤模块,用于根据待匹配LLVM中间代码进行函数匹配得到待匹配函数对,依据函数的哈希值对未改动的函数对进行过滤,以获得发生改动的函数对;
确定模块,用于确定发生改动的函数对中的敏感指令;
分析划分模块,用于获取并静态分析发生改动的函数对的程序控制流图,依据静态分析结果对程序控制流图进行基本块的细粒度划分;
匹配模块,用于依据细粒度划分结果,对发生改动的函数对中包含敏感指令的基本块进行匹配后,再对剩下的基本块进行匹配,最终得到所有匹配的基本块对;
比对模块,对匹配的基本块对进行指令序列对比,以确认删除指令、增加指令。
CN202110825310.7A 2021-07-21 2021-07-21 基于图匹配的llvm中间语言差分分析方法及系统 Active CN113553056B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110825310.7A CN113553056B (zh) 2021-07-21 2021-07-21 基于图匹配的llvm中间语言差分分析方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110825310.7A CN113553056B (zh) 2021-07-21 2021-07-21 基于图匹配的llvm中间语言差分分析方法及系统

Publications (2)

Publication Number Publication Date
CN113553056A true CN113553056A (zh) 2021-10-26
CN113553056B CN113553056B (zh) 2024-05-14

Family

ID=78103870

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110825310.7A Active CN113553056B (zh) 2021-07-21 2021-07-21 基于图匹配的llvm中间语言差分分析方法及系统

Country Status (1)

Country Link
CN (1) CN113553056B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116578979A (zh) * 2023-05-15 2023-08-11 软安科技有限公司 一种基于代码特征的跨平台二进制代码匹配方法及系统

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107908955A (zh) * 2017-11-30 2018-04-13 华中科技大学 一种基于中间语言分析的控制流完整性保护方法及系统
CN109784010A (zh) * 2018-12-18 2019-05-21 武汉极意网络科技有限公司 一种基于llvm的程序控制流混淆方法及装置
CN110276198A (zh) * 2019-06-14 2019-09-24 中国科学院信息工程研究所 一种基于概率预测的嵌入式可变粒度控制流验证方法及系统
CN111177733A (zh) * 2019-12-30 2020-05-19 北京航空航天大学 一种基于数据流分析的软件补丁检测方法及装置
CN111752586A (zh) * 2020-06-23 2020-10-09 上海交通大学 跨架构的嵌入式设备固件未修补漏洞检测方法及系统
CN111913718A (zh) * 2020-06-22 2020-11-10 西安交通大学 基于基本块上下文信息的二进制函数差分分析方法

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107908955A (zh) * 2017-11-30 2018-04-13 华中科技大学 一种基于中间语言分析的控制流完整性保护方法及系统
CN109784010A (zh) * 2018-12-18 2019-05-21 武汉极意网络科技有限公司 一种基于llvm的程序控制流混淆方法及装置
CN110276198A (zh) * 2019-06-14 2019-09-24 中国科学院信息工程研究所 一种基于概率预测的嵌入式可变粒度控制流验证方法及系统
CN111177733A (zh) * 2019-12-30 2020-05-19 北京航空航天大学 一种基于数据流分析的软件补丁检测方法及装置
CN111913718A (zh) * 2020-06-22 2020-11-10 西安交通大学 基于基本块上下文信息的二进制函数差分分析方法
CN111752586A (zh) * 2020-06-23 2020-10-09 上海交通大学 跨架构的嵌入式设备固件未修补漏洞检测方法及系统

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
莫培弘;衷璐洁;: "LLVM中静态程序信息的过程间分析方法", 计算机工程与设计, no. 06, 16 June 2018 (2018-06-16) *
陈皓 等: "基于图神经网络的代码漏洞检测方法", 网络与信息安全学报, vol. 7, no. 3, 30 June 2021 (2021-06-30) *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116578979A (zh) * 2023-05-15 2023-08-11 软安科技有限公司 一种基于代码特征的跨平台二进制代码匹配方法及系统
CN116578979B (zh) * 2023-05-15 2024-05-31 软安科技有限公司 一种基于代码特征的跨平台二进制代码匹配方法及系统

Also Published As

Publication number Publication date
CN113553056B (zh) 2024-05-14

Similar Documents

Publication Publication Date Title
Cheng et al. Deepwukong: Statically detecting software vulnerabilities using deep graph neural network
Tufano et al. Deep learning similarities from different representations of source code
Long et al. Automatic inference of code transforms for patch generation
CN111460450B (zh) 一种基于图卷积网络的源代码漏洞检测方法
Cheng et al. Static detection of control-flow-related vulnerabilities using graph embedding
CN106062751B (zh) 对与数据类型有关的数据剖析操作的管理
EP3623948B1 (en) Method and system for code analysis to identify causes of code smells
CN113468525B (zh) 针对二进制程序的相似漏洞检测方法及装置
US11327722B1 (en) Programming language corpus generation
CN113297580B (zh) 基于代码语义分析的电力信息系统安全防护方法及装置
CN115357904B (zh) 一种基于程序切片和图神经网络的多类漏洞检测方法
US20210405980A1 (en) Long method autofix engine
CN112783786A (zh) 测试案例的生成方法、装置、设备、介质和程序产品
Nasirloo et al. Semantic code clone detection using abstract memory states and program dependency graphs
CN113553056B (zh) 基于图匹配的llvm中间语言差分分析方法及系统
Islam et al. What changes in where? an empirical study of bug-fixing change patterns
Sudhamani et al. Code similarity detection through control statement and program features
Kim et al. Automatic abnormal log detection by analyzing log history for providing debugging insight
Wang et al. Understanding and facilitating the co-evolution of production and test code
CN107579944B (zh) 基于人工智能和MapReduce安全攻击预测方法
Wang et al. BugPre: an intelligent software version-to-version bug prediction system using graph convolutional neural networks
CN112395199B (zh) 基于云计算的分布式软件实例测试方法及软件开发平台
CN117725592A (zh) 一种基于有向图注意力网络的智能合约漏洞检测方法
CN116305131B (zh) 脚本静态去混淆方法及系统
CN109670317B (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