当前位置: 代码迷 >> 汇编语言 >> ret指令替换成jmp指令,该怎么解决
  详细解决方案

ret指令替换成jmp指令,该怎么解决

热度:454   发布时间:2016-05-02 04:44:54.0
ret指令替换成jmp指令
本帖最后由 jacky_qiu 于 2014-01-10 17:54:05 编辑
大家好,我想请教个问题。


一般函数末尾像下面:


002B18F0  pop         edi  
002B18F1  pop         esi  
002B18F2  pop         ebx  
002B18F3  mov         esp,ebp 
002B18F5  pop         ebp  
002B18F6  ret    



我想在函数的返回指令前添加代码,如下:


002B18F0  pop         edi  
002B18F1  pop         esi  
002B18F2  pop         ebx  
002B18F3  mov         esp,ebp 
002B18F5  pop         ebp  

我想在这里添加自己的代码  pop esi ,但添加了这样的pop指令后,ret就不能正确返回,

002B18F6  ret    


因为汇编我不是很了解,在网上查了资料,好像说返回地址保存在esp中,那我可否这样


002B18F0  pop         edi  
002B18F1  pop         esi  
002B18F2  pop         ebx  
002B18F3  mov         esp,ebp 
002B18F5  pop         ebp  

pop esp   
mov [returnaddress] esp   //我想先把保存在棧里的返回地址取出来保存在一个变量里

这里添加我自己的pop指令,
pop         edi    //我自己想添加的pop指令
pop         esi    //我自己想添加的pop指令

jmp   [returnaddress]  //跳转到返回地址



这个其实就是如何把ret替换成jmp指令,
希望大家给些意见。谢谢!


------解决方案--------------------
你只要取到ret地址,添加其他代码,然后直接jmp即可。

比如:pop eax
       ;你的代码
       jmp eax
------解决方案--------------------
我觉得你改jmp后,堆栈环境被破坏了。你加自己的pop无非是想获取stack里的东西吧?为什么不在程序的所有pop指令前,通过ebp寄存器用mov间接寻址来获取呢?
------解决方案--------------------
我不肯定应该怎么做,但是我知道你这么做不行,因为每个函数都会临时开辟一段stack来给自己使用,你call你的函数之后,此时你子程序中pop出来的内容并不是原来的内容,反而把stack给破坏了。


------解决方案--------------------
不用call,用jmp,jmp后stack还是原来程序的stack空间,执行完你自己的事情后(前提是不要破坏stack中原有的内容),执行被覆盖的pop,甚至把ret前的所有pop和ret也在这里执行,一样能返回,相当于把它原来的pop和ret全放到自己的代码空间执行。前提是你要有一段没使用的code空间来放你jmp后的代码。
  相关解决方案