硬编码

前言

这里记录一些硬编码的知识。



编码的结构

编码结构



常见定长编码

修改通用寄存器

编码 意义
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个位被分成了三部分:

ModR/M

其中,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部分,其对照表如下:

ModR_M字节表

其中要注意的是:

  • 操作内存时,R/M为100时指令与其他不同
  • Mod为00时,按顺序为EBP寄存器的位置变为32未立即数