返回时 dll 挂钩未正确更新调用堆栈

dll hook not updating callstack correctly when returning

我正在按照此处概述的创建蹦床的过程来挂接 dll 函数(在我的例子中来自 d3d9.dll 的 Direct3DCreate9):https://www.malwaretech.com/2015/01/inline-hooking-for-programmers-part-1.html and https://www.malwaretech.com/2015/01/inline-hooking-for-programmers-part-2.html

我的代码略有不同,因为我使用反汇编程序手动计算偏移字节,而不是使用 hde32_disasm 函数。

一切似乎都正常,受害者进程调用我注入的 dll 包装函数,新函数做了一些事情,然后调用原始函数 (Direct3DCreate9),一旦原始 returns 包装器应该调用一些其他的东西,在返回到受害者进程之前。

不幸的是,当从钩子包装器调用原始函数时,它 returns 返回到受害者应用程序而不是钩子包装器,这意味着它遗漏了包装器中的一些代码。

通过反汇编,调用堆栈看起来好像被覆盖了,所以当 Direct3DCreate9 returns 它弹出回受害者应用程序,而不是我发出调用的钩子函数。

我猜我需要手动将挂钩函数推送到调用堆栈?我该怎么做?

其他可能相关的信息:受害者进程和挂钩都是在调试模式下构建的。 Direct3DCreate9 是一个 __stdcall,我使用 vs2010 作为 hook dll,但受害者进程是用 vs2015 编译的。

事实证明调用堆栈被 NVidia 图形驱动程序 nvd3d9wrap.dll 弄乱了。这个 dll 以与我尝试做的相同的方式注入到 d3d9 应用程序中。这导致了原始 post.

中解释的疯狂

解决方案是在 windows 中打开设备管理器并禁用 NVidia 图形驱动程序。谢天谢地,我的电脑有一个集成的图形芯片,所以我可以使用它。