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

相关文章
相关标签/搜索