返回时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挂钩未正确更新调用堆栈的主要内容,如果未能解决你的问题,请参考以下文章

返回上一个屏幕时执行 useQuery() 挂钩反应原生堆栈导航器

.NET 应用程序中未调用低级键盘挂钩

JPA 查询未在列表中返回更新的结果

keil C51中函数调用无法正确返回怎么回事

单击时jquery未返回正确的值

挂钩 ExtTextOut 会返回意外结果