首页 网络安全 安全学院 查看内容

一个很简单的钩子

2008-8-25 17:16 653 0

摘要: 今天将介绍一个特别的钩子程序,特别之处在于它非常简单,希望能给读者一些启发。我们不会 介绍复杂的原理,也不会涉及诸多的函数,相关的只有2个:SetWindowsHookEx 和 CBTProc 下面...
关键词: DWORD 钩子 NULL 之前 函数 WPARAM CTXT 参数 消息 HINSTANCE

今天将介绍一个特别的钩子程序,特别之处在于它非常简单,希望能给读者一些启发。我们不会 介绍复杂的原理,也不会涉及诸多的函数,相关的只有2个:SetWindowsHookEx 和 CBTProc 下面就对 他们分别作一介绍: HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId ); 第一个参数:指定钩子的类型,有WH_MOUSE、WH_KEYBOARD等十多种(具体参见MSDN)第二个参数:标识钩子函数的入口地址第三个参数:钩子函数所在模块的句柄;第四个参数:钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息。 简单理解就是第一个参数告诉系统:请将xxx的消息发给我。我们选择的是 WH_CBT 。这个类型 会在窗口激活,创建,最小化,最大化,移动或者改变大小;完成系统命令;从系统消息队列中 移除鼠标或者键盘事件之前;在取得键盘焦点之前;和系统消息队列同步之前; 设置键盘焦点之前触发。 回调函数,CBTProc 原型如下:LRESULT CALLBACK CBTProc( int nCode,WPARAM wParam,LPARAM lParam); 输入的参数 nCode = HCBT_ACTIVATE 表示是在激活一个窗口之前,回调进入这个函数的。 因此,我们所做的就是:告诉系统,我已经hook,请将窗口的某种消息发给我的xxx程序,然后 我们在xxx程序中再检查,当遇到我们需要的yyy消息时就做我们要做的,程序中我们是更换 按键上的文字。 ;MASMPlus 代码模板 - 普通的 Windows 程序代码 .386.Model Flat, StdCallOption Casemap :None Include windows.incInclude user32.incInclude kernel32.incInclude gdi32.inc includelib gdi32.libIncludeLib user32.libIncludeLib kernel32.libinclude macro.asm WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORDWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD .DATAszClassName db "MASMPlus_Class",0 .DATA?hInstance dd ?hHook dd ? .CODESTART: invoke GetModuleHandle,NULLmov hInstance,eaxinvoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULTinvoke ExitProcess,0 WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORDLOCAL wc :WNDCLASSEXLOCAL msg :MSGlocal hWnd :HWND mov wc.cbSize,sizeof WNDCLASSEXmov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOWmov wc.lpfnWndProc,offset WndProcmov wc.cbClsExtra,NULLmov wc.cbWndExtra,NULLpush hInstpop wc.hInstancemov wc.hbrBackground,COLOR_BTNFACE+1mov wc.lpszMenuName,NULLmov wc.lpszClassName,offset szClassNameinvoke LoadIcon,hInst,100mov wc.hIcon,eaxinvoke LoadCursor,NULL,IDC_ARROWmov wc.hCursor,eaxmov wc.hIconSm,0invoke RegisterClassEx, ADDR wcinvoke CreateWindowEx,NULL,ADDR szClassName,CTXT("http://www.aogosoft.com"),WS_OVERLAPPEDWINDOW,200,200,400,200,NULL,NULL,hInst,NULLmov hWnd,eaxinvoke ShowWindow,hWnd,SW_SHOWNORMALinvoke UpdateWindow,hWnd StartLoop:invoke GetMessage,ADDR msg,NULL,0,0cmp eax, 0je ExitLoopinvoke TranslateMessage, ADDR msginvoke DispatchMessage, ADDR msgjmp StartLoopExitLoop: mov eax,msg.wParamretWinMain endp CBTHookProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD.if (nCode==HCBT_ACTIVATE)invoke SetDlgItemText,wParam,IDYES,CTXT("&Yes")invoke SetDlgItemText,wParam,IDNO ,CTXT("&No")invoke UnhookWindowsHookEx,hHook.endif xor eax,eaxretCBTHookProc endp WndProc proc hWin:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD.if uMsg==WM_CREATEinvoke MessageBox,hWin,CTXT("Hook之前"),CTXT("Test"),MB_ICONINFORMATION or MB_YESNOinvoke SetWindowsHookEx,WH_CBT,addr CBTHookProc,hInstance,NULLmov hHook,eax .if hHook != 0invoke MessageBox,NULL,CTXT("你是帅哥吗?"),CTXT("SC++"),MB_ICONINFORMATION or MB_YESNO.elseinvoke MessageBox,NULL,CTXT("无法安装HOOK"),CTXT("SC++"),MB_ICONINFORMATION or MB_YESNO.endif .elseif uMsg == WM_DESTROYinvoke PostQuitMessage,NULL.elseinvoke DefWindowProc,hWin,uMsg,wParam,lParam.endifretWndProc endp END START Hook之前: Hook之后:
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部