代替x86汇编'call'指令?

时间:2011-08-15 01:33:22

标签: assembly x86 call

x86调用指令有哪些替代方法? 也许类似于推送返回地址然后跳转?

也是他们获取内存中当前位置的命令?

3 个答案:

答案 0 :(得分:20)

CALL实际上为你做了这个例子

CALL my_func

会做类似

的事情
push ret_address
jmp my_func

并且后续的RET调用只会在某种意义上使用刚刚推送到JMP的地址。是否有特定原因导致您不想使用CALL或者它不适用于您? 对于内存中的当前位置,您可以尝试读取EIP寄存器(无法写入)。

答案 1 :(得分:6)

您只需将dword值和jmp推送到该过程即可。推送将是返回地址:

push return_address (push eax if address in eax)
jmp call_address

如果存在针对该特定呼叫的参数,请记住也推送参数。

你在记忆中的当前位置是什么意思?我想你的意思是当前的指令指针。你不能直接得到它,但你可以使用seh处理程序(结构化异常处理程序)在导致处理异常时获取该值。

答案 2 :(得分:1)

如果我没有混淆的东西,我会说这取决于。你可以看到here有近距离和远距离通话,但我们只考虑近距离通话。还有两种可能性

E8 <offset> # relative
FF <address> # absolute

FF表示绝对“跳转”,E8表示相对于当前eip

所以如果你有例如

E8 32 45 ab 6f

表示

call 0x3245ab6f

这将转化为

push %eip
add $0x3245ab6f, %eip

而不是

push %eip
jmp $0x3245ab6f