C++ Builder实现MessageBox拦截

原创 2015年11月20日 18:30:21

MessageBox分为MessageBoxA和MessageBoxW两种方法,若要完全拦截MessageBox需要实现两个方法;

基本原理可以参考下面的博客:

http://blog.csdn.net/friendan/article/details/12224481

这篇文章是在C++Builder 6环境下实现APIHOOK拦截MessageBox

界面如下:


开始按钮:加载鼠标钩子

结束按钮:卸载鼠标钩子

调用MessageBoxA:调用一个自己写的MessageBoxA

调用MessageBoxW:调用一个自己写的MessageBoxW

未安装钩子前:



安装钩子后:



下面说一下代码:

测试界面要注意的是如何调用MessageBoxW,第二个参数和第三个参数均为wchar_t *,所以需要做一次转换

char *CStr = "正常的MessageBoxW";
    int len = MultiByteToWideChar(CP_ACP,0,CStr,strlen(CStr),NULL,0);
    wchar_t* m_wchar = new wchar_t[len+1];
    MultiByteToWideChar(CP_ACP,0,CStr,strlen(CStr),m_wchar,len);
    m_wchar[len] = '\0';


    char *CStr1 = "提示对话框二";
    int len1 = MultiByteToWideChar(CP_ACP,0,CStr1,strlen(CStr),NULL,0);
    wchar_t* m_wchar1 = new wchar_t[len1+1];
    MultiByteToWideChar(CP_ACP,0,CStr1,strlen(CStr),m_wchar1,len1);
    m_wchar1[len1] = '\0';


    MessageBoxW(Handle,m_wchar,m_wchar1,MB_OK);


DLL结构如下:


定义了一个THookClass通用类,可以通过API陷入方式实现拦截,这样就不需要重复写多个方法分别实现MessageBoxA和MessageBoxW了。

class THookClass{
private:
    HANDLE hProcess;
    bool AreadlyHook;
    BYTE Oldcode[5];//保存API入口处代码
    BYTE Newcode[5];//JMP XXXX
    DWORD IdOld,IdNew;
public:
    FARPROC OldFunction,NewFunction;
    THookClass(){};
    THookClass(FARPROC OldFun,FARPROC NewFun);
    ~THookClass();
    void Restore();//停止HOOK
    void Change();//开始HOOK
};

源码下载地址:http://pan.baidu.com/s/1o6xSzOY


发现代码有问题,之前拦截的MessageBoxA消息仅限于本进程,根本不是全局的,修改了一下代码可以拦截全局MessageBox消息

源码下载如下:http://pan.baidu.com/s/1ntivCG5

使用C++builder打开代码重新编译时可能会报错


提示无法加载THookClass,这里可以打开项目的路径信息:


在Include path路径下无法加载到THookClass,没什么好的办法,新建一个项目把代码拷过去或者可以试试把THookClass.cpp文件考到上述中某个文件夹下面试试。

HOOK所有程序的MessageBox

这篇文章用到的HOOK代码,跟我的前一篇文章【HOOK API入门之Hook自己程序的MessageBoxW】差不多, 其地址是:http://blog.csdn.net/friendan/artic...
  • friendan
  • friendan
  • 2013年10月01日 22:31
  • 11088

设计模式之Builder模式 (C++实现)

刚开始我一直感觉建造者模式不太好懂,也许是我笨了点缘故,勤能补拙嘛,所以只能多看多想了 大话设计模式里面那个对于建造者模式我讲解,个人感觉不太好理解,我是看了很多遍也没体会到那样设计的精髓,后来在另...
  • i_like_cpp
  • i_like_cpp
  • 2013年05月30日 10:26
  • 2837

c++builder使用Windows系统提供的IP控件

本文是ccrun(老妖)根据偶然间看到的一篇文章略作修改而成。参考资料: 标题:在Delphi中使用IP控件 作者:西安交通大学9649# 刘明华 在些对原作者的无私奉献表示感谢!如欲转载请保留...
  • lz465350
  • lz465350
  • 2014年11月12日 10:45
  • 626

MessageBox所有图标样例

对话框的名称就是对应的图标名称: MessageBoxIcon: 所有图标样式 MessageBoxIcon.Question MessageBoxIcon.As...
  • huanglin529
  • huanglin529
  • 2017年04月19日 13:39
  • 613

C++ Builder VCL库函数简介

一.BORLAND C++ BUILDER VCL的内存管理函数   1. AllocMem   在队中分配指定字节的内存块,并将分配的每一个字节初始化为 0.函数原型如下:   void ...
  • lixingshi
  • lixingshi
  • 2014年11月18日 10:12
  • 895

使用 C++ Builder 创建应用程序

3.1 创建应用程序 C++Builder的主要用途于设计创建Windows应用程序。有三种基本的Windows应用程序: · WindowsGUI应用程序。 · 控制面板应用程序。 · 服务应用程序...
  • u010984552
  • u010984552
  • 2016年08月19日 20:18
  • 2050

C++builder(Xe5)下加载VC动态库的两种方法

这里分为两种方式:动态加载的
  • JohnnyHu90
  • JohnnyHu90
  • 2014年10月17日 13:08
  • 3581

C++ Builder初学问与答

一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另...
  • wozengcong
  • wozengcong
  • 2014年01月04日 16:44
  • 1496

在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)

在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过) Socket api Clie...
  • enjoy0104
  • enjoy0104
  • 2015年04月21日 01:05
  • 1083

C++ builder 添加资源文件

最近在研究BCB中资源文件的嵌入,找到一些资料,整理了一下,写下来供参考。    资源文件是一个以.rc结尾的文本文件,RC是资源脚本(Resource   Script)的意思,它的格式很简单,每...
  • Anton8801
  • Anton8801
  • 2016年05月20日 14:03
  • 925
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ Builder实现MessageBox拦截
举报原因:
原因补充:

(最多只允许输入30个字)