【发布时间】: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 中进入真正的功能......