一种基于子图语义同构的指令习语识别方法

文档序号:9826128阅读:339来源:国知局
一种基于子图语义同构的指令习语识别方法
【技术领域】
[0001] 本发明属于反编译技术领域,具体涉及一种基于子图语义同构的指令习语识别方 法。
【背景技术】
[0002] 随着科技进步,目前大部分软件使用高级语言编写以机器码形式提供给用户,而 机器码可读性差,人们需要将机器码程序翻译成易于理解的高级语言程序,达到对显卡有 软件分析、理解和维护的目的。反编译技术又称为逆向编译技术,是指将可执行文件变成高 级语言源程序的过程,反编译作为一种软件分析和理解的工具目前已经被广泛运用到程序 理解、程序调试、源代码恢复等各个方面。反编译的过程通常包括:目标语言代码-反汇编 -语言和编译器版本识别-库函数或类库识别-预处理-中间语言-数据流分析、控制流 分析-翻译器-高级语言。目前,主流反编译软件包括如1-1^7 8,1^〖3^6〖31316 Decompiler,SecondWrite等,它们的基本技术是在汇编指令序列流中搜索相应的子序列, 这种方法受到编译优化阶段的代码调度,代码优化等因素的影响,并不能够完全检测出程 序中的指令习语。而基于子图语义同构的指令习语检测方法可以有效的检测出程序中因指 令调度而被隐藏的指令习语,进而有效提高代码的抽象程度。

【发明内容】

