Hook编程 callnexthookex返回值

一、下面我们来创建一个屏蔽鼠标过程的hook:1.创建基于MFC的一个InnerHook工程项目2.在BOOLCInnerHookerDlg::OnInitDialog()中添加hookSetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());要获得当前线程句柄,使用函数DWORD GetCurrentThreadId(void);3.实现鼠标过程MouseProc为:LRESULTCALLBACK MouseProc(intnCode,WPARAMwParam,LPARAMlParam){return1;//返回值为一表示屏蔽鼠标过程}二、如果要屏蔽键盘消息,可以添加如下代码1.在CPP文件中添加一个变量:HHOOKg_hKeyBoard;2.在CInnerHookerDlg::OnInitDialog()中添加hookg_hKeyBoard=SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,NULL,GetCurrentThreadId());3.实现键盘过程keybroadProc为(只屏蔽空格键):4.下边添加代码使程序在F2键按下后退出。要关闭窗口,首先要获得窗口的句柄,先声明一个全局变量Hwnd g_hWnd,在OnInitDialog()中把窗口句柄传给它:g_hWnd=m_hWnd;接下来为键盘钩子过程添加代码:这时我们只能屏蔽主线程的键盘消息,如果要屏蔽所有消息,就得把代码放到动态链接库中实现。三、屏蔽所有线程的消息首先要创建一个动态链接库1.新建一个Win32 Dynamic-LinkLibrary项目工程Hook得到动态链接库模块的句柄有两种方式:方法1。DllMain函数方式:HMODULE和HINSTANCE可以通用方法2。GetModuleHandle函数方式SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);//这个值为0,这个安装的钩子过程将于桌面上运行的所有线程都相关。这样我们所安装的钩子过程就和运行在同一个桌面上的所有进程相关了2.编写MouseProc()3.之后新建一个模块文件Hook.def,添加代码:LIBRARYHookEXPORTSSetHook@2//@2用来指定序号。4.编译生成dll文件接下来新建一个工程,用来测试刚才的DLL首先安装一个鼠标Hook屏蔽所有的鼠标消息。1.新建一个基于MFC对话框的项目工程HookTest2.在BOOLCHookTestDlg::OnInitDialog()前声明SetHook函数_declspec(dllimport) void SetHook();3.在Setting对话框的Link选项卡的,添加库文件:..HookDebugHook.lib4.在OnInitDialog()中调用 SetHook();5.将生成好的动态链接库拷贝到测试程序项目工程目录下面。调试运行,你会发现你的鼠标坏了,所有的鼠标操作都被屏蔽了。然后安装一个键盘Hook,我们可以按照刚才所做键盘Hook的过程在动态链接库中也做一个Hook,这是需要给SetHook带上参数HWND hwnd.在测试程序中要把函数也带上参数,并给SetHook传入窗口句柄 SetHook(m_hWnd)。接着,让程序窗口始终在其他窗口之前,而且将它最大化,从而使用户不能切换到窗口。可以使用SetWindowPos函数BOOLSetWindowPos(HWNDhWndInsertAfter,intX,intY,intcx,intcy,UINTuFlags);A windowcan be moved to the top of the Z-order either by setting thepWndInsertAfter parameterto &wndTopMost and ensuringthat the SWP_NOZORDER flagis not set or by setting a window’s Z-order so that it is above anyexisting topmost windows. When a nontopmost window is made topmost,its owned windows are also made topmost. Its owners are notchanged.得到窗口的大小,可以使用函数GetSystemMetricsintGetSystemMetrics(int nIndex);代码:intcxScreen,cyScreen;cxScreen=GetSystemMetrics(SM_CXSCREEN);cyScreen=GetSystemMetrics(SM_CYSCREEN);SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);SetHook(m_hWnd);因为第一个参数设置为&wndTopMost,这时程序始终处于顶层窗口,不管怎样切换窗口,我们的窗口显示在最前面。四、如何实现在切换到其他线程时,也能响应F2退出程序在程序中,我们屏蔽了鼠标和键盘,但是我们留下了一个退出程序的后门(F2)。前面讲过动态链接库共享性的原理,多个进程可以共享同一份代码与数据页,按道理切换到其它线程之后,按下F2应该也可以退出程序才对,但是发现当切换到其他程序后,再按F2 程序不会退出,这是因为系统的页面拷贝机制,如果系统发现被某线程要修改某个数据页面,它就会先拷贝一份页面数据,再对新的页面数据进行修改,其它没有更新数据的线程继续使用旧的页面数据。比如:SetHook(HWND hwnd)中将形参传递给了一个全局变量g_hWnd,那么调用SetHook的线程将使用新的存放了hwnd的数据页面,而其它的线程继续使用旧的数据页面,所以在其它线程成为活动窗口的时候,按下F2时,因为没有g_hWnd没有传递到hwnd窗口,所以按下F2没有反应。我们可以通过创建一个新的节,将全局变量放到这个节当中,然后将这个节设置为一个共享的节,这样全局变量就可以在多个线程间共享,从而使切换到其他线程时也能按下F2退出程序。要显示动态链接库的节,可以使用命令行:dumpbin-headersHook.dll如何创建一个新的节?如果确实想在其他程序窗口下关闭我们的程序窗口,可以把共享窗口句柄,使系统不再进行页面拷贝,方法是使用下面语句把窗口句柄设为共享:#pragmadata_seg("MySec")//MySec是新创建的节的名字(不能超过8个字节)HWNDg_hWnd=NULL;//新变量必须初始化,否则没有新建节的信息#pragmadata_seg()//以上为新建节新创建的节共享以后才有效,共享节有两种方法:1.#pragmacomment(linker,"/section:MySec,RWS")//设置节的属性,读,写,共享2.也可以把#pragma comment(linker,"/section:MySec,RWS")省略。在Hook.def中添加如下代码:SEGMENTSMySecread write shared也能对节的属性进行设置把SetWindowsHookEx函数的第一个参数设为WH_GETMESSAGE,能够破解密码。使用Hook时要小心。

Hook编程 callnexthookex返回值
  

爱华网本文地址 » http://www.413yy.cn/a/25101016/306826.html

更多阅读

SQL中EXISTS怎么用 sql exists in的区别

SQL中EXISTS怎么用——简介EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或FalseSQL中EXISTS怎么用——方法/步骤SQL中EXISTS怎么用 1、EXISTS用于检查子查询是否至少会返回一行数据,该

函数指针返回指向函数的指针 指向函数的指针

准确地讲,本文所涉及的内容是C++中较难理解的,本文的目的不是在于将它们解释清楚,因为这需要你循序渐进地做很多练习才可以。看下面一个例子:int (*func(bool real))(int, int) 你觉得它的返回值是什么?这里就涉及到了如何理解指向函数

命令提示符cmd 中的tracert命令详解 精 tracert 返回值详解

命令提示符(cmd)中的tracert命令详解 精——简介tracert也被称为Windows路由跟踪实用程序,在命令提示符(cmd)中使用tracert命令可以用于确定IP数据包访问目标时所选择的路径。本文主要探讨了tracert命令的各个功能。命令提示符(cmd)中的tr

声明:《Hook编程 callnexthookex返回值》为网友我是定期发光分享!如侵犯到您的合法权益请联系我们删除