SSDT inlineHook
上一篇我们介绍了最简单的SSDT,这篇来写一下inlineHook。
所谓的inlineHook就是在内存中修改所需要挂钩函数的前几个字节,让其跳转到我们的fake函数,执行完毕后再跳回去执行原函数,这样的话我们就没有修改SST表里面的内容,而是对函数本身修改。
流程摘自:看雪aniquest
1. 获取服务函数地址:
(1)通过全局变量KeServiceDescriptorTable获得SSDT表的起始地址;
(2)映射ntdll.dll到ring0空间,获得要Hook的函数的服务索引号;
(3)根据获得的函数的服务索引号,从SSDT表中获得函数地址;
2. 进行Hook(这里采用的Inline Hook是修改函数前五个字节的方法):
(1)申请一块五字节大小的内存用来备份原函数的前五个字节,用于驱动卸载的时候恢复原函数;
(2)申请一块十字节大小的内存用来构造“跳板代码”;
(3)拷贝原函数的前五个字节到跳板代码的前五个字节处;
(4)计算由跳板代码处跳转到原函数开始处过五个字节的偏移(记为offset1),将jmp offset1指令写入跳板代码的后五个字节处;
(5)编写Fake函数,也就是我们需要执行的代码;
(6)计算原函数开始处跳转到Fake函数开始处的偏移(offset2),将jmp offset2指令写入原函数开始处;
3. 驱动卸载时,
恢复被Hook的函数,也就是将一开始备份的原函数开始处的五个字节拷贝到原函数开始处。
通过全局变量KeServiceDescriptorTable获得SSDT表的起始地址
extern PSYSTEM_SERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;
映射ntdll.dll到ring0空间,获得要Hook的函数的服务索引号;
通过PE文件结构在导出表中搜索函数,这里不再赘述。
2: kd> u ZwOpenProcess
nt!ZwOpenProcess:
8485acd8 b8be000000 mov eax,0BEh
8485acdd 8d542404 lea edx,[esp+4]
8485ace1 9c pushfd
8485ace2 6a08 push 8
8485ace4 e8d5190000 call nt!KiSystemService (8485c6be)
8485ace9 c21000 ret 10h
可以看到函数地址+1个字节的位置存的就是函数在SST表中的索引
根据获得的函数的服务索引号,从SSDT表中获得函数地址;
当进行Hook时我们要思考一个问题,跳转到我们的fake函数地址,我们怎么执行回原函数,原本的函数代码都已经被我们改了,所以我们必须保存原来的函数代码。之后呢,修改回去吗?当然不用。既然我们已经保存了原始的五个字节代码,我们只需要执行这个代码,然后再跳回去原始函数+5的位置,就可以完整执行了原函数。
代码就不贴了,搞明白了原理还要实践才可以。
记得修改内存的时候关闭写保护哦!
推荐阅读
-
远程代码注入及DLL注入教程(InlineHook)---植物大战僵尸为例
-
进程隐藏与进程保护(SSDT Hook 实现)(三)
-
进程隐藏与进程保护(SSDT Hook 实现)(一)
-
HOOK技术:SSDT HOOK(x86)
-
SSDT inlineHook
-
Rootkit 核心技术——利用 nt!_MDL(内存描述符链表)突破 SSDT(系统服务描述符表)的只读访问限制 Part I
-
x64 内核 InlineHook
-
win10 x64中inlineHook SSDT里面的函数
-
Rootkit 核心技术——利用 nt!_MDL(内存描述符链表)突破 SSDT(系统服务描述符表)的只读访问限制 Part I