C# inline-hook / api-hook
2015-07-24 08:14
369 查看
我查阅了一下相关C#方面的资料,却没有发现有提供过关于api-hook方面的资
料包括应用库由此本人编写一套inline-hook的库用于支持x64、x86上的基于在
clr的公共语言,如: c#、c+/clr、vb.net 全部都可以使用该类库改变底层api执
行结果,如我们需要制作抓包工具,或者拦截某个ActiveX对象内部调用的函数
用处广泛 有些人在制作“截包”工具时是通过使用SPI,但也可以通过本技术实现
![](http://img.blog.csdn.net/20150707160602647?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
调用MessageBox.Show("Hello world", "Advapi32")时会跳转到CB_MessageBox函数
MessageBox.Show()这个方法在下层中会调用MessageBoxW函数,不信我们可以试
[csharp] view plaincopy
[DllImport("user32", EntryPoint = "MessageBoxW", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaption, uint uType);
[STAThread]
static void Main(string[] args)
{
InlineHook ich = new InlineHook();
ich.Install(ich.GetProcAddress("user32", "MessageBoxW"), ich.GetProcAddress(new MessageBoxW(CB_MessageBox)));
// MessageBox.Show("Hello world", "Advapi32");
MessageBox(IntPtr.Zero, "Hello world", "Advapi32", 0);
Console.ReadKey(false);
}
试,上面的代码执行后结果与最上面的相同。本类库提供分别需求.net 2 / 4的两种
不同的类库,基本满足开发的需要 不过这一块一直是C++方面的哦不过我相信以后
会是C#做这一块,不过与其等到到时候再提供类库 不如早些提供类库,大家不需要
去研究我类库中怎么去实现的,虽然类库我稍微混淆了一下 不过你们要去学习也不
是很困难,不过我是懒得去讨论在下层怎么实现的 DLL是没有打入版权的信息,很
简单你在属性中看不到任何信息,除了一个内部名称之外没有任何信息,所以你不
必担心 下面是解释InlineHook中导出的函数接口及释义。
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() // 卸载钩子
Sample:
CAT(inline-hook) http://pan.baidu.com/s/1kTKjFPt // 示例地址含类库
每个版本文件夹中都包含x86 / x64两份不同的类库,如果使用本类库有疑惑的地方可以在本人下方留言。
料包括应用库由此本人编写一套inline-hook的库用于支持x64、x86上的基于在
clr的公共语言,如: c#、c+/clr、vb.net 全部都可以使用该类库改变底层api执
行结果,如我们需要制作抓包工具,或者拦截某个ActiveX对象内部调用的函数
用处广泛 有些人在制作“截包”工具时是通过使用SPI,但也可以通过本技术实现
调用MessageBox.Show("Hello world", "Advapi32")时会跳转到CB_MessageBox函数
MessageBox.Show()这个方法在下层中会调用MessageBoxW函数,不信我们可以试
[csharp] view plaincopy
[DllImport("user32", EntryPoint = "MessageBoxW", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaption, uint uType);
[STAThread]
static void Main(string[] args)
{
InlineHook ich = new InlineHook();
ich.Install(ich.GetProcAddress("user32", "MessageBoxW"), ich.GetProcAddress(new MessageBoxW(CB_MessageBox)));
// MessageBox.Show("Hello world", "Advapi32");
MessageBox(IntPtr.Zero, "Hello world", "Advapi32", 0);
Console.ReadKey(false);
}
试,上面的代码执行后结果与最上面的相同。本类库提供分别需求.net 2 / 4的两种
不同的类库,基本满足开发的需要 不过这一块一直是C++方面的哦不过我相信以后
会是C#做这一块,不过与其等到到时候再提供类库 不如早些提供类库,大家不需要
去研究我类库中怎么去实现的,虽然类库我稍微混淆了一下 不过你们要去学习也不
是很困难,不过我是懒得去讨论在下层怎么实现的 DLL是没有打入版权的信息,很
简单你在属性中看不到任何信息,除了一个内部名称之外没有任何信息,所以你不
必担心 下面是解释InlineHook中导出的函数接口及释义。
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() // 卸载钩子
Sample:
CAT(inline-hook) http://pan.baidu.com/s/1kTKjFPt // 示例地址含类库
每个版本文件夹中都包含x86 / x64两份不同的类库,如果使用本类库有疑惑的地方可以在本人下方留言。
相关文章推荐
- C#数组
- C# 通过后台获取浏览器域名
- 【C#】在主线程中取消任务的运行方式
- C#6.0新特性
- C#高级变量_数组
- C#开发ActiveX控件及制作CAB包
- C#语法总结篇---写在开头的部分
- C#高级编程五十二天----有序列表
- C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈
- C#设置默认打印机
- C#解析XML文件
- C# 序列化与反序列化
- C#集合类型总结和性能分析
- c#的中英文混合字符串截取
- C# 结构体 struct
- C# MD5 32位加密 UTF-8编码
- c#调用硬件提供的二次开发函数方法
- csharp: 用Enterprise Library对象实体绑定数据
- C# + Socket断线重连
- C#高级编程五十一天----链表