大家好,我想请教个问题。
一般函数末尾像下面:
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后的代码。