Windows黑客基础(1):Hook本进程的消息
2013-06-09 16:40
387 查看
1.需要用到的函数
学过Windows编程的应该都知道,Windows的核心机制是消息机制,消息是操作系统告诉应用程序发生了什么事情,比如当用户移动了鼠标或者按键后,操作系统会通知应用程序
实际上在Windows下,我们可以监控操作系统发送给另外一个进程的消息,然后决定对这个消息怎么处理,比如继续发送,或者改变消息,或者不让这个消息发给应用程序,也可以让应用程序处理完消息后通知监控的进程 这些都依赖一个API,SetWindowsHookEx
2.截取本进程的消息
1.创建项目
我们用VS创建一个WIN32项目,这样就默认给我们创建了一个接收消息的窗口,具体过程如下 (VS2008环境下):
文件->新建项目->选择WIN32项目,并且输入名称->点击确定
进入向导后,直接点击完成,这样就创建了一个WIN32的默认项目,当然为了调试方便,我们需要对一些设置进行更改
选中项目的属性,选择配置属性->链接器->系统->子系统,选择控制台
这样做的目的是为了方便我们可以直接利用cout输出调试信息
2.进行设置,方便调试
设置完成后编译会无法通过,因为WIN32项目默认main函数跟C++的main函数不一样,所以我们需要对main函数进行改造,将函数原型改成C++的默认形式后,通过GetModuleHandle获得本进程的hInstance,就可以了
接下来我们在Windows的消息处理函数里面增加处理KEYBOARD的代码:
接下来只要在程序开头调用我们的函数:
在程序调用SetHook后,就能拦截到我们进程的键盘消息
对于截取本进程的消息,代码并不复杂,10+行的代码就能拦截本进程的键盘消息,消息类型很多种,还有DEBUG消息,MOUSE消息等,都可以进行拦截
学过Windows编程的应该都知道,Windows的核心机制是消息机制,消息是操作系统告诉应用程序发生了什么事情,比如当用户移动了鼠标或者按键后,操作系统会通知应用程序
实际上在Windows下,我们可以监控操作系统发送给另外一个进程的消息,然后决定对这个消息怎么处理,比如继续发送,或者改变消息,或者不让这个消息发给应用程序,也可以让应用程序处理完消息后通知监控的进程 这些都依赖一个API,SetWindowsHookEx
HHOOK WINAPI SetWindowsHookEx( _In_ int idHook, _In_ HOOKPROC lpfn, _In_ HINSTANCE hMod, _In_ DWORD dwThreadId ); idHook就是我们要监控的消息类型 lpfn是当我们收到这个消息后,要交给哪个函数去处理,函数的类型是HOOKPROC,这个函数定义在winuser.h里面,原型是 typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam); hMod是我们函数所在模块,如果我们的函数是在DLL里面,那么我们需要两个API,一个是Loadlibrary,一个是GetProcAddress,前者映射一个DLL到我们的进程里面,后者则是从一个DLL 返回我们所需要的函数 dwThreadID是我们要监视的线程ID,如果是0的话就是系统钩子,也就是我们监视的进程所有消息都会获取 详细的解释请参考MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx 在我们截取到监视的进程的消息后,我们可以调用CallNextHookEx来将消息继续传递,当然也可以选择不让消息继续传递,如果我们不喜欢将该消息传递给监视的进程,就在函数里面return 1 ,如果要把他发送给监视的进程,就return 0
2.截取本进程的消息
1.创建项目
我们用VS创建一个WIN32项目,这样就默认给我们创建了一个接收消息的窗口,具体过程如下 (VS2008环境下):
文件->新建项目->选择WIN32项目,并且输入名称->点击确定
进入向导后,直接点击完成,这样就创建了一个WIN32的默认项目,当然为了调试方便,我们需要对一些设置进行更改
选中项目的属性,选择配置属性->链接器->系统->子系统,选择控制台
这样做的目的是为了方便我们可以直接利用cout输出调试信息
2.进行设置,方便调试
设置完成后编译会无法通过,因为WIN32项目默认main函数跟C++的main函数不一样,所以我们需要对main函数进行改造,将函数原型改成C++的默认形式后,通过GetModuleHandle获得本进程的hInstance,就可以了
接下来我们在Windows的消息处理函数里面增加处理KEYBOARD的代码:
case WM_KEYDOWN: printf("按下按键\n"); break;
接下来只要在程序开头调用我们的函数:
LRESULT CALLBACK KeyboardProc(int nCodec,WPARAM wParam,LPARAM lParam) { cout<<"截取到键盘消息"<<endl; return 1; //return CallNextHookEx(hkb,nCodec,wParam,lParam); } void SetHook(HINSTANCE hMoudle) { hkb = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardProc, hMoudle, 0); }
在程序调用SetHook后,就能拦截到我们进程的键盘消息
对于截取本进程的消息,代码并不复杂,10+行的代码就能拦截本进程的键盘消息,消息类型很多种,还有DEBUG消息,MOUSE消息等,都可以进行拦截
相关文章推荐
- Windows黑客基础(2):获取其他进程的HANDLE
- WINDOWS黑客基础(4):查找进程运行的基址
- windows 消息 hook
- windows基础应用程序编程(七)鼠标消息
- windows 消息大全 与 虚拟键列表 HOOK专题
- windows进程通信之消息和WM_COPYDATA
- .Net下的进程间的通讯 -- Windows消息队列
- 31 windows_31_ProcBase 进程基础
- 进程通信(用户自定义消息,用户注册消息,windows剪贴板,WM_COPY, 内存映射,对目标进程的内存)
- Win32 SDK基础(9)—— Windows 常用消息大全
- Windows - Hook键盘和鼠标消息
- windows基础应用程序编程(六)键盘消息
- windows基础编程----第三篇(窗口的消息处理机制)
- linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存
- MFC学习笔记3 Windows编程基础--DialogBox、回调、消息、控件
- windows Hook 消息分类
- Windows程序设计零基础自学_1_Windows程序消息循环机制
- Hook技术之消息拦截(Windows Hook )
- (转)进程通信(用户自定义消息,用户注册消息,windows剪贴板,WM_COPY, 内存映射,对目标进程的内存)
- Win32 SDK基础(10)—— 几种常见的Windows消息处理