反汇编基本算法

  1. 确定进行反汇编代码区域,这并不像那么简单。通常,指令与数据混杂在一起,区分它们就显得非常重要。反汇编可执行文件:该文件必须符合可执行文件的某种通用格式,如Windows所使用的可移植可执行(Portable Executable, PE)格式或许多Unix系统常用的可执行和链接格式(ELF)。
  2. 知道指令的起始地址后,下一步就是读该地址(或文件偏移量)所包含的值,并执行一次表查找,将二进制操作码的值与它的汇编语言助记符对应起来。根据被反汇编的指令集的复杂程度,这个过程可能非常简单,也可能需要几个额外的操作,如查明任何可以修改指令行为的前缀以及确定指令所需的操作数。对于指令长度可变的指令集,如Intel x86,要完全反汇编一条指令,可能需要检索额外的指令字节。
  3. 获取指令并解码任何所需的操作数后,需要对它的汇编语言等价形式进行格式化,并将其在反汇编代码中输出。有多种汇编语言输出格式可供选择。如X86所使用的两种主要格式为Intel格式和AT&T格式。
  4. 输出一条指令后,继续反汇编下一条指令,并重复上述过程,直到反汇编文件中的所有指令。
  5. 有大量的算法可用于确定从何处开始反汇编,如何选择下一条反汇编的指令,如何区分代码与数据,以及如何确定何时完成对最后一条指令的反汇编。线性扫描和递归下降是两种最主要的反汇编算法。
原文地址:https://www.cnblogs.com/blacksunny/p/5920625.html