美文网首页UnityEditorunity
[Unity 3d] MonoHooker (RunTime+E

[Unity 3d] MonoHooker (RunTime+E

作者: 雨落随风 | 来源:发表于2019-07-11 23:26 被阅读4次

    一个进程内的代码 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,喜欢记得点赞关注哦!

    相关文章

      网友评论

        本文标题:[Unity 3d] MonoHooker (RunTime+E

        本文链接:https://www.haomeiwen.com/subject/wkzjkctx.html