首页> 中国专利> 反编译中基于子图同构匹配算法的内在函数识别方法

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

摘要

本发明公开了一种反编译中基于子图同构匹配算法的内在函数识别方法,属于反编译技术领域。本发明通过建立内在函数模板库,对内在函数模板与反编译产生的基于控制流图的目标汇编文件进行子图同构匹配,定位目标汇编文件中目标程序中的经编译优化并内联展开的内在函数。本发明实现了在反编译过程中对内联内在函数的自动识别,同时通过对内在函数的模板和原型进行分析,恢复内在函数的函数名、返回值、返回值类型和函数参数,达到内联内在函数语义提升的目的。经过提升的内联内在函数为反编译中的类型分析提供了更多的类型信息,降低了数据流分析和控制流分析的复杂度,提高了中间代码的抽象层次,增强了反编译结果的可读性。

著录项

  • 公开/公告号CN104915211A

    专利类型发明专利

  • 公开/公告日2015-09-16

    原文格式PDF

  • 申请/专利权人 西安交通大学;

    申请/专利号CN201510340675.5

  • 发明设计人 赵银亮;张磊;刘凯;刘延昭;

    申请日2015-06-18

  • 分类号

  • 代理机构西安通大专利代理有限责任公司;

  • 代理人岳培华

  • 地址 710049 陕西省西安市咸宁西路28号

  • 入库时间 2023-12-18 10:50:22

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-06-07

    未缴年费专利权终止 IPC(主分类):G06F 8/53 专利号:ZL2015103406755 申请日:20150618 授权公告日:20180417

    专利权的终止

  • 2018-04-17

    授权

    授权

  • 2015-10-14

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20150618

    实质审查的生效

  • 2015-09-16

    公开

    公开

说明书

技术领域

本发明属于反编译技术领域,涉及一种反编译中对内联内在函数的识别方法,具体涉及一 种反编译中基于子图同构匹配算法的内在函数识别方法。

背景技术

反编译技术最早出现在60年代,主要是为了实现代码的跨平台移植,目前已经被广泛运 用到程序理解,源代码恢复,程序调试,安全分析等各个方面。反编译软件包括前端,中间端 和后端。前端包括加载器、软件解析单元和解码器。加载器加载可执行文件,反汇编得到汇编 代码,反编译软件再将汇编程序组织成相应的数据结构,如符号表、符号地址表、过程体入口 地址表、指令链表等;软件解析单元将特定系统架构的寄存器信息、标志位函数和指令解码信 息等组织成相应的数据结构,在解码阶段使用;解码器解码汇编指令序列,根据控制流重构算 法构造出汇编程序的控制流图。中间端是反编译流程中最重要的部分,该部分主要包括数据流 分析,控制流分析和类型分析。数据流分析通过活跃变量分析来消除无用代码,传播表达式, 确定被调用过程体的参数和返回值等;控制流分析根据结构化算法,将控制流图中的节点按照 其在控制流图中的位置分成不同的类别,如顺序代码块、分支代码块和循环代码块等;类型分 析从机器指令的操作码、库函数的签名和常数的值等多处获取基本类型信息,然后利用类型推 导规则推导其他变量的类型,从而使得生成的高级代码的可读性更强。后端是高级代码的生成, 通过遍历控制流图,依据每一个基本块的类型,分别生成顺序、分支和循环的代码。

目前的主流反编译软件包括Hex-Rays,Phoenix,Retargetable Decompiler,Boomerang等。 Hex-Rays是基于当前最流行的商业反汇编器IDA开发的具有反编译功能的插件,可以将汇编 指令转化为微指令代码,然后进行全局优化、局部优化、结构化分析和类型分析来提高微指令 代码的抽象水平。Hex-Rays能识别出大概三分之一的内在函数。Phoenix在反编译软件BAP 的基础上,将x86汇编指令流转化为中间语言BIL,Phoenix没有在汇编代码或者BIL上进行 习语的检测,但Phoenix提供了20种模式,可以简化由gcc编译器产生的指令代码。Retargetable  Decompiler利用窥孔优化算法实现了在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 short  loc_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}。

综上所述,本发明实现了在反编译过程中对内联内在函数的自动识别,同时通过对内在函 数的模板和原型进行分析,恢复内联内在函数的函数名、返回值、返回值类型和函数参数,达 到内联内在函数语义提升的目的。经过提升的内联内在函数为反编译中的类型分析提供了更多 的类型信息,降低了数据流分析和控制流分析的复杂度,提高了中间代码的抽象层次,增强了 反编译结果的可读性。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号