您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 逆向编译技术
  所属分类: 网络攻防
  开发工具:
  文件大小: 800kb
  下载次数: 0
  上传时间: 2012-03-07
  提 供 者: fei***
 详细说明: 第 1 章 反编译导言 编译器的编写技术在计算机界广为人知;而反编译器的编写技术还不这么被人熟悉。本论文说明了一个相当有趣的事实,即反编译器的编写技术乃是基于编译器的编写技术。这一章通过描述一个反编译器的组成和一个二进制程序的反编译环境,简单介绍一下反编译这个主题。 1.1 反编译器 反编译器是这样一个程序,它读入一个机器语言的程序 - 源语言 - 并把它翻译为一个等价的高级语言程序 - 目标语言 (见图1-1)。反编译器或反向编译器,尝试逆向一个编译器的过程:把一个高级语言程序翻译成一个二进制程序或可执行程序。 图 1-1: 反编译器 应用基本的反编译器技术,把多种多样的机器语言二进制程序反编译成各种高级语言。反编译器的结构是基于编译器的结构,而且应用类似的原理和技术进行程序分析。第一代反编译器诞生于1960年代早期,比它们的姐姐——编译器小十岁。相对第一代编译器,反编译大量地被用来翻译科学程序。第2章描述反编译的历史。 1.2 问题 在编写一个反编译器的时候,反编译器作者必须面对一些理论上和实际的问题。有些问题能够通过使用启发式(试探方法)解决,而另一些则不能被完全确定。由于这些限制,反编译器能够对某些源程序进行 全自动的程序翻译,而对于另一些源程序只能进行半自动的程序翻译。编译器是不同的,它对所有源程序都进行全自动程序翻译。这一节讨论反编译器涉及的一些问题。 1.2.1 递归的不确定性 可计算性的一般理论试图解决判定问题,即,研究对于某一个完全的陈述类是否存在判定其对错的算法。如果问题有肯定的答案,那么必须给出一个算法;否则,就要证明这样的算法不存在。对于后者,我们称之为问题是不可解决的、不可判定的、或不可计算的。对于不可解决的问题,如果能给出这样一个算法——无穷循环的程序能够在任何时候停机,那么问题可能是部分可计算的。 在数学世界里,一个抽象的概念必须用数学定义描述和建模。算法的抽象化必须用图灵机 (一种可不受储存容量限制的假想计算机) 描述。图灵机是一个计算机器,它在一个两个方向都无限长的线性磁带上打印符号,拥有有限个数的状态,并基于它的当前内部配置和磁带上的当前符号、执行由四元组的含义指定的动作。图1-2显示一个图灵机表示法。 图 1-2: 图灵机表示法 图灵机Z的停机问题包括,对于任一给定的瞬间描述α,确定是否存在一个由α开始的Z计算。换句话说,我们正在尝试确定,如果把Z放在某一个初始状态中它是否会停机。已经证明这个问题是递归地不可解决的和部分可计算的 [Dav58,GL82]。 给定一个二进制程序,甚至可以假定在程序中不允许自修改代码之类的行为,从代码中区分出数据的问题等价于停机问题,因为一条特定指令是否会被运行一般来说是未知的 (例如,对于一个循环后面的代码)。这意味着该问题是部分可计算的,因而有些情况下能够写出一个从代码中区分出数据的算法,但不是所有情况下都能够做到。 1.2.2 冯·诺依曼体系结构 在冯·诺依曼机器中,内存里的数据和指令以同样的方式表现。这意味着,只有当一个给定字节从内存被读出放入一个寄存器作为数据或指令使用的时候,我们才知道它是数据还是指令(或两者都是)。即使是在分段的体系结构上,其中数据段里只有数据信息、代码段只有指令,数据仍然能够以表的形式被储存在一个代码段中 (例如,Intel架构的case表),指令也能够以数据的形式被储存然后通过解释这些指令而运行。PC机的Modula-2编译器用这后一个方法解释一个抽象栈机器的中间代码。中间代码被储存为数据,es:di持有的偏移量指向特定的子程序 [GCC+92]。 1.2.3 自修改的代码 自修改代码指的是指令或者预置数据在程序运行期间被修改。一条指令的一个内存字节位置能够在程序运行期间被修改、表现成另一条指令或数据。这个方法曾经很长时间用于实现各种目的。在60年代和70年代,计算机内存很小,难以运行大程序。那时,计算机内存最多有32Kb和64Kb可用。由于空间有约束,所以必须尽量充分利用。其中一个办法就是在可运行程序中节省字节,重复使用数据位置作为指令,或反之亦可。这样,一个内存单元在某一时间持有指令,而在另一时间变成持有数据或另一指令。而且,在指令不被需要时其它指令修改它们,因此程序下次执行那部分代码的时候就会执行不同的代码。 现在的计算机在内存方面的限制少了,因此自修改代码不再经常使用。但是在编写加密程序或病毒代码的时候仍然有用(见第1.2.5节)。图1-3给出一个Intel架构的自修改代码样例。inst定义的数据字节被mov指令修改成E920。动作之后,inst被当作另一条指令,它现在是0E9h 20h;即,一条跳转偏移20h的无条件跳转指令。动作之前,inst内存位置上是9090,被作为两条nop指令来执行。 ...展开收缩
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索: 逆向 编译
 输入关键字,在本站1000多万海量源码库中尽情搜索: