C++ Builder实现MessageBox拦截

来源:互联网 发布:windows用mac的硬盘 编辑:程序博客网 时间:2024/05/18 01:14

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文件考到上述中某个文件夹下面试试。

0 0
原创粉丝点击