hook 计算机里面一般是指 挂钩某函数, 就是替换掉原来的函数。
inline hook , 是直接在以前的函数替里面修改指令,用一个跳转或者其他指令来达到挂钩的目的。
这是相对普通的hook来说,因为普通的hook只是修改函数的调用地址,而不是在原来的函数体里面做修改。
一般来说 普通的hook比较稳定使用。 inline hook 更加高级一点,一般也跟难以被发现。所以很多人比如病毒制作者都比较推崇inline hook。
静态InlineHook的简单实现
inline hook 是直接在以前的函数替里面修改指令,用一个跳转或者其他指令来达到挂钩的目的。
ssdt是利用api来挂钩的,相当于替换API,用ICESword可以很简单的判断出来。
底下是我在网上看过一篇文章的说的一个比喻,刚好能回答你的问题:
如果说SSDT Hook只是把某位"内核API先生"绑架,然后用我们的“自己人”来接管其工作,而ICESword却可以从其他联系途径找到被绑架的"内核API先生"并“报警”,那么——Inline Hook可以说是给"内核API先生"动了手术,让他成为"我们阵营的一分子"。
呵呵,很幽默的一个比喻
C++实现inline hook,注入后程序异常退出
前文说到使用 基于LIEF的InlineHook实现 ,在这里我们再借助 keystone 和 capstone 来完善一下这个想法,解决一些比较枯燥且容易出错的事,比如 地址偏移的计算,指令备份还原 ...
我这么描述可能还是不直观,直接上IDA看看我们效果
hook之后使用三条指令跳转到 trampolines
[手动狗头].png
你要搞清楚一个概念,DLL被加载后地址是要重定位的,所有的全局变量、函数这些,都会随DLL加载的基址不同,地址会进行对应偏移的。
你WriteProcessMemory那句,往oldFunctionAddr地址写东西,肯定会引起异常的,谁知道被你hook的程序这个地址是啥东西?有没有分配过内存呢?
你要往被注入进程写东西,就必须先用VirtualAllocEx申请内存,你一定要牢记这个概念,所有地址都是动态的,函数、全局变量只有偏移量是固定的。
以上就是关于inline HOOK啥意思的?全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!