Function 在另一个函数(即嵌套函数)中调用程序集函数

Function 在另一个函数(即嵌套函数)中调用程序集函数,function,assembly,nested,call,fasm,Function,Assembly,Nested,Call,Fasm,我尝试在自定义汇编函数中调用windows函数 伪代码类似于: MYFUNC PUSH EBP PUSH WINDOWSFUNCTIONPARAMETER CALL [IMPORTEDWINDOWSFUNCTION] POP EBP RET 所以我知道,如果我只调用其中的一个函数,就可以安全地将其保留为这样, 因为这个堆栈无论如何都会被恢复。 问题是-为什么不能在此之后添加esp,0x04?-应用程序崩溃 我甚至不确定是否需要这样做,但我认为在功能完成后这样做更安全 调用,但不知何故,我无法


我尝试在自定义汇编函数中调用windows函数
伪代码类似于:

MYFUNC
PUSH EBP
PUSH WINDOWSFUNCTIONPARAMETER
CALL [IMPORTEDWINDOWSFUNCTION]
POP EBP
RET
所以我知道,如果我只调用其中的一个函数,就可以安全地将其保留为这样,
因为这个堆栈无论如何都会被恢复。
问题是-为什么不能在此之后添加esp,0x04?-应用程序崩溃
我甚至不确定是否需要这样做,但我认为在功能完成后这样做更安全
调用,但不知何故,我无法在函数内部实现此功能

非常感谢您的帮助:)

我不知道您所说的“在此之后”是什么意思。基本上:

  • 在x86体系结构上,堆栈向下增长
  • 根据您的调用约定,调用者或被调用者都会清理堆栈
您正在调用windows函数,因此我假设被调用的函数会清理堆栈参数。这使我得出以下结论:

如果在API调用后执行“add esp,0x04”,则“pop ebp”将接收返回地址,而不是先前保存的ebp寄存器。因此,最终的“ret”将失败,并且不会返回到MYFUNC的调用者

如果要执行“添加esp,0x04”以删除函数参数:这不是必需的,因为windows API已经删除了它

编辑:

如果你有一个简单的例子,比如上面的例子,我建议你使用一个调试器,比如ollydbg,x64dbg,等等。它们是免费的,在你的应用程序运行时会显示寄存器,堆栈等