CN104915211A - 反编译中基于子图同构匹配算法的内在函数识别方法 - Google Patents
反编译中基于子图同构匹配算法的内在函数识别方法 Download PDFInfo
- Publication number
- CN104915211A CN104915211A CN201510340675.5A CN201510340675A CN104915211A CN 104915211 A CN104915211 A CN 104915211A CN 201510340675 A CN201510340675 A CN 201510340675A CN 104915211 A CN104915211 A CN 104915211A
- Authority
- CN
- China
- Prior art keywords
- intrinsic function
- function
- intrinsic
- fundamental block
- template
- 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
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种反编译中基于子图同构匹配算法的内在函数识别方法,属于反编译技术领域。本发明通过建立内在函数模板库,对内在函数模板与反编译产生的基于控制流图的目标汇编文件进行子图同构匹配,定位目标汇编文件中目标程序中的经编译优化并内联展开的内在函数。本发明实现了在反编译过程中对内联内在函数的自动识别,同时通过对内在函数的模板和原型进行分析,恢复内在函数的函数名、返回值、返回值类型和函数参数,达到内联内在函数语义提升的目的。经过提升的内联内在函数为反编译中的类型分析提供了更多的类型信息,降低了数据流分析和控制流分析的复杂度,提高了中间代码的抽象层次,增强了反编译结果的可读性。
Description
技术领域
本发明属于反编译技术领域,涉及一种反编译中对内联内在函数的识别方法,具体涉及一种反编译中基于子图同构匹配算法的内在函数识别方法。
背景技术
反编译技术最早出现在60年代,主要是为了实现代码的跨平台移植,目前已经被广泛运用到程序理解,源代码恢复,程序调试,安全分析等各个方面。反编译软件包括前端,中间端和后端。前端包括加载器、软件解析单元和解码器。加载器加载可执行文件,反汇编得到汇编代码,反编译软件再将汇编程序组织成相应的数据结构,如符号表、符号地址表、过程体入口地址表、指令链表等;软件解析单元将特定系统架构的寄存器信息、标志位函数和指令解码信息等组织成相应的数据结构,在解码阶段使用;解码器解码汇编指令序列,根据控制流重构算法构造出汇编程序的控制流图。中间端是反编译流程中最重要的部分,该部分主要包括数据流分析,控制流分析和类型分析。数据流分析通过活跃变量分析来消除无用代码,传播表达式,确定被调用过程体的参数和返回值等;控制流分析根据结构化算法,将控制流图中的节点按照其在控制流图中的位置分成不同的类别,如顺序代码块、分支代码块和循环代码块等;类型分析从机器指令的操作码、库函数的签名和常数的值等多处获取基本类型信息,然后利用类型推导规则推导其他变量的类型,从而使得生成的高级代码的可读性更强。后端是高级代码的生成,通过遍历控制流图,依据每一个基本块的类型,分别生成顺序、分支和循环的代码。
目前的主流反编译软件包括Hex-Rays,Phoenix,Retargetable Decompiler,Boomerang等。Hex-Rays是基于当前最流行的商业反汇编器IDA开发的具有反编译功能的插件,可以将汇编指令转化为微指令代码,然后进行全局优化、局部优化、结构化分析和类型分析来提高微指令代码的抽象水平。Hex-Rays能识别出大概三分之一的内在函数。Phoenix在反编译软件BAP的基础上,将x86汇编指令流转化为中间语言BIL,Phoenix没有在汇编代码或者BIL上进行习语的检测,但Phoenix提供了20种模式,可以简化由gcc编译器产生的指令代码。RetargetableDecompiler利用窥孔优化算法实现了在LLVM IR代码上的习语检测,基于不同的ISA产生的IR变化很大,同时一条汇编指令对应几条复杂的LLVM IR语句,使得反编译的效率不高。Boomerang是一款在UQBT二进制翻译的基础上,面向多种架构实现的开源反编译系统,可以实现PowerPC、Sparc和X86等多种体系结构的可执行程序的反编译。Boomerang中没有实现对内联内在函数的识别。
程序中为了实现特定的功能通常包含大量的函数,如用户函数、系统函数等。内在函数也叫内建函数,是编译器内部的函数,既不属于库函数也不属于系统函数。虽然不同类型函数在二进制文件中的表现存在差异,但都是特定功能的代码片段,都能给出与调用点上下文相关的变量的类型信息,所以如果能识别出这些函数,不仅能够大幅减少代码的分析量,为后续分析提供类型信息,同时也能提高反编译结果的可读性,提高分析效率。在现有常规的反编译软件中,对于库函数的识别主要采用基于模式匹配的识别方法,Hex-Rays采用Flirt算法,根据库函数对应的二进制字节流信息,构建函数的签名信息,通过匹配函数签名信息识别恢复库函数。如C语言中常见的库函数strlen、strcpy、strcmp、memcmp,这类库函数也作为编译器的内在函数,在编译优化选项下,函数体在函数调用点内联展开函数体语句,Flirt算法构建的字节流函数签名,不能有效的表示指令语句之间的控制流关系,无法高效地识别出该类函数,导致对内在函数的反编译结果不完全,影响了最终产生的高级代码的可读性。
发明内容
本发明的目的在于提供一种反编译中基于子图同构匹配算法的内在函数识别方法,能够高效地实现对内联内在函数的识别,减少类型分析和数据流分析的工作量,提高反编译过程中的抽象层次,增强反编译结果的可读性和准确性。
为达到上述目的,本发明采用以下技术方案:
一种反编译中基于子图同构匹配算法的内在函数识别方法,包括以下步骤:
1)针对具体的编译器,构建该编译器的内在函数模板库;
2)基于反编译软件Boomerang将目标汇编文件进行解码,构建出目标汇编文件的汇编指令控制流图;
3)将内在函数模板库中的内在函数模版与目标汇编文件的汇编指令控制流图进行子图同构匹配,识别目标汇编文件中的目标程序中内联的内在函数;
4)结合内在函数的原型和同构映射关系恢复内在函数的函数名、返回值、返回值类型和函数参数。
所述步骤1)中的内在函数模板库的构建方法包括以下步骤:
a)选取具有内在函数调用的程序作为样本程序,在编译器优化选项下编译样本程序生成可执行文件;
b)利用IDA反汇编器反汇编可执行文件,生成汇编文件,将汇编文件作为Boomerang反编译器的输入,Boomerang反编译器对汇编文件进行加载和解码,解码模块以连续的汇编指令为基本块,以控制流关系为有向边,构建汇编文件的汇编指令控制流图;
c)提取基于汇编指令控制流图的内在函数的控制流子图和汇编指令序列,作为内在函数的模板,并插入到内在函数模板库中;
d)重复步骤a)~c),构造出通用计算机体系结构所共有的内在函数的内在函数模板库。
所述的内在函数模板库针对具体编译器的内在函数,将代表内在函数特征的汇编指令控制流图作为内在函数的函数模板;将内在函数对应的所有函数模板以字典的形式组织,以内在函数的键为内在函数名称,以内在函数的值为模板链表;内在函数的函数模板的汇编指令控制流图的顶点由汇编指令组成的基本块构成,汇编指令控制流图的边由表示基本块之间的控制流关系组成。
所述步骤2)中构建出的目标汇编文件的汇编指令控制流图是一个表示程序控制流变化的有向图G=(N,E,entry,exit),其中entry表示程序唯一入口节点,exit表示程序唯一出口节点,N表示基本块,E表示有向边,G表示有向图。
所述步骤3)中子图同构匹配的具体步骤如下:
A)对匹配状态进行初始化,初始状态S=S0,初始状态的子图同构映射集初始状态的候选节点对集P(S0)={(T1,B1),(T1,B2)…(T1,Bn)},其中S为当前匹配状态集,S0为初始状态的匹配状态集,T1为模板入口基本块,B1为目标控制流图第1个基本块,Bn为目标控制流图第n个基本块;
B)从内在函数模板库中取出一个函数模板;
C)利用VF2子图同构匹配算法进行图模式匹配和基本块语义匹配,根据当前匹配状态集S以及目标控制流图与模板子图的拓扑结构,计算出当前候选节点对集P(S),并对当前候选节点对集P(S)中的每一个候选节点对p进行基本块语义匹配,若匹配成功,则更新匹配状态集为S’,同时将候选节点对p添加到当前子图同构映射集M(S’)中,并更新候选节点对集为P(S’);继续对匹配状态集S’进行匹配,如果匹配成功,则继续匹配;否则回溯到匹配状态集S继续匹配;直至子图同构映射集包含模板子图的全部基本块,则当前内在函数模板匹配成功;
D)在目标控制流图中标记匹配成功的函数模板中的所有基本块,通过状态回溯算法继续匹配目标控制流图中存在的其他函数模板,直至当前候选节点对集P(S)为空,表示当前函数模板匹配结束;否则当前函数模板匹配失败,转至步骤B),依次取其它函数模板进行子图同构匹配,直至内在函数模板库中的函数模板匹配完毕。
所述的基本块语义匹配,是用来对比内在函数模板中的基本块和目标控制流图中的待匹配基本块之间语义是否一致的方法;基本块的语义由基本块的汇编指令序列表示,将基本块的汇编指令操作码序列作为语义匹配的标准;同时基本块语义匹配满足以下要求:内在函数模板中的基本块的汇编指令操作码序列为目标控制流图中的待匹配基本块的汇编指令操作码序列的顺序子序列。
与现有技术相比,本发明具有以下有益效果:
本发明提供的反编译中基于子图同构匹配算法的内在函数识别方法,先针对具体编译器构建内在函数模板库,然后将目标汇编文件反编译解码生成的汇编指令控制流图和内在函数模版库中的内在函数模板进行子图同构匹配,从而识别目标程序中内联的内在函数。该方法是一种反编译过程中基于图理论的内在函数识别算法,可以高效地实现在反编译过程中对内联内在函数的自动识别,通过对内在函数的原型和同构映射关系的分析,恢复内在函数的函数名、返回值、返回值类型和函数参数,达到内联内在函数语义提升的目的,经过提升的内联内在函数为反编译中的类型分析提供了更多的类型信息,降低了数据流分析和控制流分析的复杂度,减少了类型分析和数据流分析的工作量,完善了反编译中函数识别的方法,提高了反编译过程中的中间代码的抽象层次,增强了反编译结果的可读性和准确性。该方法与传统的函数识别方法相比,能识别出传统方法不能正确反编译的内联内在函数语句,同目前最权威的反编译软件Hex-Rays相比,能更有效的利用指令语句之间的控制流关系特征,更高效、更全面的识别内联内在函数。并且该方法具有较强的功能可扩展性,可以大量应用于反编译过程中,能够在其它模式特征清晰、易提取的指令习语识别中应用。
进一步的,本发明在利用反编译技术的基础上,通过提取内在函数的共有特征建立内在函数模板,从而构建出内在函数模板库。本发明中的基本块语义匹配为模糊匹配,匹配算法满足内在函数模板中的基本块的汇编指令操作码序列为目标控制流图中的待匹配基本块的汇编指令操作码序列的顺序子序列,这样即便因为计算机系统的指令调度,在目标控制流图中的待匹配基本块中插入了语义不相关的汇编指令,也能确保基本块语义的一致性判断。
附图说明
图1本发明的反编译过程中内联内在函数识别方法的主要活动图;
图2内在函数strcmp函数的模板示意图;
图3目标汇编文件经过反编译生成的部分汇编指令控制流图;
图4子图同构匹配算法模块流程图;
图5子图同构匹配过程的状态空间及状态转化示意图。
具体实施方式
下面结合附图对本发明做进一步详细说明。
本发明提供的反编译中基于子图同构匹配算法的内在函数识别方法,包括以下步骤:
首先,针对于具体的编译器,构建该编译器的内在函数模板库:选取具有内在函数调用的程序作为样本程序,在编译器优化选项下编译样本程序生成可执行文件;利用IDA反汇编器反汇编可执行文件,将生成的汇编文件作为Boomerang反编译器的输入,Boomerang反编译器对汇编文件进行加载和解码,解码模块以连续的汇编指令为基本块,以控制流关系为有向边,构建汇编文件的汇编指令控制流图;提取基于汇编指令控制流图的内在函数的控制流子图和汇编指令序列,作为内在函数的模板,并插入到内在函数模板库中;重复前面过程,直至构造出符合预期的内在函数模板库。
所述的内在函数模板库针对具体编译器的内在函数,将代表内在函数特征的汇编指令控制流图作为内在函数的函数模板。对于一个特定的内在函数,即使在编译器和优化层级(-O2及以上)确定的情况下,由于程序上下文环境不同,同一内在函数也会对应多种函数模板,所以应该将该内在函数对应的所有函数模板以字典的形式组织,该内在函数的键为内在函数名称,该内在函数的值为模板链表。内在函数的函数模板的汇编指令控制流图的顶点由汇编指令组成的基本块构成,汇编指令控制流图的边由表示基本块之间的控制流关系组成。
其次,基于反编译软件Boomerang将目标汇编文件进行解码,构建出目标汇编文件的汇编指令控制流图。
构造的目标汇编文件的汇编指令控制流图,是一个表示程序控制流变化的有向图G=(N,E,entry,exit),其中entry表示程序唯一入口节点,exit表示程序唯一出口节点,N表示基本块,E表示有向边。
然后,将内在函数模板库中的内在函数模版与目标汇编文件的汇编指令控制流图进行子图同构匹配,自动识别目标程序中内联的内在函数。
所述的子图同构匹配是在汇编文件反编译生成的汇编指令控制流图中准确匹配内联内在函数,具体步骤为:对匹配状态进行初始化,初始状态S=S0、初始状态的子图同构映射集初始状态的候选节点对集P(S0)={(T1,B1),(T1,B2)…(T1,Bn)},其中T1为模板入口基本块,Bn为目标控制流图第n个基本块;从内在函数模板库中取出一个函数模板;利用VF2子图同构匹配算法进行图模式匹配和基本块语义匹配,根据当前匹配状态集S以及目标控制流图与模板子图的拓扑结构,计算出当前候选节点对集P(S),并对当前候选节点对集P(S)中的每一个候选节点对p进行基本块语义匹配,若匹配成功,则更新匹配状态集为S’,同时将候选节点对p添加到当前子图同构映射集M(S’)中,并更新候选节点对集为P(S’);继续对匹配状态集S’进行匹配,如果匹配成功,则继续匹配;否则回溯到匹配状态集S继续匹配;直至子图同构映射集包含模板子图的全部基本块,则当前内在函数模板匹配成功;在目标控制流图中标记匹配成功的函数模板中的所有基本块,通过状态回溯算法继续匹配目标控制流图中存在的其他函数模板,直至当前候选节点对集P(S)为空,表示当前函数模板匹配结束。否则,当前函数模板匹配失败,再依次从内在函数模板库中取其它内在函数进行子图同构匹配,直至内在函数模板库中的函数模板匹配完毕。
所述的基本块语义匹配,是用来对比内在函数模板中的基本块和目标控制流图中的待匹配基本块之间语义是否一致的方法;基本块的语义由基本块的汇编指令序列表示,可以把基本块的汇编指令操作码序列作为语义匹配的标准。同时,由于指令调度等原因,基本块语义匹配应该满足以下要求:内在函数模板中的基本块的汇编指令操作码序列为目标控制流图中的待匹配基本块的汇编指令操作码序列的顺序子序列。
最后,结合内在函数的原型和同构映射关系恢复内在函数的函数名、返回值、返回值类型和函数参数。其中内在函数的恢复需要结合内在函数的原型和内在函数的函数模板中的汇编指令语句。
本发明可以应用于多种处理器架构的反编译过程,针对于具体编译器构建内在函数模板库,将汇编文件反编译解码阶段生成的汇编指令控制流图和内在函数模版库中的内在函数模板进行子图同构匹配,识别经过编译优化的程序中内联展开的内在函数。
本发明的实验环境是Microsoft Visual Studio 2012,优化选项是-O2,编程语言是C++,目标汇编文件是x86汇编,反编译目标结果是C语言。
选取足够代表内在函数特征的控制流子图和汇编语句:
对于测试程序中的一条调用strlen内在函数的语句:len=strlen(str),在反编译软件中查看该内在函数内联后对应的汇编代码,如表1所示:
表1
strlen内在函数模板由三个基本块,三条有向边组成。基本块分别为BB1、BB2、BB3,有向边分别是BB1->BB2、BB2->BB2、BB2->BB3。对于汇编语句中的标号,如loc_401075,表明存在一条以该地址为目标跳转地址的边,如表中BB1->BB2,对于条件跳转指令jnz shortloc_4010775,条件为真的目标跳转地址是BB2块的第一条指令,BB2->BB2是一条回边,说明BB2块是一个自循环基本块,条件假的跳转对应BB2->BB3。
由于编译优化过程中存在指令调度,指令间可能会插入一条或几条函数无关指令,在函数模板的构建过程中,应该根据程序切片思想,删除基本块内部的不相关汇编指令代码。在模板基本块中,汇编代码标号信息不再需要,只需保存指令的操作码和操作数,其中以操作码序列作为基本块语义特征。
本发明中内在函数模板的特征包括图模式特征和基本块语义特征两部分。图模式特征指基本块节点以及表示基本块之间控制流关系所组成;基本块语义是基本块中汇编指令的指令流序列特征。
如图1所示,是本发明反编译过程中内在函数识别方法的主要活动图:
下面结合strcmp函数,介绍本发明方法,具体步骤如下:
S101、根据内在函数,构建函数模板,添加到模版库中。
根据strcmp汇编代码,建立由汇编指令组成的基本块和表示基本块之间控制流关系的边所组成的内在函数模板,建立strcmp函数的模板,如图2所示:
1)定义模板对象,定义6个内在函数模板的基本块T1,T2,T3,T4,T5,T6;
2)对基本块分别设置汇编指令的操作码和操作数;
3)按照汇编程序中基本块的逻辑地址从小到大依次在模板对象中插入基本块;
4)根据基本块之间的控制流关系插入边,strcmp函数模板包括8条边:0->1、0->6、1->2、1->4、2->3、2->5、3->0、3->4;
5)将构建的内在函数模板添加到模版库中。
S102、本发明基于反编译软件Boomerang实现,对目标汇编文件进行解码,生成汇编指令控制流图。
控制流图是反编译中间语言的组成部分之一,也是中间分析的基础。控制流图描述了程序实际执行过程中所有可能的控制流信息变化的过程,构造控制流图成功与否关系到后续分析的精确程度。由于间接跳转指令和间接调用指令的存在,二进制程序分析中控制流图构造算法不能获得完整的控制流图,递归扫描算法无法确定间接指令的目标地址,只能通过后续数据流分析进一步确定目标地址。对于间接跳转和间接调用指令目前还没有好的方法可以解决。控制流图重构算法实现将顺序汇编程序转化成基于控制流关系的汇编控制流图,本发明采用递归扫描算法来构建控制流图,在构建过程中忽略间接跳转和间接调用指令,将间接指令所在基本块标记为不完全基本块,在数据流分析中进一步完善。
从程序的入口地址可以将程序划分为互不相交的基本块集合。基本块的类型由其最后一条指令的类型决定,可将基本块分为表2中的6种类型:
表2
基本块类型 | 特点 |
Call类型 | 最后一条指令为函数调用指令,出度1:调用函数基本块 |
Ret类型 | 最后一条指令为返回指令,出度0 |
Oneway类型 | 最后一条指令为无条件跳转指令,出度1:目标地址基本块 |
Twoway类型 | 最后一条指令为条件跳转指令,出度2:后续基本块和跳转基本块 |
Nway类型 | 最后一条指令为间接跳转指令,出度N:switch语句分支 |
Fallthrough类型 | 最后一条指令为非控制转移指令,出度1:后续基本块 |
首先通过程序入口地址获得指令,然后根据指令类型构造基本块,并设置基本块出边和入边,逐步完善控制流图。控制流图构造算法中申请基本块时,需要判断该地址指令是否存在某个已经解码的基本块内部,若存在,需要将已经解码的基本块分解为两个基本块,前半部分构成Fallthrough类型的基本块,入度和原基本块保持一致,后半部分保持原有基本块的类型,出度和原基本块保持一致,两个基本块间建立有向连接。对于本发明的目标汇编文件,最终在反编译过程中构建出的目标程序的部分控制流图如图3所示,包括B1~B8共八个目标程序的基本块。
S103、选取子图同构匹配算法,进行内在函数模板和程序控制流图的子图同构匹配。
子图同构匹配包括图模式匹配和基本块语义匹配:基本块语义匹配算法是通过对比基本块的汇编指令序列来判断基本块语义是否匹配;图模式匹配算法采用VF2图同构算法,在目标程序汇编控制流图中匹配内在函数模板。
子图同构匹配算法的流程图如图4所示:
1)从内在函数模板库中取一个内在函数模板与目标汇编指令控制流图进行匹配,判断是否匹配成功,若失败,继续从模板库中取其它内在函数模板,进行匹配,直至模板库匹配完毕;
2)若匹配成功,标记控制流图中匹配成功的所有基本块,通过回溯算法在目标控制流图中继续查询可能存在的内在函数模板,直至内在模板库中的内在函数匹配完毕为止。
匹配函数match(S):输入状态S,子图同构映射集M(S),输出子图匹配结果,算法具体步骤如下:
a)如果子图同构映射集包含模板子图全部基本块,则当前内在函数匹配成功;
b)否则,根据当前状态S,计算候选节点对集P(S),对于每一个候选节点对p,若匹配成功,更新状态为S’,将p节点对添加到M(S’)中,继续match(S’)匹配,直至满足a)中的条件为止。
本发明的子图同构匹配算法具体过程如图5所示:
1)初始化状态为S0,子图同构映射集M以当前匹配成功的基本块节点对作为元素,状态S0表示初始状态,候选节点对集P(S0)={(T1,B1),(T1,B2)…(T1,Bn)},其中T1为模板入口基本块,Bn为目标控制流图第n个基本块。候选节点对集由待匹配的基本块节点对组成:若节点对p匹配失败,状态的候选节点对集变为P/p;否则,状态的候选节点对集为由当前匹配状态集中所有目标基本块的直接后继节点组成,但不包括M中的目标基本块本身。
2)从模板库内在函数模板链表中取strcmp函数的模板,取基本块T1,基本块语义为基本块内汇编代码的操作码序列mov-cmp-jnz;
3)将汇编代码构建的控制流图第一个基本块B1和内在函数子图基本块T1的汇编指令序列进行匹配,满足T1基本块指令操作码序列为B1基本块指令操作码序列的子集;
4)如果遍历完模板基本块T1的汇编指令,并且指令序列和B1都匹配成功,则第一个基本块匹配成功,否则,当前基本块匹配失败,继续遍历后续基本块,直至和T1有匹配的基本块为止,如果不存在,直接转至步骤10)。
5)状态匹配的具体过程:如图2、图3所示,初始时系统状态为S0,状态S0的候选节点对集P(S0)={(T1,B1),(T1,B2),(T1,B3),…(T1,B16)},子图同构映射集B1的操作码链表为mov-lea,经过(T1,B1)基本块语义匹配,状态从S0变为S1,由于匹配失败,所以状态S1为失效匹配,状态恢复为父节点S0,状态S0的候选节点对集变为P/p,此时,p=(T1,B1),P(S0)={(T1,B2),(T1,B3),…(T1,B16)},B2的操作码链表为mov-cmp-jnz,对基本块的指令序列进行基本块语义匹配,经过(T1,B2)基本块语义匹配算法匹配,状态由S0变为S2,匹配成功,将匹配成功的基本块节点对添加到子图同构映射集中,M(S2)={(T1,B2)},此时,目标图基本块是B2,如图3所示,遍历基本块B2的出边,按照编号顺序将B2直接后继基本块添加到候选节点对集中,状态S2的候选节点对集P(S2)={(T2,B3),(T2,B7)},第1个基本块匹配成功;
6)按照基本块编号取内在函数模板基本块T2,状态S2的候选节点对集为P(S2)={(T2,B3),(T2,B7)},进行匹配(T2,B3),T2和B3的操作码链表都是test-jz,基本块语义匹配成功,状态从S2变为S3,当前匹配状态集M(S2)={(T1,B2),(T2,B3)},S3的候选节点对集由已经成功匹配的目标图基本块节点B2和B3的直接后继基本块组成,如图3所示,状态S3的候选节点对集P(S3)={(T3,B4),(T3,B6),(T3,B6)};
7)依次按照基本块编号选取内在函数模板基本块,进行图模式匹配和基本块语义匹配,如图5所示,状态为S6时,M(S6)={(T1,B2),(T2,B3),(T3,B4),(T4,B5),(T5,B6)},状态S6的候选节点对集为P6={(T6,B7),(T6,B8)},对(T6,B7)执行匹配算法,状态变为S7,匹配成功,M(S7)={(T1,B2),(T2,B3),(T3,B4),(T4,B5),(T5,B6)},(T6,B7)},内在函数模板基本块遍历完毕,此时,在目标控制流图中成功找到了一个strcmp函数模板,标记同构映射集M中匹配成功的基本块;
8)目标程序中可能存在多个strcmp函数的调用语句,通过状态回溯算法继续寻找目标控制流图中存在的函数匹配:
状态从S7回溯到S6,M(S6)={(T1,B2),(T2,B3),(T3,B4),(T4,B5),(T5,B6)},状态的候选节点对集从{(T6,B7),(T6,B8)}变为了P(S6)={(T6,B8)},进行(T6,B8)匹配,状态S6变为状态S8,匹配失败,S8状态失效,S6候选集从{(T6,B8)}变为状态回溯到S6的父节点S5,M(S5)={(T1,B2),(T2,B3),(T4,B4),(T4,B5)},S5的候选节点对集从{(T5,B6),(T5,B7)}变为了P(S5)={(T5,B7)},继续执行匹配算法,当状态回溯到S0时,(T1,B3)匹配失败,经过(T1,B4)基本块节点匹配,匹配成功,M(S0)={(T1,B4},状态从S0变为S14,S14的候选节点对集P(S14)={(T2,B5),(T2,B7)},分别进行(T2,B5)、(T2,B7)的匹配,候选节点对集当前匹配失败,继续回溯到状态S0,从T1开始匹配;
9)目标指令控制流图遍历完毕后,记录控制流图中所有匹配成功的strcmp模板基本块编号,继续从模版库遍历其他内在函数模板进行匹配;
10)若遍历完目标控制流图不能找到当前内在函数的匹配,则当前函数匹配失败,说明在目标程序中不存在该内在函数,继续从模版库中取其他内在函数模板寻找可能的匹配,直至内在模板库中的内在函数匹配完毕为止。
内在函数strcmp的原型为int strcmp(const char*s1,const char*s2),所以内在函数返回值类型为int,参数的类型都为const char*。定义三元组<#BasicBlock,#Instruction,#Operand>定位函数参数和返回值,其中#BasicBlock,#Instruction,#Operand分别表示基本块,指令和操作数的编号。根据如图2所示的内在函数模板,strcmp的参数设置为{<1,1,2>,<1,2,2>},返回值为{<6,2,1>}。根据同构映射关系,在目标控制流图中,如图3所示,函数的参数为{<2,1,1>,<2,2,2>},返回值为{<7,2,1>},索引目标函数最终确定参数为{[eax],[ecx]},返回值为{eax}。
综上所述,本发明实现了在反编译过程中对内联内在函数的自动识别,同时通过对内在函数的模板和原型进行分析,恢复内联内在函数的函数名、返回值、返回值类型和函数参数,达到内联内在函数语义提升的目的。经过提升的内联内在函数为反编译中的类型分析提供了更多的类型信息,降低了数据流分析和控制流分析的复杂度,提高了中间代码的抽象层次,增强了反编译结果的可读性。
Claims (6)
1.一种反编译中基于子图同构匹配算法的内在函数识别方法,其特征在于,包括以下步骤:
1)针对具体的编译器,构建该编译器的内在函数模板库;
2)基于反编译软件Boomerang将目标汇编文件进行解码,构建出目标汇编文件的汇编指令控制流图;
3)将内在函数模板库中的内在函数模版与目标汇编文件的汇编指令控制流图进行子图同构匹配,识别目标汇编文件中的目标程序中内联的内在函数;
4)结合内在函数的原型和同构映射关系恢复内在函数的函数名、返回值、返回值类型和函数参数。
2.根据权利要求1所述的反编译中基于子图同构匹配算法的内在函数识别方法,其特征在于,所述步骤1)中的内在函数模板库的构建方法包括以下步骤:
a)选取具有内在函数调用的程序作为样本程序,在编译器优化选项下编译样本程序生成可执行文件;
b)利用IDA反汇编器反汇编可执行文件,生成汇编文件,将汇编文件作为Boomerang反编译器的输入,Boomerang反编译器对汇编文件进行加载和解码,解码模块以连续的汇编指令为基本块,以控制流关系为有向边,构建汇编文件的汇编指令控制流图;
c)提取基于汇编指令控制流图的内在函数的控制流子图和汇编指令序列,作为内在函数的模板,并插入到内在函数模板库中;
d)重复步骤a)~c),构造出通用计算机体系结构所共有的内在函数的内在函数模板库。
3.根据权利要求1或2所述的反编译中基于子图同构匹配算法的内在函数识别方法,其特征在于:所述的内在函数模板库针对具体编译器的内在函数,将代表内在函数特征的汇编指令控制流图作为内在函数的函数模板;将内在函数对应的所有函数模板以字典的形式组织,以内在函数的键为内在函数名称,以内在函数的值为模板链表;内在函数的函数模板的汇编指令控制流图的顶点由汇编指令组成的基本块构成,汇编指令控制流图的边由表示基本块之间的控制流关系组成。
4.根据权利要求1或2所述的反编译中基于子图同构匹配算法的内在函数识别方法,其特征在于:所述步骤2)中构建出的目标汇编文件的汇编指令控制流图是一个表示程序控制流变化的有向图G=(N,E,entry,exit),其中entry表示程序唯一入口节点,exit表示程序唯一出口节点,N表示基本块,E表示有向边,G表示有向图。
5.根据权利要求1或2所述的反编译中基于子图同构匹配算法的内在函数识别方法,其特征在于,所述步骤3)中子图同构匹配的具体步骤如下:
A)对匹配状态进行初始化,初始状态S=S0,初始状态的子图同构映射集初始状态的候选节点对集P(S0)={(T1,B1),(T1,B2)…(T1,Bn)},其中S为当前匹配状态集,S0为初始状态的匹配状态集,T1为模板入口基本块,B1为目标控制流图第1个基本块,Bn为目标控制流图第n个基本块;
B)从内在函数模板库中取出一个函数模板;
C)利用VF2子图同构匹配算法进行图模式匹配和基本块语义匹配,根据当前匹配状态集S以及目标控制流图与模板子图的拓扑结构,计算出当前候选节点对集P(S),并对当前候选节点对集P(S)中的每一个候选节点对p进行基本块语义匹配,若匹配成功,则更新匹配状态集为S’,同时将候选节点对p添加到当前子图同构映射集M(S’)中,并更新候选节点对集为P(S’);继续对匹配状态集S’进行匹配,如果匹配成功,则继续匹配;否则回溯到匹配状态集S继续匹配;直至子图同构映射集包含模板子图的全部基本块,则当前内在函数模板匹配成功;
D)在目标控制流图中标记匹配成功的函数模板中的所有基本块,通过状态回溯算法继续匹配目标控制流图中存在的其他函数模板,直至当前候选节点对集P(S)为空,表示当前函数模板匹配结束;否则当前函数模板匹配失败,转至步骤B),依次取其它函数模板进行子图同构匹配,直至内在函数模板库中的函数模板匹配完毕。
6.根据权利要求5所述的反编译中基于子图同构匹配算法的内在函数识别方法,其特征在于:所述的基本块语义匹配,是用来对比内在函数模板中的基本块和目标控制流图中的待匹配基本块之间语义是否一致的方法;基本块的语义由基本块的汇编指令序列表示,将基本块的汇编指令操作码序列作为语义匹配的标准;同时基本块语义匹配满足以下要求:内在函数模板中的基本块的汇编指令操作码序列为目标控制流图中的待匹配基本块的汇编指令操作码序列的顺序子序列。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510340675.5A CN104915211B (zh) | 2015-06-18 | 2015-06-18 | 反编译中基于子图同构匹配算法的内在函数识别方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510340675.5A CN104915211B (zh) | 2015-06-18 | 2015-06-18 | 反编译中基于子图同构匹配算法的内在函数识别方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104915211A true CN104915211A (zh) | 2015-09-16 |
CN104915211B CN104915211B (zh) | 2018-04-17 |
Family
ID=54084295
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510340675.5A Expired - Fee Related CN104915211B (zh) | 2015-06-18 | 2015-06-18 | 反编译中基于子图同构匹配算法的内在函数识别方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104915211B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105589728A (zh) * | 2015-12-16 | 2016-05-18 | 西安文理学院 | 一种基于子图语义同构的指令习语识别方法 |
CN106407809A (zh) * | 2016-09-20 | 2017-02-15 | 四川大学 | 一种Linux平台恶意软件检测方法 |
CN106919429A (zh) * | 2015-12-25 | 2017-07-04 | 阿里巴巴集团控股有限公司 | 反编译数据的处理方法和装置 |
CN107908955A (zh) * | 2017-11-30 | 2018-04-13 | 华中科技大学 | 一种基于中间语言分析的控制流完整性保护方法及系统 |
CN108985052A (zh) * | 2018-07-05 | 2018-12-11 | 北京邮电大学 | 一种恶意程序识别方法、装置和存储介质 |
CN110659029A (zh) * | 2018-06-28 | 2020-01-07 | 国际商业机器公司 | 生成表示计算机程序的语义流图 |
CN110825386A (zh) * | 2019-11-01 | 2020-02-21 | 腾讯科技(深圳)有限公司 | 代码的编译方法和装置、存储介质 |
CN111400713A (zh) * | 2020-03-31 | 2020-07-10 | 玉溪师范学院 | 基于操作码邻接图特征的恶意软件族群分类方法 |
CN111737131A (zh) * | 2020-06-23 | 2020-10-02 | 南京大学 | 一种基于概率对齐的代码错误定位方法 |
CN116501378A (zh) * | 2023-06-27 | 2023-07-28 | 武汉大数据产业发展有限公司 | 一种逆向工程还原源代码的实现方法、装置和电子设备 |
CN117472388A (zh) * | 2023-12-28 | 2024-01-30 | 睿思芯科(深圳)技术有限公司 | 一种优化程序性能的方法、系统及相关设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1818863A (zh) * | 2006-03-13 | 2006-08-16 | 浙江大学 | 嵌入式软件反编译中的静态库函数识别实现方法 |
US20070234430A1 (en) * | 2003-10-08 | 2007-10-04 | Microsoft Corporation | Anti-Debugging Protection of Binaries with Proxy Code Execution |
US7508938B1 (en) * | 1999-03-01 | 2009-03-24 | Sigma Designs, Inc. | Method and apparatus for generating and using a tamper-resistant encryption key |
CN103577728A (zh) * | 2013-11-16 | 2014-02-12 | 哈尔滨工业大学 | 一种使用收缩执行依赖图识别库函数的方法 |
CN104573522A (zh) * | 2013-10-21 | 2015-04-29 | 深圳市腾讯计算机系统有限公司 | 一种漏洞分析方法和装置 |
-
2015
- 2015-06-18 CN CN201510340675.5A patent/CN104915211B/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7508938B1 (en) * | 1999-03-01 | 2009-03-24 | Sigma Designs, Inc. | Method and apparatus for generating and using a tamper-resistant encryption key |
US20070234430A1 (en) * | 2003-10-08 | 2007-10-04 | Microsoft Corporation | Anti-Debugging Protection of Binaries with Proxy Code Execution |
CN1818863A (zh) * | 2006-03-13 | 2006-08-16 | 浙江大学 | 嵌入式软件反编译中的静态库函数识别实现方法 |
CN104573522A (zh) * | 2013-10-21 | 2015-04-29 | 深圳市腾讯计算机系统有限公司 | 一种漏洞分析方法和装置 |
CN103577728A (zh) * | 2013-11-16 | 2014-02-12 | 哈尔滨工业大学 | 一种使用收缩执行依赖图识别库函数的方法 |
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105589728B (zh) * | 2015-12-16 | 2019-03-29 | 西安文理学院 | 一种基于子图语义同构的指令习语识别方法 |
CN105589728A (zh) * | 2015-12-16 | 2016-05-18 | 西安文理学院 | 一种基于子图语义同构的指令习语识别方法 |
CN106919429B (zh) * | 2015-12-25 | 2021-05-04 | 阿里巴巴集团控股有限公司 | 反编译数据的处理方法和装置 |
CN106919429A (zh) * | 2015-12-25 | 2017-07-04 | 阿里巴巴集团控股有限公司 | 反编译数据的处理方法和装置 |
CN106407809A (zh) * | 2016-09-20 | 2017-02-15 | 四川大学 | 一种Linux平台恶意软件检测方法 |
CN106407809B (zh) * | 2016-09-20 | 2019-03-01 | 四川大学 | 一种Linux平台恶意软件检测方法 |
CN107908955A (zh) * | 2017-11-30 | 2018-04-13 | 华中科技大学 | 一种基于中间语言分析的控制流完整性保护方法及系统 |
CN107908955B (zh) * | 2017-11-30 | 2019-11-12 | 华中科技大学 | 一种基于中间语言分析的控制流完整性保护方法及系统 |
CN110659029A (zh) * | 2018-06-28 | 2020-01-07 | 国际商业机器公司 | 生成表示计算机程序的语义流图 |
CN110659029B (zh) * | 2018-06-28 | 2023-03-24 | 国际商业机器公司 | 生成表示计算机程序的语义流图 |
CN108985052A (zh) * | 2018-07-05 | 2018-12-11 | 北京邮电大学 | 一种恶意程序识别方法、装置和存储介质 |
CN110825386B (zh) * | 2019-11-01 | 2023-07-14 | 腾讯科技(深圳)有限公司 | 代码的编译方法和装置、存储介质 |
CN110825386A (zh) * | 2019-11-01 | 2020-02-21 | 腾讯科技(深圳)有限公司 | 代码的编译方法和装置、存储介质 |
CN111400713A (zh) * | 2020-03-31 | 2020-07-10 | 玉溪师范学院 | 基于操作码邻接图特征的恶意软件族群分类方法 |
CN111400713B (zh) * | 2020-03-31 | 2023-05-19 | 玉溪师范学院 | 基于操作码邻接图特征的恶意软件族群分类方法 |
CN111737131A (zh) * | 2020-06-23 | 2020-10-02 | 南京大学 | 一种基于概率对齐的代码错误定位方法 |
CN111737131B (zh) * | 2020-06-23 | 2023-08-08 | 南京大学 | 一种基于概率对齐的代码错误定位方法 |
CN116501378A (zh) * | 2023-06-27 | 2023-07-28 | 武汉大数据产业发展有限公司 | 一种逆向工程还原源代码的实现方法、装置和电子设备 |
CN116501378B (zh) * | 2023-06-27 | 2023-09-12 | 武汉大数据产业发展有限公司 | 一种逆向工程还原源代码的实现方法、装置和电子设备 |
CN117472388A (zh) * | 2023-12-28 | 2024-01-30 | 睿思芯科(深圳)技术有限公司 | 一种优化程序性能的方法、系统及相关设备 |
CN117472388B (zh) * | 2023-12-28 | 2024-04-05 | 睿思芯科(深圳)技术有限公司 | 一种优化程序性能的方法、系统及相关设备 |
Also Published As
Publication number | Publication date |
---|---|
CN104915211B (zh) | 2018-04-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104915211B (zh) | 反编译中基于子图同构匹配算法的内在函数识别方法 | |
CN108446540B (zh) | 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统 | |
Marcelli et al. | How machine learning is solving the binary function similarity problem | |
Wang et al. | In-memory fuzzing for binary code similarity analysis | |
CN112733137B (zh) | 一种面向漏洞检测的二进制代码相似性分析方法 | |
CN106843840B (zh) | 一种基于相似度分析的源代码版本演化注释复用方法 | |
CN111125716A (zh) | 一种以太坊智能合约漏洞检测方法及装置 | |
CN106843849B (zh) | 一种基于文档的库函数的代码模型的自动合成方法 | |
CN103150200A (zh) | 一种计算机语言转换系统及c语言到msvl语言的转换方法 | |
CN110147235A (zh) | 一种源代码与二进制代码间的语义比对方法和装置 | |
Song et al. | Context-aware and data-driven feedback generation for programming assignments | |
CN101271397A (zh) | 一种嵌套循环结构的识别方法 | |
Xu et al. | Dsmith: Compiler fuzzing through generative deep learning model with attention | |
US8117604B2 (en) | Architecture cloning for power PC processors | |
Wang et al. | Binvuldet: Detecting vulnerability in binary program via decompiled pseudo code and bilstm-attention | |
Shypula et al. | Learning to superoptimize real-world programs | |
Shen et al. | Towards parallelism detection of sequential programs with graph neural network | |
Cao et al. | Boosting neural networks to decompile optimized binaries | |
Escalada et al. | An efficient platform for the automatic extraction of patterns in native code | |
CN115373737B (zh) | 一种基于特征融合的代码克隆检测方法 | |
CN111190585B (zh) | 基于字节码增强技术实现java模式匹配特性的方法 | |
Cesare et al. | Wire--a formal intermediate language for binary analysis | |
CN105589728B (zh) | 一种基于子图语义同构的指令习语识别方法 | |
Ayache et al. | Certifying and reasoning on cost annotations in C programs | |
CN115408700A (zh) | 基于二进制程序模块化的开源组件检测方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180417 Termination date: 20210618 |
|
CF01 | Termination of patent right due to non-payment of annual fee |