SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序,来实现搜索 SSDT 函数的地址,并能够实现简单的内核 Hook 挂钩。
在开始编写驱动之前,我们先来分析一下Ring3到Ring0是如何协作的,这里通过C语言调用 OpenProcess
函数,并分析它的执行过程,先来创建一个C程序。
#include <windows.h> int main(int argc, char* argv[]) { HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,2548); return 0; }
通过VC6编译器编译,并使用OD载入程序,找到程序的OEP,分析第一次调用,可以看到CALL的地址是 <&KERNEL32.OpenProcess>
此处我们直接跟进去。
0040102A |. 68 F4090000 push 0x9F4 ; /ProcessId = 0x9F4 0040102F |. 6A 00 push 0x0 ; |Inheritable = FALSE 00401031 |. 68 FF0F1F00 push 0x1F0FFF ; |Access = PROCESS_ALL_ACCESS 00401036 |. FF15 4CA14200 call dword ptr [<&KERNEL32.OpenProcess>] ; \OpenProcess 0040103C |. 3BF4 cmp esi, esp