修改EPI指令

EIP 寄存器 指向CPU下一次要执行的程序地址。

指令 注释 用法
JMP 修改EIP的值 JMP r/m/imm
CALL 修改EIP的值,入栈CALL指令下一行的程序地址 CALL r/m/imm
RET 出栈CALL指令入栈的程序地址到EIP RET

JMP 指令:jmp相当于 mov eip,r/m/imm

由下图可见,不支持直接mov eip的值(Intel并没有提供mov eip支持)。


mov eip,imm
//EIP改变 程序跳转到空白(堆栈外的地址)
JMP 1
jmp 1 结果
jmp 0044335A
jmp eax
jmp dword ptr ds:[0x0012FFCC]
jmp 0044335A

CALL 指令:

  1. 修改EIP的值
  2. call指令下面一行指令的地址存入堆栈
  3. esp地址减4
    (2、3步骤相当于 PUSH CALL指令下面一行指令的地址)
    注:CALL指令在DTDebug中按F7执行。
CALL 0044335C 结果
CALL 0044335C

MOV EAX,0044335C
CALL EAX

MOV DWORD PTR DS:[0012FFC8],0044335C
CALL DWORD PTR DS:[0012FFC8]
//1 
//自定义实现CALL
jmp 0044335C
push 00443355
//2 解释push
jmp 0044335C
mov 0012ffC0 00443355
sub esp,4

思考:
还可以怎么实现CALL指令功能?

RET 指令:

  1. ESP加4
  2. EIP重新指向栈顶指向指令地址
RET
//
RETN
//1
jmp dword ptr ds:[esp]
add esp,4

思考:
如何自定义实现RETN?

你可能感兴趣的:(修改EPI指令)