欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SSDT inlineHook

程序员文章站 2022-07-13 16:13:53
...

上一篇我们介绍了最简单的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的位置,就可以完整执行了原函数。

SSDT inlineHook

代码就不贴了,搞明白了原理还要实践才可以。

记得修改内存的时候关闭写保护哦!

相关标签: Hook