问题是现在一调用就会导致程序崩溃,我想知道可能会是什么原因?栈没平吗?应该怎么做

假设某程序的反汇编代码如下
ESP:00000000

push ebx 这句执行后:ESP:00000004
push esi 这句执行后:ESP:00000008
push eax 这句执行后:ESP:0000000c
call 50b890 这句执行后:ESP:0000000c
add esp,c 这句执行后:ESP:00000000
retn
------------------
我现在要自编一段代码注入的程序中,目的是要从外部调用50b890那个CALL
代码如下:
pushad
push ebx
push esi
push eax
call 50b890
add esp,c
popad
retn

杨魅力
浏览 126回答 2
2回答

凤凰求蛊

是的,你需要自己弹栈正如你提供的代码。add esp,c汇编里的函数一般都不自己进行栈操作,而是需要调用者去进行

翻阅古今

信息不全,不好解决。 call 50b890 ,其中50b890 是哪里的外部调用。是在目标进程空间的调用吗? call 50b890 有几个参数?push ebx push esi 不知道是保护环境的还是参数。 call 50b890 是什么方式平栈的?deiphi的和vc的有区别,(应该不是系统API的吧) 你试试add esp,4看看,可能它只有一个参数(push eax),同时还需要pop ebx, pop esi。或者将这句取消,它内部已经平栈了。或者将这句取消,并且加pop ebx, pop esi恢复环境。 如果你能调试,那就好判断了。pushad后的esp和popad前的应该一致。 还有一个,你的call 50b890 需要做什么操作,CALL返回后的寄存器里的值是否有用,如果有用,就不能popad,会将有用的值覆盖掉的
打开App,查看更多内容
随时随地看视频慕课网APP