A、了解SSDT结构
B、由SSDT索引号获取当前函数地址
C、如何获取索引号
D、获取起源地址-判断SSDT是否被HOOK
E、如何向内核地址写入自己代码
A、了解SSDT结构
SSDT的全称是System Services Descriptor Table,系统服务描述符表 在ntoskrnl.exe导出KeServiceDescriptorTable 这个表
typedef struct ServiceDescriptorTable {
PVOID ServiceTableBase; //System Service Dispatch Table 的基地址
PVOID ServiceCounterTable(0);
//包含着 SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter 更新。
unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目。
PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表
}
用windbg 了解SSDT结构:
windbg符号路径设置: srv*D:\WINDDK\symbols*http://msdl.microsoft.com/download/symbols
poi
B、由SSDT索引号获取当前函数地址
[[KeServiceDescriptorTable]+index*4]
C、如何获取索引号
用工具
D、获取起源地址-判断SSDT是否被HOOK
MmGetSystemRoutineAddress
E、如何向内核地址写入自己代码
mov [xxx],xx //
1、如何向SSDT表写入内容呢,这个表是被保护的 正常情况不能被写入
方法有三
(1) 更改注册表 -最简单的做法
HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\
EnforceWriteProtection=0
与
HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\
DisablePagingExecutive=1
(2)改变CR0寄存器的第1位wp位 置0-常用
(3)通过Memory Descriptor List(MDL)-正规做法
MmCreateMdl