当前位置: 首页 > 专利查询>北京大学专利>正文

一种嵌套循环结构的识别方法技术

技术编号:2824750 阅读:293 留言:0更新日期:2012-04-11 18:40
本发明专利技术属于逆向工程和程序分析领域,具体涉及一种识别循环结构的方法对可执行文件进行反汇编,得到该可执行文件的中间代码;从上述中间代码中提取控制流信息,得到控制流图;深度优先遍历控制流图,识别循环节点;标记节点的最内层循环头节点;将对应的控制流图识别为循环结构。本发明专利技术可以有效判定循环结构,以及它们之间的嵌套关系,进而有效结构化程序控制流图。可用于反编译、软件测试等设备中。

【技术实现步骤摘要】

本专利技术属于逆向工程和程序分析领域,具体涉及一种识别嵌套循环结构的方法,可用于反编译、软件测试等设备中,能够有效的将程序控制流图结构化。
技术介绍
反编译是从可执行文件获得与源程序等效的高级代码的技术,是逆向工程领域的核心技术之一,在不同的应用领域发挥着重要的作用。最初,反编译技术主要应用于辅助程序移植,如将程序从第二代计算机向第三代计算机迁移;到了70年代和80年代,反编译技术开始被用于再工程(Re-engineering),包括对遗失源码或第三方的二进制程序进行理解、文档化、重构和修改;从90年代中后期开始,信息安全领域对反编译技术有了巨大的应用需求,比如挖掘软件安全漏洞、分析恶意软件等工作,都对反编译技术有着很高的依赖。控制流分析是反编译中的重要研究领域,复合条件分支识别、嵌套循环识别和多路分支(switch)识别是其中最重要的三个控制结构识别问题,也是反编译自动化的核心技术之一。如果不能准确识别这三种控制结构,会严重制约反编译技术的发展,限制反编译技术在其它领域的应用。本专利技术关注控制流分析中循环结构的识别。循环是用来实现重复指令的控制结构。在控制流图中,循环经常嵌套在其它循环内部。这种现象产生了被称作“循环嵌套森林”的结构。尽管现代的程序使用结构化的编程方法,但当高级语言程序被编译成了二进制程序以后,其中的循环结构常常因为内部的多层嵌套循环的跳转指令(例如break语句,continue语句和return语句等),其单入口的结构化特性遭到了破坏,不再符合结构化原则,即其对应的控制流图是不可规约的。如图1所示为一个典型的不可规约循环的控制流图。图2为它所对应的“循环嵌套森林”。嵌套循环的识别是结构化程序设计语言中循环语句的编译问题的逆命题。就是如何识别二进制程序中的循环结构的范围以及它们之间的嵌套关系,从而使反编译生成的高级语言程序结构仍然保持较好的结构化特性。如果不能准确识别循环结构的范围以及它们之间的嵌套关系,则可能影响到反编译最终生成的源程序的语意的准确性以及结构化特性。对循环识别的研究开始于1970年,F.E.Allen和J.Cocke提出了控制图的可归约性(参见F.E.Allen.Control flow analysis.SIGPLAN Notices,5(7)1:19,1970),此后编译和反编译领域的工作都开始关注这个问题。1997年,P.Havlak在R.E.Tarjan(参见R.E.Tarjan,Testing flow graph reducibility,J.Comput.Syst.Sci.9,1974)的基础上提出了对常规控制流图的近似线性时间的算法(参见P.Havlak,-->Nesting of reducible and irreducible loops,ACM Transactions on Programming Languages andSystems,Vol.19,No.4,1997)。两年后G.Ramalingam提出了对Havlak算法的一个改进算法(参见G.Ramalingam,Identifying loops in almost linear time,ACM Transactions on Programming Languages andSystems,Vol.21,No.2,1999),在最差情况下近似线性时间的算法(但是在常规情况下比Havlak算法慢)。上述方法通常基于复杂的数据结构,例如Interval/DSG,或者UNION-FIND集合,对这些数据集合的复杂操作使得这些算法的效率很低。本专利技术提出了一种在二进制可执行程序中识别循环的新方法,该方法只需要对控制流图进行一次深度优先搜索就可以准确的处理不可归约的控制流图,并且不需要复杂的数据结构。该方法已经对Windows XP和linux下的多个典型的可执行文件进行了分析,实验表明该方法近似线性时间,并且比Havlak的算法快2~5倍。
技术实现思路
本专利技术的目的在于提供一种循环识别的方法,能够精确、高效、自动化识别循环结构。为明确本专利技术的内容及方便表述,下面给出循环及相关概念的适当说明。(参见S.S.Muchnick,Advanced Compiler Design and Implementation,Elsevier Science(USA),1997.P.Havlak,Nestingof reducible and irreducible loops,ACM Transactions on Programming Languages and Systems,Vol.19,No.4,1997.)。控制流图(CFG):描述程序的控制流信息的连通有向图;通常用(N,E,h)表示,其中N是程序中基本块的集合,E是这些基本块之间的有向边,h是程序的入口。强连通域(SCR):S⋐N]]>节点的非空集合;给定任意q,r∈S,存在从q到r的路径和从r到q的路径。当一个SCR不存在属性为SCR的父集合时,称它为最大SCR。循环:包括最外层循环和内部循环。最外层循环:一个至少包含一条内部边的最大SCR。循环头节点和循环体:在深度优先搜索中,访问到的第一个循环节点称作循环头节点,其余的节点称为循环体。最大外层循环:嵌套在循环L中并以h为头节点的嵌套循环是在以(L-{h本文档来自技高网
...

【技术保护点】
一种嵌套循环结构的识别方法,其步骤包括:1)对可执行文件进行反汇编,得到该可执行文件的中间代码;2)从上述中间代码中提取控制流信息,得到控制流图;3)深度优先遍历控制流图,得到循环结构子图,该循环结构包括:3 -1)循环头节点;3-2)循环体节点,及其最内层循环头节点;3-3)重入口节点,及其重入边;4)标记上述节点的最内层循环头节点;5)将上述循环结构子图识别循环结构。

【技术特征摘要】
1. 一种嵌套循环结构的识别方法,其步骤包括:1)对可执行文件进行反汇编,得到该可执行文件的中间代码;2)从上述中间代码中提取控制流信息,得到控制流图;3)深度优先遍历控制流图,得到循环结构子图,该循环结构包括:3-1)循环头节点;3-2)循环体节点,及其最内层循环头节点;3-3)重入口节点,及其重入边;4)标记上述节点的最内层循环头节点;5)将上述循环结构子图识别循环结构。2. 如权利要求1所述的嵌套循环结构的识别方法,其特征在于对于当前访问的节点,如其一后继节点没有被遍历,且处于深度优先生成树上从控制流图入口节点到当前访问节点的路径上,则该后继节点为循环头节点,将该后继节点加入该当前访问节点的循环头节点列表中。3. 如权利要求1所述的嵌套循环结构的识别方法,其特征在于对于当前访问的节点,如其一后继节点没有被遍历过,则遍历该后继节点,如该后继节点位于一循环体内,则当前访问节点为循环体节点,将该后继节点的最内层循环头节点加入该当前访问节点的循环头节点列表中。4. 如权利要求1所述的嵌套循环结构的识别方法,其特征在于对于当前访问的节点,如其一后继节点被遍历过,且不处于深度优先生成树上从控制流图入口节点到当前访问节点的路径上,但该后继节点位于有最内层循环头节点位于深度优先生成树上从控制流图入口节点到当前访问...

【专利技术属性】
技术研发人员:韦韬李佳静毛剑邹维王铁磊王伟
申请(专利权)人:北京大学
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1