c++ - 在内联汇编中调用函数时如何保留堆栈?

标签 c++ winapi assembly

我有一个执行内联汇编的钩子(Hook)函数:

__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;
    }
}

它保存寄存器和标志。然后将其中一个 args 保存到一个变量,最后压入 2 个 args 并调用我的自定义函数,它只记录 args。

之后,它恢复寄存器、标志。这时候我想给蹦床打电话:

蹦床:

5 original bytes  
jmp (original func + 5 bytes)

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

此时,我想返回到原来func的调用者,但是因为leave是在函数结束时调用的,所以会破坏堆栈?

如何在执行过程中保留堆栈?调用前保存返回地址?

最佳答案

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

你必须要么

  1. 跳到蹦床(你的钩子(Hook)不会有结语)

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

关于c++ - 在内联汇编中调用函数时如何保留堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43825877/

相关文章:

c++ - 使用预处理器制作用户定义的文字

c++ - 函数是否有任何可能的优化来反转int32中的字节顺序?

c++ - write 返回较小尺寸时该怎么办?

C++ GetAsyncKeyState 在控制台窗口中不工作

c# - 有什么方法可以在发生崩溃时删除通知图标?

c++ - 未捕获 WM_PAINT 中的访问冲突

android - ARM Neon Assembler - 奇怪的管道问题

c++ - g++ - 无优化 - 在转到后跳过 asm 代码

c++ - 空/空字符串检查 : CPU overhead

c++ - 通过中间函数调用WriteConsole无法正常工作