DotNetDetour - 万能的开源 .NET 代码 Hook 神器

💡 原文中文,约9700字,阅读约需24分钟。
📝

内容提要

DotNetDetour是一个用于.net方法hook的类库,支持32bit和64bit的.net程序,支持静态方法、实例方法、属性方法、泛型类型的方法、泛型方法的hook,支持.net基础类库方法的hook。作者通过inline hook的方式,修改函数的前5字节指令为jmp xxxxxxxx来实现hook。在64位下,作者通过动态拼接汇编指令的方式实现原函数的调用。作者用C#重写了一个C写的反汇编库,证明了C#支持指针和结构体,基础类型非常丰富。作者的项目地址为https://github.com/bigbaldy1128/DotNetDetour。

🎯

关键要点

  • DotNetDetour是一个用于.net方法hook的类库,支持32bit和64bit的.net程序。

  • 支持静态方法、实例方法、属性方法、泛型类型的方法、泛型方法的hook。

  • 支持.net基础类库方法的hook,且无任何性能影响,无需改动被hook的方法源码。

  • 使用IMethodHook接口实现hook方法,并通过特性标记要hook的方法。

  • 普通方法hook和异步方法hook的实现方式相似,异步方法需用async修饰并返回Task类型。

  • 属性hook通过标记get方法实现,可能会因编译优化而不执行hook代码。

  • 构造方法hook通过返回void的方法实现,需在HookMethod中设置targetMethodName为.ctor。

  • 泛型类的方法hook需对具体类型进行hook,值类型和引用类型需分别处理。

  • 实现原理采用inline hook方式,通过修改函数前5字节指令为jmp实现hook。

  • 在64位下,通过动态拼接汇编指令实现原函数的调用,使用Marshal.AllocHGlobal分配非托管空间。

  • C#支持指针和结构体,基础类型丰富,作者用C#重写了一个C写的反汇编库。

➡️

继续阅读