#ifndef _HOOKAPI_H
#define _HOOKAPI_H class CHOOKAPI {
public: LPVOID  pOldFunEntry, pNewFunEntry ;    // 初始函数地址、HOOK后的函数地址 BYTE   bOldByte[5], bNewByte[5] ;      // 原始字节、目标字节 public: CHOOKAPI () {} ~CHOOKAPI() {} // 实现HOOK API void Hook ( PSTR szModuleName, PSTR szFunName, FARPROC pFun ) {     HMODULE    hMod = ::GetModuleHandleA ( szModuleName ) ; if ( hMod != NULL ) { pNewFunEntry   = (LPVOID)pFun ; pOldFunEntry  = (LPVOID)GetProcAddress ( hMod, szFunName ) ; bNewByte[0]     = 0xE9 ; *((PDWORD)(&(bNewByte[1])))   = (DWORD)pNewFunEntry - (DWORD)pOldFunEntry - 5 ;  DWORD   dwProtect, dwWriteByte, dwReadByte ;  VirtualProtect ( (LPVOID)pOldFunEntry, 5, PAGE_READWRITE, &dwProtect ); ReadProcessMemory ( GetCurrentProcess(), (LPVOID)pOldFunEntry, bOldByte, 5, &dwReadByte ) ;        WriteProcessMemory ( GetCurrentProcess(), (LPVOID)pOldFunEntry, bNewByte, 5, &dwWriteByte ) ; VirtualProtect ( (LPVOID)pOldFunEntry, 5, dwProtect, NULL ) ; } } // 重新HOOK void ReHook () { DWORD   dwProtect, dwWriteByte ; VirtualProtect ( pOldFunEntry, 5, PAGE_READWRITE, &dwProtect ); WriteProcessMemory ( GetCurrentProcess(), pOldFunEntry, bNewByte, 5, &dwWriteByte ) ; VirtualProtect ( pOldFunEntry, 5, dwProtect, NULL ) ; } // 撤消HOOK void UnHook () { DWORD dwProtect, dwWriteByte ; VirtualProtect ( pOldFunEntry, 5, PAGE_READWRITE, &dwProtect ); WriteProcessMemory ( GetCurrentProcess(), pOldFunEntry, bOldByte, 5, &dwWriteByte ) ; VirtualProtect ( pOldFunEntry, 5, dwProtect, NULL ) ; }
} ; #endif
#include <windows.h>
#include "HookApi.h"   CHOOKAPI    HookItem ;   // 定义MessageBoxA函数原型
typedef int (WINAPI* PFNMessageBoxA)( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType ) ;   // 自定义的MessageBoxA函数
// 实现对原始MessageBoxA的输入、输出参数的监控,甚至是取消调用
int WINAPI NEW_MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType )
{   // 撤消HOOK   HookItem.UnHook () ;   // 此处可以观察/修改调用参数,甚至可以取消调用直接返回。   // ……   // 取得原函数地址   PFNMessageBoxA pfnMessageBoxA = (PFNMessageBoxA)HookItem.pOldFunEntry ;   // 调用原函数,修改输入参数   int ret = pfnMessageBoxA ( hWnd, "这是HOOK函数过程的消息框", "[测试]", uType ) ;   // 此处可以查看/修改调用原函数的返回值   // ……   // 重新HOOK   HookItem.ReHook () ;   return ret ;
}   int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{   // 原始API   MessageBoxA ( 0, "正常消息框", "测试", 0 ) ;   // HOOK API   HookItem.Hook ( "USER32.dll", "MessageBoxA", (FARPROC)NEW_MessageBoxA ) ;   // 调用API,测试   MessageBoxA ( 0, "正常消息框", "测试", 0 ) ;   // 撤消HOOK   HookItem.UnHook () ;   return 0 ;
}   

转载于:https://www.cnblogs.com/new0801/archive/2012/10/09/6177704.html

