Regmon软件虽然比较老,但是他里面还是体现了ROOTKIT的思想的精髓。以下的分析都是自己在读源码时自己总结的。希望下面的分析对大家有用。当然也希望斑竹能给我个邀请码。谢谢!

Regmon是由微软编写的一款Windows系统注册表监视软件,它可以监视应用程序进行的对Windows注册表的读写操作。它将所有与Windows注册表一切相关操作全部记录下来以供用户参考,并允许用户对记录的信息进行保存、过滤、查找等处理,这就为用户对系统的维护提供了极大的便利。Regmon依赖于系统调用工作簿(SystemCall Hooking)技术,Regmon 会加载系统调用挂钩技术的设备驱动程序。设备驱动程序可以用来监视和改变在Windows核心的系统调用(Windows的核心为NTOSKRNL.EXE 和 WIN32K.SYS)。

Windows驱动程序开发包DDK(Driver Development Kit)所提供的内核函数来处理注册表。对注册表的操作需要先使用ZwCreateKey函数获得一个注册表的句柄,然后使用ZwOpenKey函数来打开注册表项,使用ZwSetValueKey来对注册表进行添加和修改,使用ZwQueryValueKey函数来对注册表进行查询,枚举子项和枚举子键分别由: ZwQueryKey ZwQueryValueKey函数完成的。ZwdeleteKey函数来完成对子项的删除工作。通过对以上函数的监视我们可以监视注册表来显示哪些应用程序正在访问注册表、这些应用程序正在访问哪些注册表项以及这些应用程序正在读取和写入的注册表数据,所有这些都是实时的。我们可以了解到这些注册表值和注册表项是如何变化的。并对应用程序与系统依赖注册表的方式,应用程序及系统存储配置设置的地方和应用程序的故障诊断是有用的。

WindowsROOTKIT
ROOTKIT是一种程序或者程序集,设计的目的是用来秘密的控制被攻占的计算机的行为。Windows ROOTKIT的主要功能是隐藏踪迹,它可以实现进程隐藏、文件隐藏、目录隐藏等功能,从而使受害者用常规的检测方法无法发现任何异常的现象。它通常挂钩到操作系统提供的各种函数中,从那里拦截其它程序发出的各种系统调用。ROOTKIT是处于操作系统和各种应用程序之间,决定着这些应用程序可以调用的函数。一般ROOTKIT分为用户模式和内核模式。用户模式ROOTKIT运行在权限较低的用户态中,修改或替换那些限制使用API来访问系统资源。内核模式ROOTKIT驻留在内核中,以内核驱动程序的方式存在于操作系统中。内核模式的ROOTKIT挂钩成功后,所有的进程对其函数的调用都将被截获下来。内核模式的ROOTKIT的工作方法是修改各种内核数据,包括DLL函数,系统描述符表(SDT)或系统服务表(SST)或系统服务地址表(KiServiceTable)的某些项。

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()函数开启服务。


Regmon 体系结构
Regmon 由Win32 GUI和一个设备驱动程序REGSYS .SYS组成。当Win32 GUI启动时,它会动态的加载虚拟设备的与所有注册表调用的函数挂钩设备驱动程序。在驱动程序中的一个钩子例程拥有一个同它们挂钩服务的一样的函数原型,这样才能得到原始的参数。所有的钩子函数都是执行一样的过程:获得返回的参数,在一个存储区内周期的存储信息,使GUI读取信息并显示。注册表调用是通过句柄而不是关键过程名,显示所有的与句柄有关的过程名都存在一个HASH表中。

上传的附件 RegMon(著名注册表监控软件-Regmon源代码.rar