[0003] 本发明的目的是提供一种基于子图语义同构的指令习语识别方法,检测出程序中 因指令调度而被隐藏的指令习语,提高代码的抽象程度。
[0004] 本发明所采用的技术方案是,一种基于子图语义同构的指令习语识别方法,包括 以下步骤:
[0005] 步骤1:根据汇编程序控制流图的构建算法,构建过程体的汇编指令控制流图;
[0006] 步骤2:在步骤1所得的汇编指令控制流图上进行指令习语的分析,通过频繁序列 挖掘算法分析出不同的指令习语所对应的指令序列流,将所有的指令习语和指令序列流构 成数据依赖图;
[0007] 步骤3:步骤2中的数据依赖图键值对存储在数据库中,构建指令习语数据库;
[0008] 步骤4:遍历汇编指令控制流图中的每一个基本块,构造基本块的数据依赖图,将 所得数据依赖图中的每一个连通子图分别与步骤3中所得指令习语数据库中的的指令习语 所对应的数据依赖图进行子图语义同构匹配,并在基本块的数据依赖图中标记出被匹配的 汇编指令控制流子图以及对应的指令习语;
[0009] 步骤5:根据数据流分析算法,分析出步骤4中被匹配的汇编指令控制流子图入口 处和出口处的活跃变量,将活跃变量分别作为该汇编控制流子图所代表的抽象操作的参数 和返回值;
[0010] 步骤6:将步骤5中被标记出来的汇编指令控制流子图进行消减,删除匹配到的节 点,重构数据依赖图中的边集,即可实现指令习语的识别。
[0011]本发明的特点还在于,
[0012] 步骤2中,利用频繁序列挖掘指令习语所对应的指令序列流的方法具体按照以下 步骤实施:
[0013] a)选择包含待挖掘指令习语的源程序,用不同的编译器的不同的优化级别编译源 程序,得到二进制程序集合;
[0014] b)利用反汇编工具反汇编二进制程序集合,得到汇编程序集合;
[0015] c)利用汇编程序控制流图构建算法,构建汇编程序的控制流图;针对基于控制流 图的汇编程序,以基本块为汇编程序作为用户编号,以基本块为事务编号以及以指令为事 务类型;将b)到c)所建立的数据库作为频繁序列算法的输入,找出任一指令习语所对应的 指令序列流。
[0016] 步骤2中,汇编程序控制流图构建算法具体按照以下步骤实施:
[0017 ] a)构建空的未访问地址链表,并用函数入口地址初始化未访问地址链表;
[0018] b)取未访问地址链表的首元素,如果该地址处的指令已经包含在汇编指令控制流 图中的某个基本块中,则需要分裂包含该地址的基本块并重新构建基本块之间的跳转关 系;否则,从该地址开始的内存中连续取指令,直到遇到跳转指令或程序结尾为止;以取到 的指令集合为内容,实例化当前基本块;同时,为当前基本块的跳转地址和后继地址的指令 序列构建基本块,并加入到汇编指令控制流图中;最后,设置当前基本块与跳转基本块以及 当前基本块与后继基本块的跳转关系;
[0019] c)将b)中分支基本块的跳转地址和后续地址加入到未访问地址链表中;
[0020] d)重复执行b)到c),直至未访问地址链表为空。
[0021] 步骤3中,指令习语数据库的构建包括以下步骤:
[0022] a)针对所有待挖掘的指令习语,构造包含相应指令习语的源程序,用不同编译器 的不同优化级别编译源程序,利用频繁序列算法挖掘包含不同指令习语的源程序中的频繁 序列,将这些频繁序列作为相应指令习语的指令序列流;
[0023] b)将指令习语和相应的指令习语的指令序列流作为元素,通过定义-使用关系构 建该指令序列流的数据依赖图G=(V,E),其中顶点V是基本块中的指令,边集E由定义-使用 关系确定,若指令I使用了指令J定义的寄存器或内存,则构造一条有向边〈I,J>;
[0024] c)以指令习语和对应的数据依赖图为元素,将其插入到指令习语数据库中。
[0025] d)重复步骤a)到c)的过程,直至构造出符合预期的指令习语数据库。
[0026] 步骤4具体按照以下步骤实施:
[0027] a)对待匹配过程体的汇编指令控制流图中的每一个基本块进行数据流分析,并且 根据定义-使用关系建立每个基本块的数据依赖图;
[0028] b)将每个基本块中的数据依赖图中的连通子图与指令习语数据库中的指令习语 对应的数据依赖图进行子图语义同构匹配,并在基本块的数据依赖图中标记出匹配子图以 及对应的指令习语。
[0029] 步骤5中,参数和返回值的确定包括以下步骤:
[0030] a)以汇编指令控制流图的基本块为单位进行数据流分析,计算被匹配的汇编指令 控制流子图入口处和出口处的活跃变量;
[0031] b)将匹配到的指令习语入口处的活跃变量作为该指令习语的参数,以匹配到的指 令习语出口处的活跃变量作为该指令习语的返回值。
[0032]步骤6中,重构数据依赖图的边集包括以下步骤:
[0033] a)确定数据依赖图中被匹配指令习语的边界;
[0034] b)删除被匹配的的子图。
[0035] 本发明的有益效果是,在反汇编阶段,检测指令习语可以提高中间表达式的通用 性;在基于控制流图的汇编程序上进行指令习语分析,可以消减中间表达式的数目和降低 控制流的复杂度,进而可以有效简化后续数据流分析和控制流分析;在基本块内进行指令 习语检测,使得指令习语分析有了边界,提高了指令习语分析的精确度;通过构造基本块内 的指令之间的数据依赖图,可以有效地消除指令调度对于指令顺序的影响,提高指令习语 的识别精度;子图语义同构算法可以精确的匹配出基本块的数据依赖图中内嵌的指令习 语。
【附图说明】
[0036]图1是本发明一种基于子图语义同构的指令习语识别方法的工作流程图;
[0037]图2是x86中除7指令习语的数据依赖图;
[0038]图3是本发明方法中子图语义同构匹配过程的示意图;
【具体实施方式】
[0039]下面结合附图和【具体实施方式】对本发明进行详细说明。
[0040]本发明一种基于子图语义同构的指令习语识别方法,工作流程如图1所示,具体按 照以下步骤实施:
[0041 ]步骤1:根据汇编程序控制流图的构建算法,构建过程体的汇编指令控制流图; [0042]步骤2:在步骤1所得的汇编指令控制流图上进行指令习语的分析,通过频繁序列 挖掘算法分析出不同的指令习语所对应的指令序列流,将所有的指令习语和指令序列流构 成数据依赖图;
[0043]具体包括以下步骤:
[0044] a)选择包含待挖掘指令习语的源程序,用不同的编译器的不同的优化级别编译源 程序,得到二进制程序集合;
[0045] b)利用反汇编工具反汇编二进制程序集合,得到汇编程序集合;
[0046] c)利用汇编程序控制流图构建算法,构建汇编程序的控制流图。针对基于控制流 图的汇编程序,以基本块为汇编程序作为用户编号,以基本块为事务编号以及以指令为事 务类型。将b)到c)所建立的数据库作为频繁序列算法的输入,找出任一指令习语所对应的 指令序列流;
[0047] d)将所有的指令习语和指令序列流构成数据依赖图。
[0048]数据依赖图的构建算法如下:
[0049] Proc build_instruction_dependency_graph()
[0050] 输入:汇编指令序列流
[0051] 输出:汇编指令依赖图
[0052] 1.统计指令序列流中的每条指令的定义和使用集合
[0053] 2.对于指令序列流的指令I,获取指令I的定义集合lx
[0054] 3.遍历集合lx中的每个定义Id,在从指令I开始到Id的下一个定义点的指令序列 流中寻找Id的使用指令Iy,并构造一条〈Ix,Iy>有向边。
[0055] End proc
[0056] x86中的除7指令流序列如下:
[0057] mov ecx,[esp+lCh]
[0058] mov edx,92492493h
[0059] mov eax,ecx
[0060] imul edx
[0061] lea eax,[edx+ecx]
[0062] sar eax,2
[0063] sar ecx,lFh
[0064] sub eax,ecx
[0065]
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1