【问题标题】:Assembly- Calling function inside another i.e nested functions汇编 - 在另一个内部调用函数,即嵌套函数
【发布时间】:2016-11-13 05:16:36
【问题描述】:


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

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

所以我知道如果我只在里面调用一个函数,就这样离开是安全的,
因为无论如何都会恢复堆栈。
问题是 - 为什么我不能在这之后添加 esp, 0x04? - 应用程序崩溃
我不确定我是否需要这样做,但 imo 在功能后这样做更安全
调用,并且不知何故我无法在函数中使用它
我很感激任何帮助:)

【问题讨论】:

    标签: function assembly nested call fasm


    【解决方案1】:

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

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

    您正在调用一个 Windows 函数,因此我假设被调用的函数会清理堆栈参数。这使我得出以下结论:

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

    如果你想执行“add esp, 0x04”来删除函数参数:那没必要,因为windows API已经删除了。

    编辑:

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

    【讨论】: