Open 0xlwoe21k opened 2 years ago
有具体的例子吗?
你可以尝试把 trampoline 的函数多写些操作 让函数体积大些 这样最后的 copy 方式有可能是可以的
http.Client.Do 这次生成的代码在前面有一个单字节跳转,距离 trampoline 太远,没法在原函数里面直接修改位移,延长指令则旧函数空间不够,如果 copy 指令,又刚好原函数里面有一个 call 没法 copy,比较不幸。
不过,你可以用 gohook.HookByIndirectJump 来拦截,这个生成的跳转指令短一些,刚好不会覆盖 jbe 那个指令。
err := gohook.HookByIndirectJmp((*http.Client).Do, doHttp, doHttpTrampoline)
如下代码所示 hook的函数是http.Client.Do()
使用 go 1.16.9编译的可以hook,使用go 1.17.2编译的无法hook,根据官方文档推测,可能是1.17后函数调用基于寄存器,1.16基本栈导致的,请问作者后续有没有打算适配一下呀?