centerplain的个人博客分享 http://blog.sciencenet.cn/u/centerplain

博文

《Reverse engineering》-Decompilation

已有 3728 次阅读 2011-5-5 17:46 |系统分类:科研笔记

发现老外写的东西就是透彻!关键的地方做下笔记,待以后查阅(未完待续)
 
1、中间表示
中间表示其实就是一个精简指令集,用于消除与底层硬件相关的细节。dcc中有两层中间语言,一层用于反编译较早的阶段提供程序的低级表示,另一层用于稍后程序的高级表示。其它的在整个反编译过程中仅使用一种中间语言,且在反编译过程中逐渐消除低级细节,添加高级细节。一个用于反编译中通用的中间语言包括如下指令,该指令集可以用于整个反编译过程,他既能表示与原始汇编语言代码相似的低级表示,又能表示高级表示形式:
Assignment,Push,Pop,Call,Ret,Branch,Unconditional Jump
其中,Push和Pop在执行过数据流分析后就会被删除掉,要得到Call的参数列表还要进行额外的分析工作,无条件跳转要在控制流分析时有意义。
1.1 表达式和表达式树
在反编译中,表达式树上的每个分支粗略地等价于一条指令。反编译执行数据流时构造这样一个树,然后只要扫描这样的树就可以得到高级语言中的表达式。
1.2 控制流图
要重构高级控制流信息,反编译器必须为每个被分析的过程创建一个控制流图。控制流图可以很方便地被转换为高级语言中的控制结构,如循环、不同类型的分支等等。
2、前端
反编译的前端执行编译的后端的工作
2.1 语义分析
扫描每一条指令并把它们转换为中间表示形式。直接翻译单条的指令常常是没有什么价值的,因为指令往往是组成一定的序列才有意义。有很多与体系结构相关的序列,这样的序列对应一条或几条中间语言的语句,前端在删除所有这些与体系结构相关的细节的同时,必须解决这种类型的序列,并把这些序列准确地翻译成中间表示形式。
2.2 生成控制流图
前端生成的代码是以图的形式表示的,每个代码块被叫做一个基本块。每个基本块的结束指令总是:分支指令、call、ret,或是标签。在大多数的反编译器中,基本块是用中间语言来表示的。
3、代码分析
这个过程可以被描述为编译器优化过程的逆过程,要消除许多编译器的优化效果。代码分析阶段的分析对象是可执行程序的中间语言形式。这个阶段包括数据流分析(恢复表达式)、类型分析(复杂的和主要的数据类型被探测)、控制流分析(恢复高级控制结构)
3.1 数据流分析
数据流分析是反编译过程中的关键步骤。通过数据流分析,将独立的,看似互相没有关系的机器指令建立必要的联系。这种联系是通过追踪这些指令中的数据流向,以及分析每条指令对寄存器以及内存单元的影响,建立起来的。数据流分析的结果可以用于反编译过程中的很多地方。比如:消除寄存器以及寄存器操作的概念,引入变量以及长表达式(由好几条机器级指令构成的)。条件代码的删除也是数据流分析。反编译器如何知道哪个寄存器用于传递返回值,那些寄存器用于传递参数,这些都是数据流分析要解决的问题。
3.1.1 SSA静态单一赋值
SSA是哟中特殊的标注,普遍用在编译器中来简化许多编译器中数据流分析的问题,且能辅助特定的优化以及寄存器分配。思想就是:将赋值操作看作一个变量的不同实例,即若对变量x有三次赋值操作,那么x就被标注为x1、x2、x3。
SSA在反编译中非常有用,因为反编译器必须处理在一个过程中重用寄存器的情况。
SSA的一个主要特点就是支持φ函数,该函数是在寄存器的取值依赖于过程会走哪条分支的时候出现,φ函数用于定义寄存器可能采用的值,通常在分支的交汇处出现。
3.1.2 数据传播
 
 
4、后端
 
 
 
 
 


https://blog.sciencenet.cn/blog-544280-440820.html

上一篇:开题报告终于改完啦!
下一篇:刚刚开完题回来,郁闷~
收藏 IP: 115.61.27.*| 热度|

0

发表评论 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-17 02:44

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部