VC++实现全局钩子勾住消息对话框相关推荐

  1. VC++实现全局钩子勾住textout金山快译的原理实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 大家都对 ...

  2. VC++ Hook截取鼠标点击窗口消息的问题!全局钩子

    VC++ Hook截取鼠标点击窗口消息的问题!全局钩子,高手进! 悬赏分:0 - 提问时间: 2010年05月19日 06时20分 我在做毕业设计,现在遇到一个问题,像求教高手: 我想实现如下功能,当 ...

  3. MFC 全局钩子dll注入监听键盘消息

    MFC自带的键盘监听功能只有焦点在MFC程序界面时才能监听键盘消息,要想在MFC程序界面外监听键盘消息,可以通过DLL注入使用全局钩子来监听.首先,通过Visual Studio生成全局钩子的动态库, ...

  4. Windows 全局钩子 Hook 详解

    监控程序的实现       我们发现一些木马或其他病毒程序常常会将我们的键盘或鼠标的操作消息记录下来然后再将它发到他们指定的地方以实现监听.这种功能其他是利用了全局钩子将鼠标或键盘消息进行了截取,从而 ...

  5. 通过全局钩子发送自定义消息,实现进程通信

    利用钩子进行进程通信,在网上搜了许多帖子还是不明所以. 没办法自己摸索了4,5天终于测试好了代码.写下来,希望不要有人像我这样云里雾里的在这上面浪费时间. 钩子的加载 使用函数SetWindowsHo ...

  6. [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入

    [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入 [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入 [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入 1.扫描枪获取数据原理基本 ...

  7. 练习 进程钩子 全局钩子

    C++ 关于钩子的知识点博客网上基本写的都非常详细,这里只是简单分享一下本人练手的编程步骤和一些简单认识. 钩子程序就大概分成了2种: (1) 进程中的钩子:它 的作用范围只是限定在某个进程中,或者某 ...

  8. VC下win32钩子

    一.引言 钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统.钩子的种类很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息.得到对此 ...

  9. 用键盘全局钩子[Hook]监视多进程键盘操作

    用键盘全局钩子[Hook]监视多进程键盘操作 闲来无事,在WIN2K下用BCB5做了个键盘挂钩小程序,监视全局按键情况.Hook安放和回调函数放在一个单独DLL中,DLL原码如下: //------- ...

最新文章

  1. React 虚拟Dom 转成 真实Dom 实现原理
  2. html中加盒子,在HTML中各类型盒子的基线应如何确定
  3. 2018.5.18信息安全铁人三项赛数据赛复现
  4. UOJ #584. 天天去哪吃
  5. C#编写不安全代码初探
  6. hessian、rmi、dubbo与rpc关系
  7. python3爬取中国药学科学数据
  8. GrideView(三)---编辑功能实现
  9. vasp软件linux,QVASP 是一款 VASP 的辅助软件
  10. 小莫qq影视机器人-自定义对接影视教程
  11. 解决虚拟机IP地址无法获取和网络无法连接
  12. 基于anyrtc的sdk实现直播连麦互动
  13. R 下载GEO数据总是超时
  14. python 期货现货差价监测_数字货币期货现货差价监控
  15. 爱德泰科普 | 电信级单模光纤跳线在综合布线中的连接方法
  16. 电子专业英语(持续更新)
  17. 【Linux】Shell脚本中如何使用“循环”遍历“数组”中的元素(包括MySQL的常用指令介绍)
  18. Anacoda的用途
  19. 支付宝里程怎么用 支付宝里程兑换在哪里
  20. 拼多多批发业务能做成吗?

热门文章

  1. idea中启动tomcat,控制台中文乱码问题解决方案
  2. SSM框架之Spring MVC(三)http响应、文件上传
  3. python学习--关注容易被忽略的知识点--(三)高级特性
  4. shell for循环命令行_24 道 shell 脚本面试题
  5. Android App应用包增量升级(one)
  6. (转)Managed DirectX +C# 开发(入门篇)(五)
  7. hadoop 关闭datanode节点时发生异常:no datanode to stop
  8. 那些配置修改之后需要重新启动
  9. Spark面试术语总结
  10. 会c 学plc编程语言,想学PLC编程?先弄清5种PLC专用语言!