一個進(jìn)程內(nèi)的代碼 Hook 工具,匯編級別非元數(shù)據(jù)處理,非反射相關(guān)舔示。
GitHub 上的工程多如繁星借杰,有些好的倉庫过吻,但凡不經(jīng)意間錯過了就很難找回,故稍作采擷蔗衡,希望能幫助到有心人纤虽。
簡介:
筆者今天推薦的倉庫叫 MonoHooker - Unity Hook 工具。
無需修改 Dll 代碼就能替換方法邏輯執(zhí)行流程绞惦。編輯器下輕松掰彎UnityEditor等dll內(nèi)的邏輯逼纸。
功能:
- 運(yùn)行時直接修改內(nèi)存中的 jit 代碼,不會修改 dll 文件
- 不影響調(diào)試济蝉。
- 同時支持 .net 2.x 與 .net 4.x杰刽。
- 目前測試支持 unity4.7.2, unity5.x, unity 2017 與 unity 2018菠发。
- 使用方便,在C#內(nèi)定義簽名與原始方法相同的兩個方法然后注冊一下就能用了贺嫂。
- 目前已支持 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);
// 這個方法是用來調(diào)用原始方法的
MethodInfo miProxy = type.GetMethod("ProxyClearLog", BindingFlags.Static | BindingFlags.NonPublic);
// 創(chuàng)建一個 Hooker 并 Install 就OK啦, 之后無論哪個代碼再調(diào)用原始方法都會重定向到
// 我們寫的方法ヾ(???ゞ)
_hooker = new MethodHooker(miTarget, miReplacement, miProxy);
_hooker.Install();
}
}
演示:
MonoHooker
鏈接:
easy66/MonoHooker: hook C# method at runtime without modify dll file (such as UnityEditor.dll)
結(jié)語:
敲黑板滓鸠!這個是JIT 匯編級別的基于指針偏移原理的Hook技術(shù)哦,希望對這些概念有興趣的可以深入下去呢涝婉!
擴(kuò)展閱讀:
本文集持續(xù)更新ing哥力,喜歡記得點(diǎn)贊關(guān)注哦!