hookport.sys模块作用
Hookport.sys是360安全卫士对系统进行挂钩操作的核心模块。其中主要方 式对SSDT和shadowSSDT安装钩子函数。但其使用了一种较为特 殊的实现方法,使众多常规ARK软件很难检测出360安全卫士所的钩子。由于此方法对系统表操作很少,比较稳定。 Hookport.sys只提供了最为基本的过滤操作和桩 函数,本身并没有实现策略部分。策略部分由360SelfProtection.sys实现,并通过设备扩展进行沟通。 本报告简要解释了360安全卫士所使用的挂钩方法,给出了其中的一些关键数据结构和 使用方法。
SSDT内存位置的确定由于SSDT是内核的导出表,所以确定较为方便。可以直接使用 MmGetSystemRoutineAddress 函数。但由于系统中其它安全软件可能对此函数进行挂钩,所以360采用了更加稳妥的方式。 首先,向ZwQuerySystemInformation传递0x0B号参数,获得SYSTEM_MODULE_INFORMATION结构 数组。数组的第一个元素就是内核模块,取得内核模块的imageBase和imageSize。
按照PE格式解析映射入内存的系统内核,从导出表中找到KeServiceDescriptorTable的地 址,进行重定位后得到SSDT表在内存中的真实地址。
上述这个过程被360封装在MyGetFuncAddrFromKrnl 函数中,并在以后被多次调用。 函数原型如下: int __stdcall MyGetFuncAddrFromKrnl(PUNICODE_STRING funcName) funcName为内核导出函数的名称 返回值为函数地址或NULL。(详细分析请参考IDB文件) shadowSSDT内存位置的确定1. 使用MyGetFuncAddrFromKrnl获得 KeAddSystemServiceTable函数地址。 其反汇编代码如下:
2. 搜索8D 88 指令,并去除后4字节: 注意红色代码:这里出现了KeServiceDescriptorTableShadow的地址,对应的机器码为 8D 88 40 31 55 80 ,从KeAddSystemServiceTable开始搜索8D 88,紧接着的4字节数据就是shadowSSDT在内存中的地址。 |
|