一个进程内的代码 Hook 工具,汇编级别非元数据处理,非反射相关。
GitHub 上的工程多如繁星,有些好的仓库,但凡不经意间错过了就很难找回,故稍作采撷,希望能帮助到有心人。
简介:
笔者今天推荐的仓库叫 MonoHooker - Unity Hook 工具。
无需修改 Dll 代码就能替换方法逻辑执行流程。编辑器下轻松掰弯UnityEditor等dll内的逻辑。
功能:
- 运行时直接修改内存中的 jit 代码,不会修改 dll 文件
- 不影响调试。
- 同时支持 .net 2.x 与 .net 4.x。
- 目前测试支持 unity4.7.2, unity5.x, unity 2017 与 unity 2018。
- 使用方便,在C#内定义签名与原始方法相同的两个方法然后注册一下就能用了。
- 目前已支持 Android Mono, Windows Mono/IL2CPP
使用:
[DidReloadScripts] // 最好脚本加载完毕就 hook
static void InstallHook()
{
if(_hooker == null)
{
Type type = Type.GetType("UnityEditor.LogEntries,UnityEditor.dll");
// 找到需要 Hook 的方法
MethodInfo miTarget = type.GetMethod("Clear", BindingFlags.Static | BindingFlags.Public);
type = typeof(PinnedLog);
// 找到被替换成的新方法
MethodInfo miReplacement = type.GetMethod("NewClearLog", BindingFlags.Static | BindingFlags.NonPublic);
// 这个方法是用来调用原始方法的
MethodInfo miProxy = type.GetMethod("ProxyClearLog", BindingFlags.Static | BindingFlags.NonPublic);
// 创建一个 Hooker 并 Install 就OK啦, 之后无论哪个代码再调用原始方法都会重定向到
// 我们写的方法ヾ(゚∀゚ゞ)
_hooker = new MethodHooker(miTarget, miReplacement, miProxy);
_hooker.Install();
}
}
演示:
MonoHooker链接:
easy66/MonoHooker: hook C# method at runtime without modify dll file (such as UnityEditor.dll)
结语:
敲黑板!这个是JIT 汇编级别的基于指针偏移原理的Hook技术哦,希望对这些概念有兴趣的可以深入下去呢!
扩展阅读:
本文集持续更新ing,喜欢记得点赞关注哦!
网友评论