ret指令替换成jmp指令

jacky_qiu 2014-01-10 05:53:07
大家好,我想请教个问题。


一般函数末尾像下面:


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指令,
希望大家给些意见。谢谢!

...全文
364 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr. Code 2014-01-10
  • 打赏
  • 举报
回复
不用call,用jmp,jmp后stack还是原来程序的stack空间,执行完你自己的事情后(前提是不要破坏stack中原有的内容),执行被覆盖的pop,甚至把ret前的所有pop和ret也在这里执行,一样能返回,相当于把它原来的pop和ret全放到自己的代码空间执行。前提是你要有一段没使用的code空间来放你jmp后的代码。
Mr. Code 2014-01-10
  • 打赏
  • 举报
回复
我不肯定应该怎么做,但是我知道你这么做不行,因为每个函数都会临时开辟一段stack来给自己使用,你call你的函数之后,此时你子程序中pop出来的内容并不是原来的内容,反而把stack给破坏了。
jacky_qiu 2014-01-10
  • 打赏
  • 举报
回复
其实我的程序想修改某个汇编指令,让程序跳到我自己的程序,执行完我的代码,并返回到 原处继续执行。比如下面的汇编 637C2649 mov dword ptr [edx],ecx 637C264B pop edi 637C264C pop esi 637C264D pop ebx 637C264E mov esp,ebp 637C2650 pop ebp 637C2651 ret 我想替换掉 dword ptr [edx],ecx (2字节) 成为 call myfunc (5字节) 程序代码会变成 637C2649 call myfunc //这句被替换掉了 ,目的是跳到我的代码 //637C264B pop edi //这句被替换掉了 //637C264C pop esi //这句被替换掉了 //637C264D pop ebx //这句被替换掉了 637C264E mov esp,ebp 637C2650 pop ebp 637C2651 ret 而跳转到的的代码必须是这样: myfunc: dword ptr [edx],ecx //我的代码里需要重新执行被覆盖的指令 //执行一些我自己的代码 pop edi //我的代码里需要重新执行被覆盖的指令 pop esi //我的代码里需要重新执行被覆盖的指令 pop ebx //我的代码里需要重新执行被覆盖的指令 ret //这时候 如何才能令 ret 跳转到 637C264E(即被覆盖指令的下一条指令) 不知道我有没有表达清楚,抱歉!
Mr. Code 2014-01-10
  • 打赏
  • 举报
回复
我觉得你改jmp后,堆栈环境被破坏了。你加自己的pop无非是想获取stack里的东西吧?为什么不在程序的所有pop指令前,通过ebp寄存器用mov间接寻址来获取呢?
大熊猫侯佩 2014-01-10
  • 打赏
  • 举报
回复
你只要取到ret地址,添加其他代码,然后直接jmp即可。 比如:pop eax ;你的代码 jmp eax

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