为啥 Detours 不能再在 Windows 7+ 中挂钩 shell32.dll 函数

Posted

技术标签:

【中文标题】为啥 Detours 不能再在 Windows 7+ 中挂钩 shell32.dll 函数【英文标题】:Why can Detours no longer hook shell32.dll functions in Windows 7+为什么 Detours 不能再在 Windows 7+ 中挂钩 shell32.dll 函数 【发布时间】:2013-08-07 15:25:32 【问题描述】:

在 Windows XP 中,可以使用以下 shell32 挂钩来挂钩资源管理器:

Real_SHFileOperation = (T_SHFileOperation) DetourFindFunction("shell32.dll", "SHFileOperationW");
nError = DetourAttach(&(PVOID&)Real_SHFileOperation, Detoured_SHFileOperation); 
if(nError != NO_ERROR)

    TRACE_ERROR(g_hTrace, "DetourAttach SHFileOperation Failed (%d)", nError);

由于某种原因在 Windows 7 上这不再有效,即使 DetourAttach 仍然返回成功。我安装的所有其他钩子(例如在 ntdll.dll 中)仍然有效,但我在 shell32.dll 中创建的钩子不再有效。

我将 Windbg 附加到资源管理器并运行 uf shell32!SHFileOperationW 这表明该函数现在确实跳转到了我的函数:

SHELL32!SHFileOperationW:
76239708 e9039658fc      jmp     myhook!Detoured_SHFileOperation (727c2d10)

然而,explorer 不知何故跳过了我的弯路,进入了 SHFileOperation 函数的其他部分......

【问题讨论】:

绕道已附加并且它仍然跳转到您的函数这一事实意味着问题出在您的函数内部而不是外部,不是吗? 如果我在我的函数中设置一个断点,它永远不会跳闸......所以不,我不这么认为。即使我在那里做了一些琐碎的事情,比如 OutputDebugString,它也永远不会打印出来。尽管如此,我还是可以看到 explorer 在 procmon 中进入真正的功能...... 【参考方案1】:

嗯,

看来我在 Windows 7 上真正应该做的是挂钩 IFileOperation 接口:

http://stuani.blogspot.co.uk/2010/01/ifileoperation-hook-under-vistaseven.html

看起来比简单的弯路钩子更棘手,但可以实现。

【讨论】:

以上是关于为啥 Detours 不能再在 Windows 7+ 中挂钩 shell32.dll 函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Delphi 10.4.1(最新)中不使用 Detours 安装 Vcl.Styles (RRUZ)

Detours 3.0 钩子 GetProcAddresss()

构建 32 位 Detours 库

25.Detours劫持技术

为啥使用函数指针调用函数会绕过钩子?

Microsoft Detours 2.1简介