反编译中基于子图同构匹配算法的内在函数识别方法

文档序号:9200229阅读:641来源:国知局
反编译中基于子图同构匹配算法的内在函数识别方法【
技术领域
】[0001]本发明属于反编译
技术领域
,涉及一种反编译中对内联内在函数的识别方法,具体涉及一种反编译中基于子图同构匹配算法的内在函数识别方法。【
背景技术
】[0002]反编译技术最早出现在60年代,主要是为了实现代码的跨平台移植,目前已经被广泛运用到程序理解,源代码恢复,程序调试,安全分析等各个方面。反编译软件包括前端,中间端和后端。前端包括加载器、软件解析单元和解码器。加载器加载可执行文件,反汇编得到汇编代码,反编译软件再将汇编程序组织成相应的数据结构,如符号表、符号地址表、过程体入口地址表、指令链表等;软件解析单元将特定系统架构的寄存器信息、标志位函数和指令解码信息等组织成相应的数据结构,在解码阶段使用;解码器解码汇编指令序列,根据控制流重构算法构造出汇编程序的控制流图。中间端是反编译流程中最重要的部分,该部分主要包括数据流分析,控制流分析和类型分析。数据流分析通过活跃变量分析来消除无用代码,传播表达式,确定被调用过程体的参数和返回值等;控制流分析根据结构化算法,将控制流图中的节点按照其在控制流图中的位置分成不同的类别,如顺序代码块、分支代码块和循环代码块等;类型分析从机器指令的操作码、库函数的签名和常数的值等多处获取基本类型信息,然后利用类型推导规则推导其他变量的类型,从而使得生成的高级代码的可读性更强。后端是高级代码的生成,通过遍历控制流图,依据每一个基本块的类型,分别生成顺序、分支和循环的代码。[0003]目前的主流反编译软件包括Hex-Rays,Phoenix,RetargetableDecompiler,Boomerang等。Hex-Rays是基于当前最流行的商业反汇编器IDA开发的具有反编译功能的插件,可以将汇编指令转化为微指令代码,然后进行全局优化、局部优化、结构化分析和类型分析来提高微指令代码的抽象水平。Hex-Rays能识别出大概三分之一的内在函数。Phoenix在反编译软件BAP的基础上,将x86汇编指令流转化为中间语言BIL,Phoenix没有在汇编代码或者BIL上进行习语的检测,但Phoenix提供了20种模式,可以简化由gcc编译器产生的指令代码。RetargetableDecompiler利用窥孔优化算法实现了在LLVMIR代码上的习语检测,基于不同的ISA产生的IR变化很大,同时一条汇编指令对应几条复杂的LLVMIR语句,使得反编译的效率不高。Boomerang是一款在UQBT二进制翻译的基础上,面向多种架构实现的开源反编译系统,可以实现PowerPC、Spare和X86等多种体系结构的可执行程序的反编译。Boomerang中没有实现对内联内在函数的识别。[0004]程序中为了实现特定的功能通常包含大量的函数,如用户函数、系统函数等。内在函数也叫内建函数,是编译器内部的函数,既不属于库函数也不属于系统函数。虽然不同类型函数在二进制文件中的表现存在差异,但都是特定功能的代码片段,都能给出与调用点上下文相关的变量的类型信息,所以如果能识别出这些函数,不仅能够大幅减少代码的分析量,为后续分析提供类型信息,同时也能提高反编译结果的可读性,提高分析效率。在现有常规的反编译软件中,对于库函数的识别主要采用基于模式匹配的识别方法,Hex-Rays采用Flirt算法,根据库函数对应的二进制字节流信息,构建函数的签名信息,通过匹配函数签名信息识别恢复库函数。如C语言中常见的库函数strlen、strcpy、strcmp、memcmp,这类库函数也作为编译器的内在函数,在编译优化选项下,函数体在函数调用点内联展开函数体语句,Flirt算法构建的字节流函数签名,不能有效的表示指令语句之间的控制流关系,无法高效地识别出该类函数,导致对内在函数的反编译结果不完全,影响了最终产生的高级代码的可读性。【
发明内容】[0005]本发明的目的在于提供一种反编译中基于子图同构匹配算法的内在函数识别方法,能够高效地实现对内联内在函数的识别,减少类型分析和数据流分析的工作量,提高反编译过程中的抽象层次,增强反编译结果的可读性和准确性。[0006]为达到上述目的,本发明采用以下技术方案:[0007]-种反编译中基于子图同构匹配算法的内在函数识别方法,包括以下步骤:[0008]1)针对具体的编译器,构建该编译器的内在函数模板库;[0009]2)基于反编译软件Boomerang将目标汇编文件进行解码,构建出目标汇编文件的汇编指令控制流图;[0010]3)将内在函数模板库中的内在函数模版与目标汇编文件的汇编指令控制流图进行子图同构匹配,识别目标汇编文件中的目标程序中内联的内在函数;[0011]4)结合内在函数的原型和同构映射关系恢复内在函数的函数名、返回值、返回值类型和函数参数。[0012]所述步骤1)中的内在函数模板库的构建方法包括以下步骤:[0013]a)选取具有内在函数调用的程序作为样本程序,在编译器优化选项下编译样本程序生成可执行文件;[0014]b)利用IDA反汇编器反汇编可执行文件,生成汇编文件,将汇编文件作为Boomerang反编译器的输入,Boomerang反编译器对汇编文件进行加载和解码,解码模块以连续的汇编指令为基本块,以控制流关系为有向边,构建汇编文件的汇编指令控制流图;[0015]c)提取基于汇编指令控制流图的内在函数的控制流子图和汇编指令序列,作为内在函数的模板,并插入到内在函数模板库中;[0016]d)重复步骤a)~c),构造出通用计算机体系结构所共有的内在函数的内在函数模板库。[0017]所述的内在函数模板库针对具体编译器的内在函数,将代表内在函数特征的汇编指令控制流图作为内在函数的函数模板;将内在函数对应的所有函数模板以字典的形式组织,以内在函数的键为内在函数名称,以内在函数的值为模板链表;内在函数的函数模板的汇编指令控制流图的顶点由汇编指令组成的基本块构成,汇编指令控制流图的边由表示基本块之间的控制流关系组成。[0018]所述步骤2)中构建出的目标汇编文件的汇编指令控制流图是一个表示程序控制流变化的有向图G=(N,E,entry,exit),其中entry表示程序唯一入口节点,exit表示程序唯一出口节点,N表示基本块,E表示有向边,G表示有向图。[0019]所述步骤3)中子图同构匹配的具体步骤如下:[0020]A)对匹配状态进行初始化,初始状态S=Stl,初始状态的子图同构映射集M(S(>)=0,初始状态的候选节点对集P(Stl)=KTdB1),(T1,B2)…(TpBn)},其中S为当前匹配状态集,Stl为初始状态的匹配状态集,Tl为模板入口基本块,Bl为目标控制流图第1个基本块,Bn为目标控制流图第η个基本块;[0021]Β)从内在函数模板库中取出一个函数模板;[0022]C)利用VF2子图同构匹配算法进行图模式匹配和基本块语义匹配,根据当前匹配状态集S以及目标控制流图与模板子图的拓扑结构,计算出当前候选节点对集P(S),并对当前候选节点对集P(S)中的每一个候选节点对P进行基本块语义匹配,若匹配成功,则更新匹配状态集为S',同时将候选节点对P添加到当前子图同构映射集M(S')中,并更新候选节点对集为P(S');继续对匹配状态集S'进行匹配,如果匹配成功,则继续匹配;否则回溯到匹配状态集S继续匹配;直至子图同构映射集包含模板子图的全部基本块,则当前内在函数模板匹配成功;[0023]D)在目标控制流图中标记匹配成功的函数模板中的所有基本块,通过状态回溯算法继续匹配目标控制流图中存在的其他函数模板,直至当前候选节点对集P(S)为空,表示当前函数模板匹配结束;否则当前函数模板匹配失败,转至步骤B),依次取其它函数模板进行子图同构匹配,直至内在函数模板库中的函数模板匹配完毕。[0024]所述的基本块语义匹配,是用来对比内在函数模板中的基本块和目标控制流图中的待匹配基本块之间语义是否一致的方法;基本块的语义由基本块的汇编指令序列表示,将基本块的汇编指令操作码序列作为语义匹配的标准;同时基本块语义匹配满足以下要求:内在函数模板中的基本块的汇编指令当前第1页1 2 3 4 
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1