使用MinHook钩住windows资源管理器copyFile2函数不起作用

我尝试钩住CopyFile2函数,为此我编写了以下dll:

\include“.\..\\..\minhook-1.3.3\include\minhook.h”
WCHAR-msgbuf[1024];
#定义DbgPrint(format,…)wsprintf(msgbuf,format,_VA_ARGS__;)\
OutputDebugString(msgbuf);
#如果已定义_M_X64
#pragma注释(lib,“libMinHook.x64.lib”)
#elif定义的_M_IX86
#pragma注释(lib,“libMinHook.x86.lib”)
#恩迪夫
typedef HRESULT(WINAPI*复制文件2)(
_在uuwstr pwszExistingFileName中,
_在uuwstr pwszNewFileName中,
_In_opt_uuuCopyFile2_扩展参数*pExtendedParameters
);
COPY_FILE_2 fpCopyFile2=NULL;
HRESULT WINAPI DetourCopyFile2(
_在uuwstr pwszExistingFileName中,
_在uuwstr pwszNewFileName中,
_In_opt_uuuCopyFile2_扩展参数*pExtendedParameters
)
{
DbgPrint(L“=>DetourCopyFile2\n”);
DbgPrint(L“DetourCopyFile2.pwszExistingFileName=%ws\n”,pwszExistingFileName);
DbgPrint(L“DetourCopyFile2.pwszNewFileName=%ws\n”,pwszNewFileName);
返回fpCopyFile2(pwszExistingFileName、pwszNewFileName、pextendedpparameters);
}
void InstallHook()
{    
DbgPrint(L“=>InstallHook\n”);
//初始化MinHook。
如果(MH_初始化()!=MH_正常)
{
DbgPrint(L“MH_初始化失败\n”);
回来
}
如果(MH_CreateHook(&CopyFile2,&DetourCopyFile2,(LPVOID*)和fpCopyFile2)!=MH_正常)
{
DbgPrint(L“失败的MH_CreateHook\n”);
}
其他的
{
如果(MH_启用挂钩(&CopyFile2)!=MH_正常)
{
DbgPrint(L“失败的MH_启用挂钩\n”);
}
}
}
HINSTANCE HINSTANCE=NULL;
BOOL WINAPI DllMain(HINSTANCE hinstDLL、DWORD FDFREASON、LPVOID lpvReserved)
{
开关(FDSON)
{
案例DLL\u进程\u附加:
DbgPrint(L“DLL_进程_附加”);
hInstance=hinstDLL;
禁用线程库调用(hInstance);
InstallHook();
打破
}
返回TRUE;
}

当我插入此dll以测试prograg时,它的工作将正常进行,DebugView显示以下消息:

int main()
{
OutputDebugString(L“=>main”);
printf(“立即注入”);
getchar();
CopyFile2(L“”,L“”,空);
系统(“暂停”);
返回0;
}

我从Deviare2项目中运行CSharpConsole64.exe,我看到资源管理器使用CopyFile2函数复制文件

我的问题是,为什么当我将这个DLL注入Windows资源管理器时,我只收到钩子成功的第一条消息,而当我复制一个文件时,DebugView中没有来自detour函数的消息?我怎样才能解决这个问题呢

我使用的是Visual Studio 2017操作系统Windows 10 64位

我还尝试了HookReadFile函数,我在debugview中得到了消息,但不是每次我复制一个文件时都会收到消息,这里有些东西我不清楚在资源管理器中有什么不同,如果有任何帮助,我将不胜感激

我知道很久没有人问过这个问题了。我这样回答是为了对别人有所帮助

我也有同样的问题,绕道测试。使用您使用的相同测试程序,我在hookedCopyFile2函数中看到了DebugView消息,但explorer.exe在hooked函数中不显示任何消息。同样,对于explorer.exe,我在DllMain中的DetourAttach函数中看到挂钩成功

在使用x64dbg分析explorer.exe中CopyFile2的调用堆栈后,我发现kernel32.dll中的CopyFile2从未被调用。我意识到kernel32.dll和kernelbase.dll都有一个具有相同签名的CopyFile2函数。我看到实际上调用了kernelbase.dll中的CopyFile2函数,而不是kernel32.dll中的函数

我认为您的挂接肯定是正确的,但您正在从kernel32.dll挂接CopyFile2。由于explorer.exe使用kernelbase.dll中的CopyFile2而不是kernel32.dll,因此不会调用挂钩函数。您需要从kernelbase.dll钩住CopyFile2

我以前没有使用过MinHook,但它应该支持在指定模块中挂钩函数。Detours库具有DetourFindFunction以获取指定模块中函数的地址。或者您可以尝试使用GetProcAddress

发表评论