我有兴趣写一个 x86伪君子作为一个教育项目。
我找到的唯一真正的资源是螺旋空间的“ 如何编写反汇编程序”。虽然这提供了一个很好的反汇编程序的各种组件的高级描述,我感兴趣的是一些更详细的资源。我还快速浏览了一下 纳斯玛氏综合症源代码,但这在某种程度上是一个值得学习的重量级代码。
我意识到这个项目的主要挑战之一是我将要处理的相当大的 x86指令集。我还感兴趣的基本结构,基本反汇编链接等。
有人能给我指出编写 x86反汇编程序的详细资料吗?
从一些已经组装好的小程序开始,它将为您提供生成的代码和指令。使用 教学体系结构获得一个引用,并手动处理一些生成的代码和体系结构引用。您会发现,这些指令具有非常典型的 行动,行动,行动结构,操作数的数目不同。您所需要做的就是翻译代码的十六进制或八进制表示来匹配指令; 稍微调整一下就会显示出来。
这个过程,自动化,是反汇编程序的核心。理想情况下,您可能希望在内部构造 n 个指令结构数组(或者在外部构造,如果程序非常大的话)。然后,您可以将该数组转换为汇编程序格式的指令。
您需要从操作码表中加载。
基本的查找数据结构是一次尝试,但是如果您不太关心速度,那么一个表就足够好了。
若要获取基本操作码类型,请从表上的 match 开始。
有一些解码寄存器参数的常用方法; 但是,有足够多的特殊情况需要单独实现其中的大部分。
既然这是教育,看看这个。
我建议检查一些开源的反汇编程序,最好是 扭曲,特别是“ disOps (Directions Set DataBase)”(ctrl + find it on the page)。
文档本身充满了关于操作码和指令的有趣信息。
引自《 https://code.google.com/p/distorm/wiki/x86_x64_machine_code 》杂志
80x86使用说明: 80x86指令分为 元素数量: 指令前缀,影响指令的行为 行动。 强制前缀用作 SSE 指令的操作码字节。 操作码字节,可以是一个或多个字节(最多3整个字节)。 ModR/M 字节是可选的,有时可能包含 操作码本身。 SIB 字节是可选的,表示复杂的内存间接 表格。 位移是可选的,它是一个不同大小的值 字节(byte,word,long) ,并用作 偏移。 立即值是可选的,它用作构建的一般数值 从不同大小的字节(字节, 长)。 格式如下: /-------------------------------------------------------------------------------------------------------------------------------------------\ |*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.
80x86使用说明:
80x86指令分为 元素数量:
格式如下:
/-------------------------------------------------------------------------------------------------------------------------------------------\ |*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
看看 80386程序员参考手册的 第17.2条。反汇编程序实际上只是一个美化的 有限状态机。拆卸的步骤如下:
F3
F2
F0
REP
REPE
REPNE
LOCK
67
66
2E
36
3E
26
64
65
0F
操作码告诉您正在执行的操作。操作码的参数可以从 Mod R/M、 SIB、位移和直接值的值中解码出来。由于 x86的复杂特性,有许多可能性和许多特殊情况。请参阅上面的链接以获得更详细的解释。
检查 Objecdump源代码-这是一个伟大的工具,它包含许多操作码表,它的源代码可以提供一个良好的基础,使您自己的反汇编程序。