О крючке WH_CBT
Я пытаюсь использовать 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;
}
2. код кусок inject.dll
#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) может обнаружить перехват сообщения WH_CBT в модуле inject.exe. Затем я запускаю ExampleWindow.exe, там также можно вывести отладочное сообщение.
После этого действия я обновляю окна перехвата сообщений в PCHUNTER, сообщение перехвата WH_CBT исчезло из элемента управления, и файл inject.dll вообще не внедряется в ExampleWindow.exe. Это не мой ожидаемый результат.
Я не знаю, как это происходит. Я надеюсь, что кто-то может помочь мне найти причину этой проблемы.