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() // 卸载钩子
本人也是初学者一个,只是为了简单记录一下 有问题欢迎下面留言
网友评论