Windows驱动程序开发包DDK(Driver Development Kit)所提供的内核函数来处理注册表。对注册表的操作需要先使用ZwCreateKey函数获得一个注册表的句柄,然后使用ZwOpenKey函数来打开注册表项,使用ZwSetValueKey来对注册表进行添加和修改,使用ZwQueryValueKey函数来对注册表进行查询,枚举子项和枚举子键分别由: ZwQueryKey ZwQueryValueKey函数完成的。ZwdeleteKey函数来完成对子项的删除工作。通过对以上函数的监视我们可以监视注册表来显示哪些应用程序正在访问注册表、这些应用程序正在访问哪些注册表项以及这些应用程序正在读取和写入的注册表数据,所有这些都是实时的。我们可以了解到这些注册表值和注册表项是如何变化的。并对应用程序与系统依赖注册表的方式,应用程序及系统存储配置设置的地方和应用程序的故障诊断是有用的。
SystemCall Hooking技术
Windows 内核结构中提供了大量未公开的基础系统服务(称为Native API),应用程序接口直接或间接的调用这些基础系统服务。大部分的Native API都是在Win32;API中加上Nt两个字母。Windows的执行体运行在内核模式并且为所有的子系统提供Native API的支持。在NTOSKRNL初始化时,创建一个系统服务分派表(System Service Dispatch Table, SSDT)。表中每一项都包含指定服务ID所需的Native API函数地址。系统服务参数表(System Service Parameter Table, SSPT)提供各服务所需的参数字节。NTOSKRNL系统服务的Native API包含在Ntdll.dll中。这些函数使用sysenter指令来切换到内核模式来执行系统服务。 Sysenter指令来进行软中断,首先将IA32_SYSENTER_EIP的值送入EIP,IA32_SYSENTER_ESP的值送入ESP。然后从Ring3切换到Ring0,完成系统服务调用。挂钩系统服务Native API调用就是定位操作系统所使用的系统服务地址表KiServiceTable,并将某些函数地址修改为新的函数地址。使系统在调用原服务的时候先执行我们先修改的新的函数后然后在转入系统本身的服务。
Windows驱动程序的动态装入技术
内核模式的ROOTKIT通常需要写成驱动程序装入内存。常规的驱动程序需要一个INF文件,在安装驱动程序时,通常需要从设备管理器中选择添加新硬件,然后选择对应的inf文件进行安装。设备驱动程序动态加载主要由服务控制管理器(Service Control Manager)的相关系统组件从内核空间中加载或卸载某个驱动程序。加载驱动程序主要分为四个步骤:为驱动创建新的服务;开启此服务;关闭此服务;删除驱动所创建的服务。调用OpenSCManager()函数打开SCM管理器。如果返回NULL,失败。否则继续。调用CreateService()函数创建服务。如果返回错误,返回值的类型为ERROR_IO_PENDING,说明服务已经创建过,不需要重新创建,用OpenService()函数打开此服务。如果错误,返回值为其他值,说明创建失败,返回失败。调用StartService()函数开启服务。