硬编码02

2.经典定长指令(修改EIP)

(I立即数)(d DWORD)(b BYTE)

无符号 0-FF(正数)
有符号 0-7F(正数)80-FF(负数)
0x70 - 0x7F(后跟一字节立即数偏移,有符号)
最大值:0-7F(向前跳)8F-FF(向后跳)
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

0x0F 0x80 - 0x0F 0x8F(后跟四字节立即数偏移,有符号)
最大值:0-7FFFFFFF(向前跳)8FFFFFFF-FFFFFFFF(向后跳)
跳转到地址 = 当前指令地址 + 当前指令长度 + Ib
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

例子1:

公式:跳转到地址 = 当前指令地址 + 当前指令长度 + Ib

00444243 = 0x004441EC( 当前指令地址)+2(当前指令长度) + 0x55(Ib)

例子2:

公式:跳转到地址 = 当前指令地址 + 当前指令长度 + Ib

00444243 = 0x004441EC(当前指令地址)+0x2(当前指令长度) + 0xF0(有符号=-16)[00444243 = 004441EC +2 - 0x10]

3.其它指令

计算:0044421A=00444228+(2)指令长度+F0(有符号数-16);
00444228 E2 F0 loopd short 1.0044421A

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://www.cnblogs.com/Besttwuya/p/14319923.html