- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于结构分析高级语言控制结构恢复方法
基于结构分析高级语言控制结构恢复方法
摘要:为正确获得嵌入式可执行程序和汇编代码的高级语言控制结构,弥补现有高级程序控制结构恢复算法在处理非结构化区域的不足,将编译领域经典的控制流分析方法——结构分析算法引入到嵌入式汇编代码高级程序控制结构恢复研究中;针对嵌入式可执行程序的特点,对结构分析算法加以改进;利用结构分析算法的结果构造程序的控制树,生成高级语言代码与开源反编译器DCC的对比实验结果表明,改进的结构分析算法在高级程序结构恢复问题上是可行有效的
关键词:反编译; 控制流分析; 嵌入式系统; 逆向分析
中图分类号:TP314 文献标志码:A
0引言
反编译是一个由机器代码或汇编代码生成更易理解的高级语言程序的过程 在这一过程中,根据程序控制流图提取高级程序控制结构是至关重要的一步在嵌入式程序中,为减少生成的代码所占用的存储空间,编译器对程序进行了大量的优化,导致程序中的跳转错综复杂,提取出的控制流图中包含了大量的非结构化子图,对高级程序控制结构恢复造成了较大的影响
目前控制结构恢复技术的研究主要针对桌面系统中的可执行程序进行,且主要关注结构化子图的分析与识别[1-3],这些方法能够提取出控制流图中的大部分控制结构,但是对于非结构化区域的处理略显不足对于非结构化流图结构恢复问题的研究目前主要采取4种方法,分别是引入布尔变量[4-6]、代码复制[7-8]、引入特殊控制结构[9-10]和图转换系统[6,11]采用布尔变量和代码复制的方法虽然可以获得等价的结构化的控制流图,但是改变了程序的语法和逻辑结构,引入特殊控制结构导致某些结构无法被大多数高级程序语言正确描述,图转化系统保持程序控制结构不发生变化,但是在高级代码生成阶段产生大量的“goto”语句
为了更加准确地恢复嵌入式代码的高级程序控制结构,本文将编译领域经典的控制流分析算法——结构分析方法引入到控制结构恢复过程中,并在该方法上作了适当改进以适应嵌入式代码的特点在对非结构化流图进行结构化的过程中,本文针对结构分析涉及的三类非结构化区域分别提出了基于规则的??构化方法实验结果表明改进的结构分析算法能够更加准确地恢复程序的高级语言控制结构
1嵌入式代码高级程序控制结构恢复
结构分析是一种更为精致的区间分析方法,与基本的区间分析不同,它能表示出比循环更多的控制结构类型,并使每一种类型的控制结构形成一个区域结构分析考虑流图的深度为主生成树,然后对各种区域类型的实例按后序次序依次考察流图中的节点,将它们规约为抽象节点,蜕化掉连接边,并构造对应的控制树[12]
经典的结构分析算法可以准确识别顺序结构(图1(a))、ifthen(图1(b))、ifthenelse(图1 (c))、switch(图1(e))、selfloop(图1 (f))和whileloop(图1(d))等六种结构化区域;非正常选择路径(图 2(a))、自然循环(图2(b))和非正常区间(图2(c))三种非结构化区域需要说明的是,图2中的自然循环是指除了selfloop和whileloop以外的单入口循环非正常选择路径区间是指既没有包含环路也不能规约为任何简单无环结构的区域,这种结构在嵌入式代码中很常见图中所给出非结构化区域都是示意性的,因为循环可能不止两条出口边,非正常区间的入口基本块可能有两个以上的后继
由于结构分析算法在编译领域主要用于控制流分析和数据流分析,它没有对非结构化区域进行结构化处理,也不适合直接用于嵌入式代码的结构恢复为了使结构分析算法可以进行嵌入式代码的结构恢复,本文对算法进行了以下改进:
首先,由于在嵌入式汇编代码中,同一个函数中可能包含多条返回指令,这样得到的控制流图可能存在多个节点后继为空在此情况下,如果严格按照结构分析算法,流图无法规约为一个节点为了让结构分析算法顺利进行,本文将结构分析算法可以识别的结构加以扩充,使得其可以识别如图3所示的结构图中的虚线表示该边可以不存在,这样较好地解决了一个函数包含多条返回指令的问题
其次,结构分析算法识别到非结构化区域时,并不对非结构化区域进行结构化处理,而非结构化区域无法用现有的高级语言控制结构表示为了解决这个问题,本文设计了算法对这些非结构化区域进行结构化处理该算法对非结构化流图进行剪边处理,使其结构化剪下的边将被记录,在高级代码生成阶段,产生相应的“goto”语句形式对结构分析得到的三种非结构化区域的处理规则定义如下:
非正常选择路径区间无法规约,是由于ifthenelse结构的一个分支有多个前继,所以,只需要把通向该分支的边剪下,便可以将流图结构化对非正常选择路径区间的处理方式如图4所示
导致自然循环无法规约的原因是循环有多个出口,所以结构化方法可以选择破
文档评论(0)