如何在内联程序集中调用函数时保留堆栈

How to preserve the stack when calling a function in inline assembly?

本文关键字:函数 调用 保留 堆栈 集中 程序集 程序      更新时间:2023-10-16

我有一个执行内联程序集的钩子函数:

__declspec(naked) int hookConnect()
{
    __asm
    {
        pushad;
        pushfd;
        push [esp + 0x2C];
        pop sockAddrBackup;
        push[esp + 0x2C];
        push[esp + 0x2C];
        call mConnect;
        popfd;
        popad;
        call connectTramp;
        ret;
    }
}

它保存寄存器和标志。然后将其中一个参数保存到一个变量中,最后推送 2 个参数并调用我的自定义函数,该函数仅记录参数。

之后,它恢复寄存器,标志。这时候我想叫蹦床:

蹦床:

5 original bytes  
jmp (original func + 5 bytes)

它执行前 5 个字节,跳转到原始 func 并执行它,然后返回到我的钩子函数。

此时,我想返回到原始函数的调用者,但由于在函数完成时调用 leave,它会破坏堆栈?

如何通过执行保留堆栈?在致电前保存回邮地址?

通过调用蹦床,您将在原始参数上方放置另一个堆栈帧,这意味着它们不在原始代码期望找到它们的位置(堆栈上有两个返回地址,而不仅仅是一个(。

您必须

  1. 跳到蹦床上(你的钩子将无法有尾声(

  1. 在调用蹦床之前将原始参数复制到堆栈上,并在返回后清理它们,小心保留返回值。