返回时dll挂钩未正确更新调用堆栈
Posted
技术标签:
【中文标题】返回时dll挂钩未正确更新调用堆栈【英文标题】:dll hook not updating callstack correctly when returning 【发布时间】:2020-03-18 18:22:40 【问题描述】:我正在按照创建蹦床的过程来挂钩一个 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 返回时,它会弹回受害者应用程序,而不是我发出调用的钩子函数。
我猜我需要手动将钩子函数推送到调用堆栈上?我该怎么办?
其他可能相关的信息:受害进程和钩子都已在调试模式下构建。 Direct3DCreate9 是一个 __stdcall,我使用 vs2010 作为钩子 dll,但受害进程是用 vs2015 编译的。
【问题讨论】:
【参考方案1】:原来调用堆栈被 NVidia 图形驱动程序 nvd3d9wrap.dll 控制了。这个 dll 以与我尝试做的相同的方式注入到 d3d9 应用程序中。这导致了原始帖子中解释的疯狂。
解决方案是在 Windows 中打开设备管理器并禁用 NVidia 图形驱动程序。幸好我的电脑有一个集成的图形芯片,所以我可以使用它。
【讨论】:
以上是关于返回时dll挂钩未正确更新调用堆栈的主要内容,如果未能解决你的问题,请参考以下文章