我有兴趣将x86分解器编写为一个教育项目。
我发现的唯一真正的资源是Spiral Space的“如何编写反汇编程序”。尽管这对反汇编程序的各个组件进行了很好的高级描述,但我对一些更详细的资源感兴趣。我也快速浏览了NASM的源代码,但这是一个值得借鉴的重要内容。
我意识到这个项目的主要挑战之一是我将要处理的相当大的x86指令集。我也对基本结构,基本反汇编程序链接等感兴趣。
谁能指出我编写x86反汇编程序的详细资源?
Answers:
请看《80386程序员参考手册》的17.2节。反汇编程序实际上只是光荣的有限状态机。拆卸步骤为:
F3
,F2
,或F0
); 如果是这样,那么您就有一个REP
/ REPE
/ REPNE
/LOCK
前缀。前进到下一个字节。67
)。如果是这样,如果当前处于32位模式,则以16位模式解码指令其余部分中的地址,如果当前处于16位模式,则以32位模式解码地址。66
)。如果是这样,如果当前处于32位模式,则以16位模式解码立即操作数,如果当前处于16位模式,则以32位模式解码立即操作数。2E
,36
,3E
,26
,64
,或65
)。如果是这样,请使用相应的段寄存器代替默认段寄存器来解码地址。0F
,则它是扩展操作码,并读取下一个字节作为扩展操作码。操作码告诉您正在执行的操作。可以从Mod R / M,SIB,位移和立即值的值解码操作码的参数。由于x86的复杂性,存在很多可能性和很多特殊情况。请参阅上面的链接以获得更详尽的说明。
Groups 1 through 4 may be placed in any order relative to each other
,因此步骤1-4的顺序可能不正确
我建议您检查一些开源反汇编程序,最好是distorm,尤其是“ disOps(指令集数据库)”(在页面上按Ctrl +查找)。
文档本身包含有关操作码和指令的多汁信息。
引用 https://code.google.com/p/distorm/wiki/x86_x64_Machine_Code
80x86指令:
80x86指令分为多个元素:
- 指令前缀会影响指令操作的行为。
- 强制前缀用作SSE指令的操作码字节。
- 操作码字节,可以是一个或多个字节(最多3个完整字节)。
- ModR / M字节是可选的,有时可能包含操作码本身的一部分。
- SIB字节是可选的,表示复杂的内存间接形式。
- 位移是可选的,它是字节大小(字节,字,长)变化的值,并用作偏移量。
- 立即数是可选的,它用作从可变大小的字节(字节,字,长)构建的通用数字值。
格式如下:
/-------------------------------------------------------------------------------------------------------------------------------------------\ |*Prefixes | *Mandatory Prefix | *REX Prefix | Opcode Bytes | *ModR/M | *SIB | *Displacement (1,2 or 4 bytes) | *Immediate (1,2 or 4 bytes) | \-------------------------------------------------------------------------------------------------------------------------------------------/ * means the element is optional.
数据结构和解码阶段在https://code.google.com/p/distorm/wiki/diStorm_Internals中进行了说明
引用:
解码阶段
- [前缀]
- [获取操作码]
- [过滤器操作码]
- [提取操作数]
- [文字格式]
- [十六进制转储]
- [解码指令]
每个步骤也进行了说明。
保留原始链接是出于历史原因:
http://code.google.com/p/distorm/wiki/x86_x64_Machine_Code和http://code.google.com/p/distorm/wiki/diStorm_Internals
Checkout objdump源代码-这是一个很棒的工具,它包含许多操作码表,并且它的源代码可以为制作自己的反汇编程序提供良好的基础。