art of disassembly----chapter01----lesson11---how is a disassembler working----01

来源:互联网 发布:php上传图片并压缩 编辑:程序博客网 时间:2024/05/21 09:46

关于此文档的内容:

         此文件是关于设计及实现一个WIN32的反汇编器。它读取winodws32位下的可执行程序的机器码然后将其反汇编,并显示出来。


关于此文档的目的:

       除作为我个人的学习比较以外,本文档更着重于为那些对写反汇编器感兴趣的人而写。我可提供了一些源代码以供下载。代码中有一些我写的简单的注释,但是有相当的一部分还是难以理解的,除非你对整体的设计有一个全局的把握。本文档正是为了填补这个空白。

      很遗憾的是,任何人有都无法给出写一个反汇编器的所有细节。再者,我也没说我的设计及实现是最好的。事实上,这个项目更多的是我自学,则不是向他人炫耀。我的最动机只是想写一个框架就好了,然后别人可以适当的夸张这个框架。

      

“Open ended implementation"

    这个标题的意思是:我的实现基本上是算完成的,非常欢迎你可以加入这个项目完成我的些未完成的部分。要开始你自己的Decoder是很简单的,你只在copy dlls然后使用他们就可以了。

不过到最后我还是会完成我自己未写完的那些部分的。


注意:‘

     我不曾有任何有保证说我的设计及实现是最有效率的、是正确的。我只是想展示我自己是怎么解决这个问题罢了,它应该跟你的方法有点不同吧。

我做出以下几个假设:

    ----使用VC++做为编译器

    -----要反汇编的可执行文件是由MS的工具编译而成的(当然你可以很容易的扩展)

   ------局限于32位的可执行文件


简介:

      Q:反汇编机器码到汇编看起来相当的复杂。当你看到intel的指令手册时你可能就意味到这个问题了。但是如果把此任务分解成几个小的任务的话,你会发现其实它并没有这么的难。

      当你想到反汇编的时候,以下问题maybe会浮现在你的脑海之中

     --------机器码长啥样

    ---------机器码怎么跟汇编指令对应起来

   ----------我怎么得到机器码从哪里开始?

   -----------我需要什么样的文档资料

以上问题在您学习这个文档的过程中,将会一一的了然起来的!!



现在来总揽一下整体的架构吧!

      数据表示的几个阶段

我们的数据是一串机器码的字节流。反汇编器再怎么说也只不过是一个软件,它把这些字节流转换成汇编。这个转换的过程可以分成几个小的步骤。为了了解到底需要将这个过程分解成几个步骤,让我们先来了解一下数据会经历几个表示阶段。以下的内容展示数据的三个基本的阶段。


第一阶段:数据处理之前。数据就是一串字节流,它们对硬件处理器有意义。这里要注意的是这一串字节流并没有明显有意义的边界。


第二阶段:分解的机器码。我们把这串字节流分解成一系列的更小的几组字节(依旧是机器码),我将之称为"raw instructions"(下文缩写为RI)。每一个RI对应一相应的intelX86汇编指令。如果在这个阶段之下将数据呈现给用户,那么用户看到的将是一组组不等长的十六进制数。


第三阶段:汇编指令。我们将每个RI转换为一行行为字母及数字组成的汇编语言指令。如果数据在此阶段呈现给用户,那么用户将看到的汇编语言指令。

   

       两个处理任务:

通过学习数据将会经历的三个阶段,我们将面临两个处理任务。




     首先,我们得在第一阶段及第二阶段之间架起一架桥梁,我将此程序叫做 Parsing...

     其次,第二阶段到第三阶段的转换程序我将叫做 Decoding..它所做的就是把字节码翻译成人可读的形式

     这两个处理任务可以合并在一个子程序中,但是我想把它们分成两个子程序会更好理由如下:

     Parsing子程序负责处理分析字节流,也就是说,是它来决定在一串字节流中,要多少个字节的数据来构成一条汇编指令。再者,Decoding子程序并不关心一条指令对应有几个字节的数据,它的任务是把机器码翻译成人类可读的汇编语言代码的形式。