• IA32指令也就是常见的x86指令,指(intel architecture 32位)

  • 这里的指令是指machine code

  • 以x86为例学习machine code转汇编的方法,以后可类比解析其他少见架构的machine code

格式

img
  • 汇编指令有6部分组成

Prefix----指令前缀(可选项)

Opand----操作指令(必选项)

Mod R/M—操作数辅助说明(可选项)

SIB----Mod R/M辅助说明(可选项,但是出现Mod R/M 这个必须有)

Displacement—操作数作为内存地址时用来表示位移(可选项)

Immediate ----表示操作数为立即数(可选项)

1)指令前缀prefix大小为一个字节,用来辅助说明指令的具体功能,可选项

例如:66:81FE 4746 CMP SI,474红色字体就是指令前缀,后面跟一个:。

2)操作指令opand,这个没啥好说的,必选项,大小为1到3字节,通常为一个字节,多字节后面会有说明.例如:66:81FE 4746 CMP SI,474

3)Mod R/M 大小为一个字节,由三部分组成,分别为 Mod(字节前两位),Reg(字节中间三位),R/M(字节后三位)。Mod R/M的主要功能就是说明操作数的寻址方式,包括寄存器选择,内存操作数的偏移等等。例如:66:81FE 4746 CMP SI,474

4)SIB,大小为一个字节,也是用来辅助操作数寻址的,一般用于辅助Mod R/M,当出现基址加变址寻址或者基址寻址时要用到。898424 50020000 Mov [ESP+250],EAX.

有用的表格

Intel® 64 and IA-32 Architectures Software Developer Manuals

table 2-2 32-bit Addressing forms with the ModR/M Byte, page 510

table 2-3 32-bit Addressing forms with the SIB Bytes, page 511

APPENDIX A ,page 487

A.2.1 Codes for Addressing Method

A.2.2 Code for Operand Type

Table A-2 .one –byte Opcode Maps

Table A-3.two-bytes Opcode Maps

pages :2519-2530

Table A-6 Opcode Extension for one-and Two Opcodes by Group Number

pages:2535-2537

关键部分

具体参见intel手册进行解析

解析步骤

操作码映射

首先我们解析一个长度为一的操作码,对应的表是Table A-2 .one –byte Opcode Maps

指令:41,将指令拆成4和1,4对应表的行向量,1对应表列向量,如下图:

img

操作数使用

指令68 A0B44000,我们先拆分68为6和8还是使用表Table A-2 .one –byte Opcode Maps

来查找操作指令。查看可得是push 指令,操作数的寻址方式有Iz规定

字符I规定了寻址方式,在code for Addressing Method查找对应含义

第二个小写字符z在表code for opcode type 中查找,

z表示使用的字符大小为字或者双字,由于是在32位系统中默认使用双字(使用单字的情况是使用前缀来说明),故这里是个双字,Iz一起就是表明使用双字立即数,表明指令68 A0B44000中A0B44000就是使用的双字立即数。完整的指令翻译过来就是:

Push 0004B4A0

总结

对机器码的解析归根结底要好好阅读相关手册,严格按照用户手册的规定上来一步步解析即可

事实上并不难,但是要耐心