用户态rootkit之inline hook

前言

Rootkit是我从大一就听说过的技术,不过那个时候几乎是0基础,也完全不懂这是个什么玩意儿,其实到现在我也不懂rootkit是如何修改内核层和隐藏自己的,不过最近在学习用户态的rootkit,倒是了解了一番,做个笔记。

 

用户态Rootkit的种类

首先我了解的用户态的rootkit是分为两种,一种是IAT hook,还有一种就是inline hook。解释一下,rootkit不同于其他恶意代码的地方简单的说,我的理解就是可以非常好的隐藏自己,所以在rootkit中会用到一种常见的技术叫做hook技术。

 

IAT hook

这种方法是比较容易理解的,因为在windows系统中,每一个程序都会有导入表,导出表,而程序调用一些函数也是通过导入表,然后跳转函数的真实地址(DLL中)并执行函数,所以这种方法就是直接修改IAT表,修改某个函数的地址为恶意代码的地址然后在跳转回真实的函数,执行,就完美的运行了恶意代码,而且程序看起来并不会有什么异常

 用户态rootkit之inline hook

原谅我这个垃圾画画水平

Inline hook

Inline hook简单的说就是修改api函数的代码,不过要先将函数的前几个字节改为跳转指令,跳转到恶意代码处,恶意代码的最后一部分是原函数被修改的指令跳转到原函数的指令。

用户态rootkit之inline hook

通过一个小程序来看

 用户态rootkit之inline hook

首先图中有三个函数,第一个函数和第三个函数分别是获取当前进程的process id然后分别挂起线程与回复线程,所以说明第二个函数一定是会修改内核或者安装hook。

 用户态rootkit之inline hook

进入第二个函数就发现它先获取了send()函数的地址,作为参数传入最终的hook_install函数


进入最终的函数,就发现这个函数明显的做个一个inline_hook的安装,先是获取hook函数与send()函数的差值减五,减五是因为jmp指令覆盖了5个字节,所以真正相差的值需要减5。然后分配了255个字节,从第五个字节开始就是send()函数开始的5个字节,也就是被覆盖的指令然后就是跳转指令到send()函数,而后又将send函数的前几个字节改为跳转指令,跳转到hook函数,而最后的便是hook函数执行完毕后跳转回send()函数后面部分的指令。

 用户态rootkit之inline hook

至于函数中的VirtualProctect则是为了修改send()函数的不可执行与还原。

这个程序以及内容源自《恶意代码分析实战》一书11-2。这个例子除了这个inline hook还包含了对程序存活机制的windows注册表的相关操作,修改了Appinit_DLL项,本身又是一个dll,是一个不错的例子。