多路分支结构的识别方法

文档序号:6574749阅读:210来源:国知局
专利名称:多路分支结构的识别方法
技术领域
本发明属于逆向工程和程序分析领域,具体涉及一种识别多路分支结构(或为N路分支 结构)的方法,可用于反编译、软件测试等设备中,能够有效地将程序控制流图结构化。
技术背景编译是指将一个用源语言表示的算法转换到一个等价的用目标语言表示的算法,如将高级语言表示的算法转换到机器可执行指令序列;反编译是是编译的逆过程,具体指从可执行 文件(表现为计算机可执行的二进制编码)获得与源程序等效的高级代码的技术;进一步, 反汇编是反编译技术的重要部分,其效果在于从可执行文件获得与源程序等效的汇编语言代 码。最初,反编译技术主要应用于辅助程序移植,如将程序从第二代计算机向第三代计算机 迁移;到了70年代和80年代,反编译技术开始被用于再工程(Re-engineering),包括对遗 失源码或第三方的二进制程序进行理解、文档化、重构和修改;从90年代中后期开始,信息 安全领域对反编译技术有了巨大的应用需求,比如挖掘软件安全漏洞、分析恶意软件等工作, 都对反编译技术有着很高的依赖。一方面,由于在机器可执行指令级别无法表达高级语言的许多结构化特征,当高级语言 代码被编译转换到机器可执行指令序列后,高级语言中许多结构化控制流信息丢失。另外, 编译器的各种优化策略和实现方法,也会导致高级语言中某些结构化控制流信息在编译后缺 失。另一方面,现在反汇编技术已经十分成熟,大量反汇编工具被广泛使用。反汇编工具对 可执行文件反汇编处理,获得中间代码表示(表现为汇编语言代码)。这些中间代码的控制流 结构,与可执行文件内在的控制流结构一致。虽然反汇编技术可以获得与可执行文件内在的控制流结构一致的中间代码的控制流图, 但是大量高级语言所特有的结构化特征已经缺失。通过控制流分析识别高级语言中控制结构, 是反编译中的重要研究领域,也是反编译自动化的核心技术之一。具体而言,复合条件分支、嵌套循环和N路分支(switch)三种结构,在编译后结构化 特征缺失最为严重,而这三种结构又是高级语言的三种最重要的控制结构。如果在反编译过 程中不能准确识别这三种控制结构,会严重制约反编译技术的发展,限制反编译技术在其它 领域的应用。作为三种最重要的控制结构之一,N路分支结构被编译转换后, 一般以下面两种控制形式存在1. "跳转表"在跳转表中记录每一路分支的偏移地址,根据N路分支的具体case,选 择预定义的偏移地址,直接确定指令的转移地址。图1中N路分支结构被编译转换到跳转表 结构后,经IDA Pro反汇编结果部分片段如图2所示在off—80484F8中记录了各路分支的 偏移地址,实际执行中,根据具体case (寄存器eax的取值)确定指令流;2. 离散分支判断将原有N路分支结构,分解为多条分支判断,进而确定指令转移地址。 图1中N路分支结构编转换为离散分支判断后,经反汇编工具IDA Pro反汇编,获得其汇编 语言级中间代码片断如图3所示;图4为图3中汇编代码的控制流图示意图。使用"跳转表"表示switch结构的方法很容易判断,现有反汇编工具即可完成,如反汇 编工具IDA Pro。图2中反汇编的结果即由IDA Pro获得,switch结构已经被完整识别,并 做出了标识(如无特殊说明,switch结构与N路分支结构等同)。然而,当N路分支结构被编译转换为"离散分支判断"形式时,现有的控制流分析方法 只是简单地将"离散分支判断"处理为多个if判断语句。例如,在图1所示高级代码中N路 分支结构被编译转换为"离散分支判断"形式时,IDA Pro的反汇编结果中,仅仅将"离散 分支判断"理解为多个分支判断语句。上述处理方法过于简单,使反编译后生成的程序缺失 大量switch结构信息,降低了程序的结构化特性;由于增加了大量不必要的if判断语句, 程序整体的控制流关系更加复杂,降低了程序的可读性;而且,当N路分支结构与其他控制 流结构(复合分支结构、循环结构、N路分支结构)嵌套耦合时,传统方法无法有效结构化程 序的控制流图,只能补充额外的goto语句,破坏程序的结构,增大后期分析的难度。如图5 所示代码,优化编译后的程序控制流图如图6所示。如果在图6中switch结构被当作多个 if判断语句处理,每一个分支节点的目标节点(return语句),都具有两个入口,程序不再 符合结构化原则,需要补充goto语句来衔接控制流。关于程序控制流的概念,如程序控制流图、基本块、直接前驱、直接后继等概念为本领 域基本概念,不作具体说明,可参考《编译程序设计原理》 一书(杜淑敏等,北京大学出版社,2003)。通常以S恥c(")代表控制流图中节点"的直接后继节点集;以PrW(")代表控制流图中节点m的直接前驱节点集;IPrI和I 1分别表示节点n的前驱节点个数和节点w的后继节点个数。 发明内容本发明的目的在于提供一种在控制流图中自动识别被编译转换为离散分支判断形式的N 路分支结构的方法,进而使程序控制流更具结构化特征,便于反编译的后继工作。本发明的多路分支结构的识别方法,其歩骤包括1) 对可执行文件进行反汇编,得到该可执行文件的中间代码;2) 从上述中间代码中提取控制流信息,得到控制流图;3) 遍历控制流图,得到离散判断分支子图,该子图满足;3-1)具有唯一入口节点,该入口节点为分支节点,具有两个直接后继节点;3-2)具有第一类节点,该类节点均为分支节点,有且仅有一个同属第一类节点或入口节 点的直接前驱节点,第一类节点和入口节点均对同一参数作不同比较;3-3)具有第二类节点,该类节点具有属于第一类节点或入口节点的直接前驱节点,且第 一类节点或入口节点的直接后继节点或属于第一类节点,或属于第二类节点;3-4)第二类节点的个数大于2;4) 将上述离散判断分支子图识别为多路分支结构。 上述遍历控制流图,得到离散判断分支子图的步骤具体为1) 遍历控制流图的一个不属于任何已知多路分支结构的分支节点;2) 遍历上述分支节点的直接后继节点,及这些直接后继节点的直接后继节点,将满足下 列条件的上述节点记为第一类节点2-1)该直接后继节点为分支节点;2-2)该直接后继节点只有一直接前驱节点,且该直接前驱节点为第一类节点或入口节点; 2-3)与l)所述分支节点对同一参数作不同比较;2- 4)与其他第一类节点不构成循环路径;3) 将满足下列条件的节点记为第二类节点3- 1)具有属于第一类节点或入口节点的直接前驱节点;3-2)第一类节点或入口节点的直接后继节点或属于第一类节点,或属于第二类节点;4) 计算第二类节点的个数,如果大于2,则l)所述分支节点为离散判断分支子图入口 节点,入口节点、第一类和第二类节点对应的子图为离散判断分支子图;否则按照上述方式 遍历控制流图的其他分支节点。上述节点为扩展后的节点,控制流图为扩展后的控制流图。因为"离散分支判断"子图是N路分支结构的拓扑表示,所以N路分支结构经编译转换 生成离散分支判断形式后,其内在的控制结构一定符合本发明所识别的"离散分支判断"子 图结构。本发明首次提出识别被编译转换为离散分支判断形式的N路分支结构的方法,具有以下有益效果1) 在反编译阶段,避免了传统方法处理"离散分支判断"子图时引入的不必要的分支判断 结构,简化了程序控制流图;2) 识别出的switch结构,更符合高级语言的结构化特性,使反编译后的目标代码结构更加 合理,增强了目标代码的可读性,便于后继分析;3) 当N路分支结构与其他控制结构相关联耦合时,传统方法可能无法将其结构化,只能 引入goto语句,破化程序内在的结构化特性。本发明能够准确识别N路分支结构,避 免传统方法引入的goto语句,保留程序内在结构化特性。本发明所述方法完全自动化识别被编译转换为离散分支判断形式的N路分支结构,实现 简单,识别结果准确;进一步地,该方法复杂度低,识别效率高,极具推广价值。


图1是高级语言中N路分支结构的代码示例图2是图1中代码被编译转换为跳转表形式后,IDA Pro反汇编所获得代码片断图3是图1中代码被编译转换为离散分支判断形式后,IDA Pro反汇编所获得代码片断图4是图3中汇编代码的控制流5是高级语言中N路分支结构相耦合的代码示例图6是图5中代码被编译优化后的控制流7是识别被编译转换为离散分支判断形式的N路分支结构的整体流程图 图8为识别"离散分支判断"子图的具体流程图具体实施方式
本发明的识别被编译转换为离散分支判断形式的N路分支结构的方法,包括通过下述步骤来表述1) 对可执行文件进行反汇编,得到该可执行文件的中间代码;2) 从上述中间代码中提取控制流信息,得到控制流图C^(iV,五,/0: W是节点集合,£ 是边的集合,/Z是控制流图入口节点;3) 遍历控制流图,识别"离散判断分支"子图S-(7V',五',/ ',C): W'和C为控制流图节点的子集;/z'为子图的入口节点,五'为控制流图边集合的子集;该子图S进一步 满足下列条件a) /Z'为子图S唯一入口,且/2'为分支节点(有两个直接后继节点);b) X寸于V"eW-{/ '}, w为分支节点,<formula>formula see original document page 6</formula>;更进一步,iV'中所有分支节点,都对同一个参数作不同的比较;4)将上述离散判断分支"子图识别为N路分支结构C中节点是switch结构的各路分 支。进一步地,在反汇编获得的控制流图基础上,由如下方法获得扩展控制流图1) 对于控制流图中任意两个节点6、 C,如果点6、 C满足(6卜PrW(c)且(c卜^cc(6), 则将6和C合并为一个新的节点6',在程序控制流图中代替6、 C;2) 重复l)中合并、替代过程,直至程序控制流图中任意两个节点都不满足l)中合并条件。进一步地,识别上述"离散判断分支"子图包括以下步骤-1) 给定程序扩展控制流图G = (A^,&Z0及分支节点/z'2) 如果//'不属于任何已知N路分支结构,则令W'-W);否则返回;3) 对于集合("'l"'e&cc(") V"eA^内任意元素w,,如果"满足a) w,是分支节点b) ^有且只有一个直接前驱,而且该前驱节点属于iV'c) "i与iV'中其他节点是对同一个参数作不同的比较;d) "i与W'中其他节点不构成循环路径则将巧添加至7V'中;4) 重复3)中过程,直至iV'不再发生变化5) 计算节点集合C;计算边集合£';6) 如果ICI〉2,返回S-(iV',五',/;',C);否则/z'不是"离散分支子图"的入口 。 下面结合附图,更详细的描述本发明的具体实施方式
。参看图7,识别被编译转换为离散分支判断形式的N路分支结构的整体流程为步骤l:利用各种反汇编工具,对可执行文件反汇编处理,获得中间代码表示;各种反汇编工具,如IDA Pro, Objdump,可以自动完成该过程;步骤2:在中间代码基础上,提取控制流信息,进一步获得扩展控制流图;步骤3:在扩展控制流基础上,识别"离散分支判断"子图。进一步,参看图8,识别"离散分支判断"子图的具体流程为 步骤l:输入扩展控制流图,待处理节点A';步骤2:如果/ '不是分支节点,返回/ '不是"离散分支判断"子图入口否则继续; 歩骤3:令W、(/^;并将C和Pipe设置为/ '的两个后继,标记A'已被处理;步骤4:循环执行下列操作,直至Pipe中不含任何节点1) 令b作为Pipe中第-个节点,并从Pipe中b删除;2) 当b满足a) 是分支节点b) 未被处理过c) 只有一个前驱节点d) b与/2'针对同一个参数作不同的比较执行3);否则执行1)3) 将b添加至7V'中、b的后继节点添加至Pipe和C中,从C中将b删除,并把b标示 为己被处理。步骤5:步骤4中循环结束后,如果C中元素个数多余两个,返回A'是"离散分支判断" 子图入口以及W'和C;否则,返回/z'不是"离散分支判断"子图入口。参见图6,根据上述识别"离散分支判断"子图的过程,具体分析如下1) 将"3 = 1"作为/7'时,"a二l"的两个后继比较的参数是b,与"a二l"比较的参数a不同, 步骤4)结束后,C中没有节点。故"a:r不是"离散分支判断"子图的入口;2) 将"(^) + +巾==1"作为/ '时,可以识别"离散分支判断"子图S^W,五',A',C),其中a) N' = {"(*c) + +;b == l","b == 2","b == 3"}b) C-("Re詢w r',"Refr朋 2","Refnm 0","R掛ww -1"}3) 将"(k)—^==0"作为/ '时,可以识别"离散分支判断"子图S:(,,E',/(',C),其 中a) N' = {"(*c)--;b == 0","b == l","b == 2"},b) C-("R欲j/" l","Re/ra2'V'Re/,wn 0","Re/raw -1"}.
权利要求
1. 一种多路分支结构的识别方法,其步骤包括1)对可执行文件进行反汇编,得到该可执行文件的中间代码;2)从上述中间代码中提取控制流信息,得到控制流图;3)遍历控制流图,得到离散判断分支子图,该子图满足;3-1)具有唯一入口节点,该入口节点为分支节点,具有两个直接后继节点;3-2)具有第一类节点,该类节点均为分支节点,有且仅有一个同属第一类节点或入口节点的直接前驱节点,第一类节点和入口节点均对同一参数作不同比较;3-3)具有第二类节点,该类节点具有属于第一类节点或入口节点的直接前驱节点,且第一类节点或入口节点的直接后继节点或属于第一类节点,或属于第二类节点;3-4)第二类节点的个数大于2;4)将上述离散判断分支子图识别为多路分支结构。
2. 如权利要求1所述的多路分支结构的识别方法,其特征在于所述遍历控制流图,得到离散判断分支子图具体为1) 遍历控制流图的一个不属于任何己知多路分支结构的分支节点;2) 遍历上述分支节点的直接后继节点,及这些直接后继节点的直接后继节点,将满足下 列条件的上述节点记为第一类节点2-1)该直接后继节点为分支节点;2-2)该直接后继节点只有一直接前驱节点,且该直接前驱节点为第一类节点或入口节点; 2-3)与l)所述分支节点对同一参数作不同比较;2- 4)与其他第一类节点不构成循环路径;3) 将满足下列条件的节点记为第二类节点3- 1 )具有属于第一类节点或入口节点的直接甜驱节点;3-2)第一类节点或入口节点的直接后继节点或属于第一类节点,或属于第二类节点;4) 计算第二类节点的个数,如果大于2,则l)所述分支节点为离散判断分支子图入口 节点,入口节点、第一类和第二类节点对应的子图为离散判断分支子图;否则按照上述方式 遍历控制流图的其他分支节点。
3. 如权利要求1或2所述的多路分支结构的识别方法,其特征在于所述节点为扩展后的节点。
4. 如权利要求1所述的多路分支结构的识别方法,其特征在于对可执行文件通过反汇编工具 IDAPro进行反汇编。
5. 如权利要求l所述的多路分支结构的识别方法,其特征在于对可执行文件通过反汇编工具 Objdump进行反汇编。
全文摘要
本发明属于逆向工程和程序分析领域,具体涉及一种识别多路分支结构的方法,对可执行文件进行反汇编,得到该可执行文件的中间代码;从上述中间代码中提取控制流信息,得到控制流图;遍历扩展控制流图,识别离散判断分支子图,将上述离散判断分支子图识别为多路分支结构。本发明简化了程序控制流图;使反编译后的目标代码结构更加合理,增强了目标代码的可读性,便于后继分析,有效地将程序控制流图结构化能够可用于反编译、软件测试等设备中。
文档编号G06F9/45GK101271398SQ20071009000
公开日2008年9月24日 申请日期2007年3月23日 优先权日2007年3月23日
发明者李佳静, 剑 毛, 伟 王, 王铁磊, 维 邹, 韬 韦 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1