Assembly x86汇编和x27的替代品;呼叫';指示

Assembly x86汇编和x27的替代品;呼叫';指示,assembly,x86,call,Assembly,X86,Call,x86 call指令有哪些替代方案? 也许像推送回信地址然后跳转 它们也是获取内存中当前位置的命令吗?您只需将dword值和jmp推送到过程中即可。推送将是返回地址: push return_address (push eax if address in eax) jmp call_address 记住,如果某个调用存在参数,也要推送参数 你所说的内存中的当前位置是什么意思?我想你指的是当前的指令指针。您无法直接获取该值,但可以使用seh处理程序(结构化异常处理程序)在导致已处理异常时获取该值

x86 call指令有哪些替代方案? 也许像推送回信地址然后跳转


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

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

push return_address (push eax if address in eax)
jmp call_address
记住,如果某个调用存在参数,也要推送参数


你所说的内存中的当前位置是什么意思?我想你指的是当前的指令指针。您无法直接获取该值,但可以使用seh处理程序(结构化异常处理程序)在导致已处理异常时获取该值。

调用指令实际上为您执行此操作。例如,
调用my_func
将执行以下操作:

push ret_address
jmp my_func
在某种意义上,后续的
ret
调用只会使用您刚才推送到
jmp
的地址。您是否有特定原因不想使用
呼叫
,或者该呼叫不适用于您?
对于内存中的当前位置,您可以尝试读取
eip
寄存器(无法写入)。

如果我没有弄错什么,我会说这取决于具体情况。正如你所看到的,有近距离和远的呼叫,但是我们只考虑近距离呼叫。还有两种可能性

E8 <offset> # relative
FF <address> # absolute
也就是说

call 0x3245ab6f
这将转化为

push %eip
add $0x3245ab6f, %eip
而不是

push %eip
jmp $0x3245ab6f

我正在注入一个asm代码存根,它通过另一个进程(使用C#)调用内部函数。基本上,我想知道它们是否是在不中断任何寄存器或堆栈的情况下调用该函数的一种更优雅的方式(以便在调用之前保留它们)。我使用的另一种解决方案是静态地编写一条跳转指令,后跟函数地址(比如windows如何处理dll函数)但是这意味着要跟踪注入代码的缓冲区大小,在我看来这是不雅观的,但看起来这是目前唯一的选择。而且我认为我可以使用间接调用。是的,你可以使用间接调用,如果要完全替换函数调用并让它执行代码,则可以使用跳转迂回。除了跳转迂回,如果需要完全替换函数调用,还可以直接在代码中修补相关的调用/跳转偏移。自定义替换函数应具有与原始函数相同的签名。当然,这对间接调用和跳转不起作用,但仍然有帮助。您可以写入EIP寄存器,该指令不是称为MOV,而是称为JMP。请注意,
call
将一条指令的地址推到其自身的末尾,即下一条指令的地址。x86没有体系结构上可见的
%eip
,因此您至少应该对伪代码进行注释,说明在添加调用指令的长度后,
%eip
是已经增加的eip。(是的,相对位移是相对于指令的结尾,即返回地址,就像64位RIP相对寻址一样。)
push %eip
jmp $0x3245ab6f