我正在尝试使用SetWindowsHookEx
在全局上安装WH_CBT
钩子,以将DLL注入其他进程。现在我有了inject.exe,ExampleWindow.exe,inject.dll,让我向您展示代码。
1.inject.exe的代码段
#include <windows.h>
int main()
{
HHOOK hhook = NULL;
HMODULE dll = LoadLibrary(_T("D:\\projects\\CppDemon\\Release\\HookDemoDll.dll"));
HOOKPROC pfn = (HOOKPROC)GetProcAddress(dll, "MyCBTProc");
if (pfn == NULL)
{
printf("can not get MyCBTProc,press any key to exit\n");
getchar();
return 0;
}
printf("press any key to continue hook\n");
getchar();
hhook = SetWindowsHookEx(WH_CBT, pfn, dll, 0);
if (NULL == hhook)
{
printf("%d\n", GetLastError());
}
printf("press any key to unhook\n");
getchar();
UnhookWindowsHookEx(hhook);
return 0;
}
inject.dll的2.code段
#ifdef __cplusplus
extern "C"
{
#endif
extern "C" __declspec(dllexport) LRESULT MyCBTProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam);
#ifdef __cplusplus
}
#endif
LRESULT MyCBTProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
DWORD pid = 0;
TCHAR buffer[128] = { 0 };
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
pid = GetCurrentProcessId();
_stprintf_s(buffer, 128, _T("[+] PID = %d"), pid);
OutputDebugString(buffer);
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
ExampleWindow.exe是创建命名窗口时进行注入的测试用例。
当我运行inject.exe时,一切顺利,inject.dll已加载,调试消息输出正确,PCHUNTER(这是一个ARK工具)可以检测到模块inject中的WH_CBT消息钩子。可执行程序。然后,我运行ExampleWindow.exe,那里也可以输出调试消息。
此操作之后,我刷新了PCHUNTER中的消息挂钩窗口,WH_CBT挂钩消息已从控件中消失,并且inject.dll根本没有注入到ExampleWindow.exe中。这不是我期望的结果。>
我不知道这是怎么发生的。我希望有人可以帮助我找到造成此问题的原因。