gpt4 book ai didi

x86 - 如何编写反汇编程序?

转载 作者:行者123 更新时间:2023-12-03 05:34:08 25 4
gpt4 key购买 nike

我有兴趣编写一个 x86 反汇编器作为一个教育项目。

我找到的唯一真正的资源是螺旋空间的“How to write a disassembler”。虽然这对反汇编程序的各个组件进行了很好的高级描述,但我对一些更详细的资源感兴趣。我还快速浏览了 NASM's源代码,但这在某种程度上是值得学习的重量级内容。

我意识到这个项目的主要挑战之一是我必须处理相当大的 x86 指令集。我也对基本结构、基本反汇编器链接等感兴趣。

谁能给我提供有关编写 x86 反汇编程序的详细资源吗?

最佳答案

看看section 17.2 80386 Programmer's Reference Manual的。反汇编器实际上只是一个美化的finite-state machine 。反汇编步骤为:

  1. 检查当前字节是否为指令前缀字节(F3F2F0);如果是这样,那么您就有了 REP/REPE/REPNE/LOCK 前缀。前进到下一个字节。
  2. 检查当前字节是否是地址大小字节 (67)。如果是,则如果当前处于 32 位模式,则以 16 位模式解码指令其余部分中的地址;如果当前处于 16 位模式,则以 32 位模式解码地址
  3. 检查当前字节是否为操作数大小字节 (66)。如果是,则当前处于 32 位模式,则以 16 位模式解码立即操作数;如果当前处于 16 位模式,则以 32 位模式解码立即操作数
  4. 检查当前字节是否为段覆盖字节(2E363E266465)。如果是,则使用相应的段寄存器来解码地址,而不是默认的段寄存器。
  5. 下一个字节是操作码。如果操作码为0F,则为扩展操作码,读取下一个字节作为扩展操作码。
  6. 根据特定的操作码,读入并解码 Mod R/M 字节、比例索引基 (SIB) 字节、位移(0、1、2 或 4 字节)和/或立即值( 0、1、2 或 4 字节)。这些字段的大小取决于之前解码的操作码、地址大小覆盖和操作数大小覆盖。

操作码告诉您正在执行的操作。操作码的参数可以从 Mod R/M、SIB、位移和立即值的值进行解码。由于 x86 的复杂性,存在很多可能性和很多特殊情况。请参阅上面的链接以获得更全面的解释。

关于x86 - 如何编写反汇编程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/924303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com