相关函数介绍
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
我们通常使用通常使用SetWindowsHookEx来安装消息钩子,函数原型如下:
1 2 3 4 5 6 7
| HHOOK SetWindowsHookExA( int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId );
|
idHook钩子类型如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| BOOL InjectDllBySetWindowsHook(ULONG32 ulTargetProcessID) { HANDLE TargetProcessHandle = NULL; TargetProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ulTargetProcessID);
if (NULL == TargetProcessHandle) { return FALSE; } HMODULE DllModule; #ifdef _WIN64 DllModule = LoadLibrary(L"E:\\Dll644.dll"); #else DllModule = LoadLibrary(L"E:\\Dll.dll"); #endif
if (DllModule == NULL) { printf("Can Not Find Dll"); return FALSE; }
HOOKPROC Func_Address = NULL; Func_Address = (HOOKPROC)GetProcAddress(DllModule, "OurFunction"); if (Func_Address == NULL) { printf("function do not Exist!"); return FALSE; }
DWORD ThreadID = getThreadID(ulTargetProcessID);
HHOOK Handle = SetWindowsHookEx(WH_KEYBOARD, Func_Address, DllModule, ThreadID);
if (Handle == NULL) { printf("Hook Failed!"); return FALSE; } printf("Hook Success"); getchar(); UnhookWindowsHookEx(Handle); FreeLibrary(DllModule); return true; }
|