6.1.前缀指令
1、硬编码的结构
2、前缀指令是分组的
代码语言:javascript复制<1> LOCK和REPEAT前缀指令:
LOCK FO
REPNE/REPNZ F2
REP/REPZ F3
<2> 段前缀指令:
CS(2E)
SS(36)
DS(3E)
ES(26)
FS(64)
GS(65)
<3>操作数宽度前缀指令
66
<4>地址宽度前缀指令。
67
6.2.经典定长指令_修改ERX
不包含Eb,Gb,说明是定长指令;
包含Eb,Gb,说明是变长指令
1、PUST/POP
DTDebug中安Ctrl E快捷键测试
2、INC/DEC
代码语言:javascript复制0x40 - 0x47 INC ERX 加1
0X48 - 0X4F DEC ERX 减1
测试
3、MOV Rb,Ib
代码语言:javascript复制0xb0 - 0xb7 MOV Rv,Ib //后面跟1个字节的立即数
4、MOV ERX,Id
代码语言:javascript复制0xb8 - 0xbF MOV ERX,Id //后面跟4个字节的立即数
5、XCHG EAD,ERX
代码语言:javascript复制0x90 - 0x97 XCHG EAX,ERX
6.3.经典定长指令_修改EIP
1、0x70 - 0x7F
2、0x0F 0x80 - 0x0F 0x8F
3、其它指令
4、其它指令
6.4.经典变长指令_ModRM
1、经典变长指令_ModR/M
代码语言:javascript复制0x88 MOV Eb,Gb G:通用寄存器
0x89 MOV EV,GV E:寄存器/内存
0x8A MOV GB,Eb b:字节
0X8B MOV Gv,EV v:Worder,duubleword or quadword
当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M,该字节的8个位被分成了三部分
Mod(第6,7位)和R/M(第0,1,2位)共同描述指令中的E部分,即寄存器/内存
2、当Mod = 00时,ModR/M字节通过寄存器直接进行内存寻址
例如当操作指令为88 01时,其对应的汇编为MOV BYTE PTR DS:[ECX], AL
88 是操作指令,其后跟随的01为ModR/M
0x88描述了操作数宽度为b(byte),且操作数的顺序为Eb Gb,所以这条汇编指令为MOV BYTE PTR DS:[ECX], AL
同理可以分析出如下操作指令对应的汇编指令
3、当Mod = 01时,ModR/M字节通过寄存器 I8进行内存寻址(I为立即数,即8位立即数)
例如当操作指令为88 41 12时,其对应的汇编为MOV BYTE PTR DS:[ECX 12],AL
88 是操作指令,其后跟随的41为ModR/M
所以这条汇编指令为MOV BYTE PTR DS:[ECX 12],AL
同理可以分析出如下操作指令对应的汇编指令
4、当Mod = 10时,ModR/M字节通过寄存器 I32进行内存寻址
例如当操作指令为88 81 12 34 56 78时,其对应的汇编为MOV BYTE PTR DS:[ECX 78563412],AL
88 是操作指令,其后跟随的81为ModR/M
所以这条汇编指令为MOV BYTE PTR DS:[ECX 78563412],AL 同理可以分析出如下操作指令对应的汇编指令
5、当Mod = 11时,ModR/M字节直接操作两个寄存器
例如当操作指令为88 C1时,其对应的汇编为MOV CL,AL
88 是操作指令,其后跟随的C1为ModR/M
所以这条汇编指令为MOV CL,AL
同理可以分析出如下操作指令对应的汇编指令
6.5.经典变长指令_Reg/Opcode
上一节中,3-5位用来标识寄存器,Mod字段 与 R/M字段共同用来标识寄存器与内存。但3-5字段,并不仅仅用来标识寄存器,有些时候,用来标识Opcode。
参见Table A-2中
80 81 82 83 这几个编码,并没有明确给出具体的操作码是什么。
特别说明:凡是出现Grp的,均参见TableA-6
举例说明:80 65 08 FF
1.第一个字节为80 查Table-2表,得到对应结构:Eb,Ib
2.第二个字节为ModR/M字段,所以拆分65:
01 100 101
Mod 与 R/M字段 查Table2-2 得到对应的结构:[EBP DIS8]
3.100 字段 查表TableA-6 得到对应操作码为:AND
4.最终指令格式
AND [ebp dis8],Ib
AND BYTE PTR SS:[EBP 08],0xFF
6.6.经典变长指令_SIB字段
ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX ECX*2 12345678]时,仅仅靠ModR/M字段,是描述不出来的。这时就在ModR/M后面增加一个SIB字节,与ModR/M字段共同描述。
下图是上两节没有涉及到的三种情况
这三种情况表示,在ModR/M字节后,还紧跟着一个SIB字节。SIB字节的8个位被分成了三部分:
举例说明:88 84 48 12 34 56 78
1.第一个字节为88 查Table-2表,得到对应结构:MOV Eb,Gb
2.第二个字节为ModR/M字段,所以拆分84:
01 000 010
如果查看ModR/M结果是[--][--] dis8
,则还需要一个字节(SIB)来确定[--][--]
里面的内容
3.SIB字节48分析
Base Index*2Scale (Scale描述2Scale,所以只能为 *1 *2 *4 *8)
48拆分:01 001 000
[EAX EXC*2]
4.结果
88 84 48 12 34 56 78 对应汇编 MOV BYTE PTR DS:[EAX ECX*2 78563412],AL