全局钩子注入.md
在windows中,大部分的应用程序都是基于消息机制,他们都有一个消息过程函数,根据不同的消息完成不同的功能,钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。对每种类型的钩子由系统来维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的先获得控制权。
要实现Win32的系统钩子,必须调用SDK中的API函数SetWindowsHookEx
函数,函数原型:
HHOOK WINAPI SetWindowsHookEx(
_In_ int idHook, // 设置钩子的类型.意思就是我要设置的钩子是什么钩子. 可以是监视窗口过程.可以是监视消息队列.
_In_ HOOKPROC lpfn, // 一个指向钩子函数的指针
_In_ HINSTANCE hMod, // 钩子lpfn参数指向的钩子过程的dll句柄,如果指定由当前线程创建线程并且钩子过程位于与当前进程关联的代码中则hMod参数必须为null
_In_ DWORD dwThreadId // 设置钩子的线程ID. 如果为0 则设置为全局钩子.
);
#include<Windows.h>
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
MessageBox(0, 0, "Success", 0);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#include <Windows.h>
#include<stdio.h>
HHOOK g_hHook;
LRESULT GetMsgProc(
int code,
WPARAM wParam,
LPARAM lParam)
{
return ::CallNextHookEx(g_hHook, code, wParam, lParam);
}
int main()
{
HMODULE hDll;
hDll = ::LoadLibrary("libuntitled.dll");
g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, hDll, 0);
if (g_hHook == NULL) {
printf("Hook Failed!\n");
return -1;
}
else
{
printf("Hook Success!\n");
system("pause");
}
UnhookWindowsHookEx(g_hHook);
printf("UnHook");
}