我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:六合生肖表 > 反编译器 >

反编译原理-控制流分析

归档日期:06-06       文本归类:反编译器      文章编辑:爱尚语录

  控制流结构恢复、变量和类型恢复是反编译器中端向后端转化最关键的两个步骤,本文讨论控制流结构恢复。

  主要是概述鲸书“高级编译器的设计与实现”第7章控制流分析,并且增加了一些内容,所涉及的相关论文书籍自行查找学习,还可以从维基百科了解学习。

  ControlFlowGraph(控制流程图),BasicBlock(基本块)、Predecessor(前驱)、Successor(后继)、Entry(入口)、Exit(出口)等概念,大部分的编译器控制流分析相关书籍论文都有介绍这些内容,还有应该熟悉了解图论中的有向图的相关知识。

  BFS(广度优先搜索)和DFS(深度优先搜索)是图论中的两个概念,重点关注深度优先搜索,深度优先搜索有前序遍历、中序遍历、后序遍历三种遍历方法,前序遍历和后序遍历在控制流分析时是非常关键的两种遍历。大部分数据结构书籍中的图论都有介绍这些内容。

  如果从流图的入口(Entry)结点到结点d的每一条可能的路径都经过结点n,称n是d的必经结点,或者说d支配n;如果从流图的结点d到出口(Exit)结点的每一条可能的路径都经过结点n,称n是d的后必经结点,或者说d后支配n。一种有效的表示支配结点信息的方法是用支配树(Dominator Tree)表示,构建支配树有静态和动态两种方法。

  编译器和反编译器在控制流分析时,需要处理循环结构,循环结构最普遍的是流图中的SCC(强连通分量),大部分数据结构书籍中的图论都有介绍SCC(强连通分量)。

  可归约性是流图的一个非常重要的性质,假设对流图进行若干变换,该变换将子图蜕化为单个结点,归约成更简单的若干子图,如果一系列的转化最终能够把流图归约成单个结点,则称这个流图是可归约的。某些控制流模式会使得流图不可约,大概有以下几种方法处理不可约流图:

  因为传统的结点分割很容易造成流图的结点个数指数级增长,不推荐使用这种方法。

  CFG Flattening(控制流平坦化),虽然常用于代码混淆,但实际上也是把不可约流图转化成可归约流图的一种方法。

  由于历史原因,区间分析Region Analysis也称为Interval Analysis。区间分析将流图划分成各种类型的区域,使每一个区域蜕化成一个抽象节点,最终得到层次化、嵌套的抽象流图,该流图产生一棵控制树。

  最简单、最早的区间分析,可从鲸书“高级编译器的设计与实现”第7章控制流分析了解详情。

  区间分析使用极大区间,忽略不可归约区域,可从鲸书“高级编译器的设计与实现”第7章控制流分析了解详情。

  更为现代的区间分析,有考虑不可归约区域,可从鲸书“高级编译器的设计与实现”第7章控制流分析了解详情。

  结构化分析是区间分析的增强版本,比区间分析能分析更多的区间类型。可从鲸书“高级编译器的设计与实现”第7章控制流分析了解该传统结构化分析。

  反编译器进行控制流结构恢复时,所使用的算法很多来自于编译器的控制流分析。

  反编译器的控制流程图比编译器控制控制流程图结点数量更多,分析时需要更多的时间和内存。早期LLVM版本构建支配树使用静态方法Lengauer-Tarjan算法,最新LLVM版本构建支配树已使用动态方法Depth-Based Search算法。

  最简单的控制流分析,根据模式进行归约合并,一些反编译器会使用编译器前端语法分析的一些方法。

  最基础的控制流分析,虽然用Simple的方法可以归约合并控制流图,但是有一些缺陷:比如假设有一个控制流的基本块,它的前驱代码位置不在它的前面,它的后继代码位置不在它的后面,则Simple方法根据模式归约合并将会出错,但如果是使用了控制流图和支配树的方法进行归约合并将不会出错。

  开源反编译Retdec就使用了控制流图和支配树的方法进行控制流图重建恢复,问题在于它处理不可约流图时所使用的结点分割是传统的结点分割,导致反编译后的源码膨胀率严重,随便测试了一个百K左右的二进制文件的反编译,最后竟然生成了3-4M的c源码。

  axtor,采用论文Controlled Node Splitting的结点分割算法和T1-T2结构化分析进行控制流图重建fernflower,开源Java反编译器,采用传统的结点分割和T1-T2结构化分析进行控制流图重建。

  dcc是第一个使用极大化区间分析(Maximal Interval)的开源反编译器,没有考虑不可归约图,只支持16位二进制程序反编译,当然扩展支持32位/62位二进制程序反编译也不会太困难。

  通常对不可约非正常区域,极小化区间分析方法采用将一个公共节点作为必经节点,其它节点边就必须要从控制流程图删除,并插入goto语句,另外,一些正常区域由于编译优化或代码混淆的原因,匹配规则不确定,也是无法归约的,同样是插入goto语句。

  Zadeck Structural,GCC补丁,并没有相关论文,使用gcc后端IR RTL,由于它是用于编译器,而编译器比反编译器拥有更多的信息,因此如果要把该算法用于反编译器需要一些修改。

  IDA Pro反编译插件Hex-Rays Decompiler是反编译器的事实标准,它的结构化分析算法应该和sharir或zadeck的算法有些类似,只是对不可约非正常区域的处理方法有些不同。第14章会不完全探讨它的实现。

  abcd,java开源反编译器,用支配树来建立RPST树,好像并不能称为构建RPST树,只能称为构建控制树。

  因为区间分析或结构化分析只能处理只包含SESE(Single-Entry-Single-Exit)区间类型的流程图,因此需要把原来的控制流图转化成只包含SESE (Single-Entry-Single-Exit)区间类型的流程图,当前主要有以下两种方法:

  反编译器的控制流分析,是结构化分析,是基于控制树的控制流消去法,有些类似于数据流分析。

  如何最小化控制流图重建后goto语句的数量的大小,无环区域的简化和优化的实现非常关键。

  根据规则进行模式匹配,开始进行类型归类时有些想当然了,如何用规则匹配进行If语句合并将在另一篇“if-else分支的识别和合并”说明。

  根据规则匹配归约合并条件语句的方法有最大的缺陷:并不能覆盖所有的规则,由于二进制代码经过编译器优化,代码混淆的原因,匹配的规则数量是不确定的,则控制流图重建后不可避免有goto语句。

  Switch Regions 三种表现形式:位计算,跳转表,If跳转或二叉树If跳转。

  控制流重建时主要考虑跳转表,需要考虑两种特殊的情况:case 块没有用Break语句,直接Fallthrough到下一个case 块;case 块没有用Break语句,而是使用Return语句。

  某一无环区域有多个Return/Finish(Finish块通常用于资源释放),编译优化后二进制代码可能会共用一个Return/Finish块,结构化分析时需要复制Return/Finish块。

  有环区域极简化和合并有两种情况:第一种,有环区域Loop和无环区域Seq相互转化;第二种,有环区域Loop三种归约类型的规则匹配:While、DoWhile、For。

  第二种,当前Loop循环体内部多个Return/Finish(Multi-Exit)区域。这两种类型都会使得控制流重建后不可避免有goto语句,并且可读性差,大部分的反编译器是没有考虑这种情况的,比如Hex-Rays Decompiler就没有考虑这种情况。

  主流的重新构建控制流图的方法都是对控制流程图进行结构化分析生成控制树,然后尝试将函数流程图的可归约的一小部分与已知模式匹配,并在不起作用时使用goto语句。

  综上所述,实现没有goto语句的C语言反编译器是可能的,该反编译器重建流图的大概操作简述如下:

  栈 1. 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或...

  宝贝儿要上四年级了,时间过的好快啊,感觉像刚送一年级的时候,一眨眼可要上四年级了,真是好快呀! 这三年孩子也起早贪黑的努力学习,宝贝儿你是最棒的! 从进入一年级到三年级这一路走来,让我尤其感到放心而满意的就是有逯老师的尽职尽责的一路陪伴,对孩子的一切照顾和教...

  历史上的今天,大郎,起来把药喝了…“媳妇,我病好了!” “别闹,赶紧喝了” “我真的好了,你喝吧!” “妈的,门庆,过来按着他,灌下去。” 今天的股市就像这个样子,本周持续低开跳水,这波毒药你要喝吗?你病好了?你不想喝?抱歉,硬灌! 方橙早就说过,大盘连续三次冲击3300点...

  七夕今宵看碧霄,牵牛织女渡河桥。一年一度的乞巧节,牛郎织女终得相见。你又准备了什么礼物,做一场爱情的告白。 七夕前,正好在杭州培训,讲到了这么一段对话: 妈妈说:“宝贝,今年没有其他礼物了,妈妈给你买了一份保险作为生日礼物。” 孩子看了看保单,说:“妈妈,保险这么贵,我们不...

  70,安全保护 马尔堡家庭服务机构是一个专业的英国国民健康服务体系诊所,其服务内容之一是为具有严重伤害风险的儿童家庭提供评估和治疗,他们关于焦点解决的早期实践部分基于这项工作。显而易见,焦点解决的方法是促进安全上具有很大的作用,就像其他疗法的模式一样,焦点解决不能仅仅作为...

  今年的国庆和去年的国庆节一样,7天的假期,下雨就是五天,好不容易不下雨了,就赶紧安排了一个一日游,把父母带一起,去我们当地最美的地方逛逛。 这个茶山是我们当地最大的茶山了,几十年的历史,海拔高度是1800米左右。历经秋霜冬雪,云雾缭绕,所以茶的品质非常的好。也是我最爱喝的茶...

本文链接:http://oms15.com/fanbianyiqi/377.html