前言
这里记录一些硬编码的知识。
编码的结构
常见定长编码
修改通用寄存器
编码 | 意义 |
---|---|
0x50-0x57 | PUSH EAX-EDI |
0x58-0x5F | POP EAX-EDI |
0x40-0x47 | INC EAX-EDI |
0x48-0x4F | DEC EAX-EDI |
0xB0-0xB7 Ib | MOV AL-DH, Ib |
0xB8-0xBF Id | MOV EAX-EDI, Id |
0x90 | nop |
0x91-0x97 | XCHG EAX, ECX-EDI |
注1:八大通用寄存器顺序:EAX ECX EDX EBX ESP EBP ESI EDI
注2:八大八位寄存器顺序:AL CL DL BL AH CH DH BH
注3:Ib:一个字节大小的立即数
注4:Id:四个字节大小的立即数
修改EIP
0x70-0x7F Ib
编码 | 意义 |
---|---|
0x70 Ib | JO |
0x71 Ib | JNO |
0x72 Ib | JB/JNAE/JC |
0x73 Ib | JNB/JAE/JNC |
0x74 Ib | JE/JZ |
0x75 Ib | JNE/JNZ |
0x76 Ib | JBE/JNA |
0x77 Ib | JNBE/JA |
0x78 Ib | JS(符号寄存器置1跳转) |
0x79 Ib | JNS |
0x7A Ib | JP/JPE(奇偶寄存器) |
0x7B Ib | JNP/JPO |
0x7C Ib | JL/JNGE |
0x7D Ib | JGE/JNL |
0x7E Ib | JLE/JNG |
0x7F Ib | JG/JNLE |
0x0F 80 - 0x0F 8F Id
编码 | 意义 |
---|---|
0x0F 80 Id | JO |
0x0F 81 Id | JNO |
0x0F 82 Id | JB/JNAE/JC |
0x0F 83 Id | JNB/JAE/JNC |
0x0F 84 Id | JE/JZ |
0x0F 85 Id | JNE/JNZ |
0x0F 86 Id | JBE/JNA |
0x0F 87 Id | JNBE/JA |
0x0F 88 Id | JS(符号寄存器置1跳转) |
0x0F 89 Id | JNS |
0x0F 8A Id | JP/JPE(奇偶寄存器) |
0x0F 8B Id | JNP/JPO |
0x0F 8C Id | JL/JNGE |
0x0F 8D Id | JGE/JNL |
0x0F 8E Id | JLE/JNG |
0x0F 8F Id | JG/JNLE |
其他指令
编码 | 意义 |
---|---|
0xE0 Ib | LOOPNE/LOOPNZ |
0xE1 Ib | LOOPZ/LOOPE |
0xE2 Ib | LOOP |
0xE3 Ib | JECXZ(JRCXZ) |
0xE8 Id | CALL |
0xE9 Id | JMP NEAR |
0xEA Ap | JMP FAR |
0xEB Ib | JMP SHORT |
0xC3 | RET |
0xC2 Iw | RET Iw |
0xCB | RETF |
0xCA Iw | RETF Iw |
注5:Ap:6字节长的地址
注6:Iw:2字节长的立即数
经典变长指令——ModR/M
编码 | 意义 |
---|---|
0x88 | MOV Eb, Gb |
0x89 | MOV Ev, Gv |
0x8A | MOV Gb, Eb |
0x8B | MOV Gv, Ev |
注7:
- G:通用寄存器
- E:寄存器/内存
- b:字节
- v:Word,doubleworld 或quadword
当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M。该字节的8个位被分成了三部分:
其中,Reg/Opcode(第3、4、5位,共三位)描述指令中的G部分,即寄存器
寄存器宽度 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
---|---|---|---|---|---|---|---|---|
32 | EAX | ECX | EDX | EBX | ESP | EBP | ESI | EDI |
8 | AL | CL | DL | BL | AH | CH | DH | BH |
Mod部分和R/M部分描述E部分,其对照表如下:
其中要注意的是:
- 操作内存时,R/M为100时指令与其他不同
- Mod为00时,按顺序为EBP寄存器的位置变为32未立即数