DotNetDetour - 万能的开源 .NET 代码 Hook 神器
内容提要
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写的反汇编库。