net實現InlineHook

inline hook的核心思想是:經過替換目標函數頭部指令實如今函數執行以前跳轉到其餘的指令區域,執行完畢跳轉回到原來的函數,跳轉到的指令區域一般是咱們本身編寫的函數。inline hook技術對於編寫外掛和外掛式補丁意義重大。c++

github:csharp_InlineHookgit

使用net這麼久 ,作InlineHook只能使用c++寫,由於以前使用過c++的clr,因此腦洞一下能夠利用clr看成跳板, 注入咱們的託管dll到目標進程而後幹奇怪的事情。 具體你們能夠看源碼, 我這裏說一說大致實現流程。github

  1. 首先使用c++寫一個跳板,引入固定的託管dll,而後運行該託管dll的指定類方法做爲啓動方法,這裏直接運行是clr ((WeChetHook^)WeChet)->Start(str, Int, Module);函數

  2. 到這裏咱們的託管dll已經注入到目標進程了,能夠直接讀寫宿主內存,注入不注入都能讀寫,因此咱們的關鍵是實現inline hook,對他的任意點hook 回調到託管的函數內部處理,經過net的Marshal.GetDelegateForFunctionPointer方法咱們能夠拿到net方法的函數指針,使用跳板call是能夠成功傳參調用的學習

  3. 到這裏咱們就能夠注入並從託管調用到非託管函數,固然其中的各類調試崩潰這裏就不提了,如今能夠從非託管調用到託管咱們就能夠hook任意點 劫持到跳板再跳到net函數。測試

  4. Inline_Hook.cs1. 接下來的事和跳板不要緊了,所有net實現,首先我簡單實現了一個Inline_Hook.cs,具體原理就不講解了。能夠自行看代碼。指針

  5. 接下來就寫一個demo來測試是否可行,調試

byte[] jmp_inst =
            {
                233,0,0,0,0,//JMP Address
            };
            textBox3.Text = (3212659 + int.Parse(label1.Text)).ToString();//爲了調試直接在窗體拿數據,label1.Text這內容是基址地址,3212659這是hook地址的偏移

            List<byte> byteSource = new List<byte>();
            byteSource.AddRange(new byte[] { 199, 134, 236, 2, 0, 0 });//mov dword [esi+0x000002EC],這裏我以爲有問題我使用了寄存器存須要跳回的地址
            byteSource.AddRange(BitConverter.GetBytes(int.Parse(textBox3.Text) + 5));須要返回的地址
            byteSource.AddRange(jmp_inst);//跳轉模板
            //這部分根據實際狀況填寫
            byteSource.Add(185);//補充替換的彙編指令
            byteSource.AddRange(BitConverter.GetBytes(int.Parse(label1.Text) + 19255272));//補充替換的彙編指令地址

剩下的都在代碼裏面這裏貼一下效果圖 此代碼僅用於研究學習。code

相關文章
相關標籤/搜索