美文网首页
c#HookApi MessageBoxW 简单示例

c#HookApi MessageBoxW 简单示例

作者: DF_Sky | 来源:发表于2018-07-26 09:36 被阅读0次

    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安装 拦截
    
        }
        /// <summary>
        /// 拦截后跳转到的函数
        /// </summary>
        /// <param name="ptr"></param>
        /// <param name="text"></param>
        /// <param name="cap"></param>
        /// <param name="option"></param>
        /// <returns></returns>
        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 简单示例

          本文链接:https://www.haomeiwen.com/subject/tgyvmftx.html