汇编 - 在另一个内部调用函数,即嵌套函数

时间:2016-07-11 09:49:00

标签: function assembly nested call fasm


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

MYFUNC
PUSH EBP
PUSH WINDOWSFUNCTIONPARAMETER
CALL [IMPORTEDWINDOWSFUNCTION]
POP EBP
RET

所以我知道如果我只调用一个函数,就可以安全地离开这个 因为无论如何都会恢复堆栈。
问题是 - 为什么我可以在此之后添加esp,0x04? - 应用程序崩溃了 我不确定我是否需要这样做但是在功能
之后更安全 打电话,不知怎的,我不能让这个功能在一个功能中工作 我很感激任何帮助:)

1 个答案:

答案 0 :(得分:0)

我不确定你的意思是“在此之后”。基本上是:

  • 在x86架构上,堆栈向下扩展。
  • 根据您的调用约定,调用者或被调用者清理堆栈。

您正在调用Windows函数,因此我假设被调用函数清除堆栈参数。这导致我得出以下结论:

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

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

编辑:

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