c#HookApi MessageBoxW 简单示例

Hook是一个针对程序执行过程中挂钩技术。它主要用来拦截一些数据,并对这些数据进行处理,此时,程序转到我们的Hook代码,我们拥有整个程序的执行权限,我们可以选择跳过此处,也可以选择修改数据,或者出错退出程序等等。
public partial class Form1 : Form
{
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
delegate int DMyMessage(IntPtr ptr, string text, string cap, uint option);

    [DllImport("user32", EntryPoint = "MessageBoxW", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaption, uint uType);

    public Form1()
    {
        InitializeComponent();
    }
    InlineHook ich = new InlineHook();
    private void button2_Click(object sender, EventArgs e)
    {
        
        IntPtr ptr = Marshal.GetFunctionPointerForDelegate(new DMyMessage(MyMessage)); //这边是为了取得我们自己定义的函数的地址
        ich.Install(ich.GetProcAddress("user32", "MessageBoxW"), ptr);///hook安装 拦截

    }
    /// 
    /// 拦截后跳转到的函数
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    int MyMessage(IntPtr ptr, string text, string cap, uint option)
    {
        ich.Suspend();  为什么这里要暂停呢 因为我们下面一句代码会调用到这个api 如果我们不暂停Hook 就如进入死循环了
        var result= MessageBox(ptr, "消息框被拦截了", cap, option); //弹出我们指定的消息框 告诉调用者被拦截了
        ich.Resume();弹出完 我们指定的消息框 后 再继续恢复hook 继续拦截
        return result;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //这边是弹出信息框按钮
        System.Windows.Forms.MessageBox.Show("Test");  //会被拦截
    }

    private void button3_Click(object sender, EventArgs e)
    {
        //卸载hook 取消拦截
        ich.Uninstall();
    }
}
image.png

我这边用的是winform编写 感觉会更加直观一点

比如我们想拦截MessageBox.Show()方法
在c#中实际 MessageBox.Show()方法 就是调用的 MessageBoxW api
所以我们可以通过Hook MessageBoxW 这个api 来实现拦截

我们这个例子是hook自身,对外部程序是么有效果的
如果我们想hook指定外部程序 可以使用注入方式 下次再发布
还有一种hook方式 是全局hook 大家有兴趣的话 可以百度自行了解

该注释的地方我基本都注释了 起码得对win32api有所了解

CAT(inline-hook) http://pan.baidu.com/s/1kTKjFPt // 示例地址含类库 这是hook类库 转自(http://www.cnblogs.com/gc2013/)
博客
介绍一下 类库中的几个方法意思

InlineHook.GetProcAddress(string strLibraryName, string strMethodName) // 取函数地址(库文件, 函数名)

InlineHook.GetProcAddress(System.Delegate d) // 取函数地址(有效委托)

InlineHook.Install(System.IntPtr oldMethodAddress, System.IntPtr newMethodAddress) // 安装钩子(源函数地址, 新函数地址)

InlineHook.Resume() // 恢复钩子

InlineHook.Suspend() // 挂起钩子

InlineHook.Uninstall() // 卸载钩子

本人也是初学者一个,只是为了简单记录一下 有问题欢迎下面留言

你可能感兴趣的:(c#HookApi MessageBoxW 简单示例)