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



我正在遵循创建蹦床的过程,以便挂接dll函数(在我的情况下是从d3d9.dll中的Direct3DCreate9(,如下所示:https://www.malwaretech.com/2015/01/inline-hooking-for-programmers-part-1.html和https://www.malwaretech.com/2015/01/inline-hooking-for-programmers-part-2.html

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

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

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

在完成了反汇编之后,看起来调用堆栈似乎被覆盖了,所以当Direct3DCreate9返回时,它会弹回到受害者应用程序,而不是发出调用的钩子函数。

我想我需要手动将hook函数推到调用堆栈上吗?我该怎么做?

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

原来英伟达图形驱动程序nvd3d9wrap.dll正在对调用堆栈进行knobbble。该dll以与我尝试的方式相同的方式注入到d3d9应用程序中。这导致了原帖子中解释的疯狂。

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

最新更新