硬编码——经典定长指令


经典定长指令上(修改寄存器)


1、PUSH/POP 特点:

0x50 PUSH EAX 1、记住32位、16、8位的通用寄存器,按照顺序记住.
0x51 PUSH ECX
0x52 PUSH EDX 2、将操作数编码到指令当中
0x53 PUSH EBX
0x54 PUSH ESP
0x55 PUSH EBP
0x56 PUSH ESI
0x57 PUSH EDI

0x58 POP EAX
0x59 POP ECX
0x5A POP EDX
0x5B POP EBX
0x5C POP ESP
0x5D POP EBP
0x5E POP ESI
0x5F POP EDI


2、INC/DEC: 读表:

0x40 - 0x47 INC ERX 1、i64/o64/d64

0x48 - 0x4F DEC ERX i64:64位无效

o64:只64位有效
3、MOV Rb, Ib
d64:64位模式下,操作数宽度默认为64位
0xb0 - 0xb7 MOV Rb, Ib

4、MOV ERX, Id 2、关于寄存器

0xb8 - 0xbF MOV ERX, Id (1) 当操作码需要使用寄存器做为操作数时,寄存器的名字说明其
宽度是64、32、16、8位.
5、XCHG EAX, ERX
(2) eXX 比如 eAX 可以表示 AX EAX
0x90 - 0x97 XCHG EAX, ERX
(3) rXX 比如 rAX 可以表示 AX EAX RAX

经典定长指令下(修改EIP)


1、0x70 - 0x7F

          条件跳转,后跟一个字节立即数的偏移(有符号),共两个字节。

          如果条件成立,跳转到 当前指令地址 + 当前指令长度 + Ib

最大值:向前跳7f,向后跳80

0x70   JO
0x71 JNO
0x72 JB/JNAE/JC
0x73 JNB/JAE/JNC
0x74 JZ/JE
0x75 JNZ/JNE
0x76 JBE/JNA
0x77 JNBE/JA
0x78 JS
0x79 JNS
0x7A JP/JPE
0x7B JNP/JPO
0x7C JL/JNGE
0x7D JNL/JGE
0x7E JLE/JNG
0x7F JNLE/JG

2、0x0F 0x80 - 0x0F 0x8F

          条件跳转,后跟四个字节立即数的偏移(有符号),共五个字节。
         
如果条件成立,跳转到 当前指令地址 + 当前指令长度 + Id

最大值:向前跳7FFFFFFFF,向后跳80000000

0x0F 0x80   JO
0x0F 0x81 JNO
0x0F 0x82 JB/JNAE/JC
0x0F 0x83 JNB/JAE/JNC
0x0F 0x84 JZ/JE
0x0F 0x85 JNZ/JNE
0x0F 0x86 JBE/JNA
0x0F 0x87 JNBE/JA
0x0F 0x88 JS
0x0F 0x89 JNS
0x0F 0x8A JP/JPE
0x0F 0x8B JNP/JPO
0x0F 0x8C JL/JNGE
0x0F 0x8D JNL/JGE
0x0F 0x8E JLE/JNG
0x0F 0x8F JNLE/JG

3、其他指令

0xE0   LOOPNE/LOOPNZ Ib (Jb) 共2字节
ECX = ECX - 1  当ZF = 0 && ECX!=0 时跳转到 当前指令地址 + 当前指令长度 + Ib

0XE1     LOOPE/LOOPZ Ib (Jb) 共2字节
ECX = ECX - 1  当ZF = 1 && ECX != 0 时跳转到 当前指令地址 + 当前指令长度 + Ib

0XE2 LOOP Ib (Jb) 共2字节
ECX = ECX - 1  当 ECX!=0 时跳转到 当前指令地址 + 当前指令长度 + Ib

0XE3 JrCXZ Ib (Jb) (在32位模式中,rCX为ECX) 共2字节
当 ECX = 0 时跳转到 当前指令地址 + 当前指令长度 + Ib
(自己控制步长)

0xE8 CALL Id (Jd)   共5字节
CALL指令的下一条指令地址入栈后,跳转到 当前指令地址 + 当前指令长度 + Id

0xE9 JMP Id (Jd) 共5字节
跳转到 当前指令地址 + 当前指令长度 + Id

8个段寄存器: ES CS SS DS FS GS LDTR TR (顺序固定)
(段寄存器实际是个结构体,共96位,其中仅16位是汇编指令可以访问到的)

0xEA JMP Ap (Ap:六字节长度的直接地址) 共7字节
JMP CS:Id  将Ap中的高2位赋值给CS,低4位直接赋值给EIP, 即跳转

004183D7 >    EA 12345678 1B00     JMP FAR 001B:78563412

0xEB JMP Ib (Jb)
跳转到 当前指令地址 + 当前指令长度 + Ib

0xC3 RET 共1字节
EIP出栈

0xC2 RET Iw 共3字节
EIP出栈后,ESP = ESP + Iw

0XCB RETF (return far) 共1字节
出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS

0xCA RETF Iw 共3字节
出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS后,ESP = ESP + Iw


ret  -> pop eip
retf -> pop eip, pop cs



原文链接: 硬编码——经典定长指令 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙团 ( https://gyarmy.com/post-400.html )

发表评论

0则评论给“硬编码——经典定长指令”