最近一段时间复习高等数学,工作以外基本没什么时间,看到又一个注册表还原程序([diyhack]注册表重保护程序),和之前sysnap同学(link)的实现原理完全不同,于是挤时间看了下,流程如下:
1. 创建符号链接 "\\DosDevices\\REGREDIRECT_DeviceName"
2. PsCreateSystemThread创建系统线程,填充context为系统进程PID (4 / 8). 线程中干的事情:
/*++
Reserver: sudami [sudami@163.com]
Time : 2009/04/14 [14:4:2009 - 14:58]
Routine Description:
调用NtQuerySystemInformation获取系统拥有的句柄信息,找到注册表文件system的文件句柄.创建键值 "\\REGISTRY\\USER\\.DEFAULT\\Volatile\\",通过ZwRestoreKey将system文件load 到这个键下,以后对system文件的读写,都会重定向到该键.
[+] diyhack同学为什么要用MJ同学的方法 - 由于"\WINDOWS\system32\config\system"文件
的CCB偏移+0x004处FLAG(00012003)的第5位存在,区别于其他文件基于这点来判断.
但是要考虑到兼容性,何必这样做呢?直接判断FILE_OBJECT中的name不就成了吗?
Arguments:
currentPID - 线程的context,传递的是DriverEntry中得到的系统进程ID
--*/
3. 进行object type hook CmParaseKey,进行重定向:
/*++
Reserver: sudami [sudami@163.com]
Time : 2009/04/14 [14:4:2009 - 14:58]
Routine Description:
打开对象"ObjectTypes\Key",获得handle,从而得到对象体(nt!_OBJECT_TYPE),
_OBJECT_TYPE._OBJECT_TYPE_INITIALIZER.ParseProcedure即使要替换的地方
典型的Object Tpye HOOK,在fake函数中会进行重定向处理
--*/
4. fake函数中的处理过程如下:
/*++
Reverser: sudami [sudami@163.com]
Time : 2009/04/14 [14:4:2009 - 15:33]
Routine Description:
负责对system这个hive代表的注册表键(HKEY_LOCAL_MACHINE\SYSTEM)进行重定向.
主要关注的是CmParaseKey的参数六(@CompleteName),这个unicode_string中包含的即是当前正在操作的注册表全路径,格式形如: "SOFTWARE\Policies\Microsoft\Windows NT\DCOM". 因为保护的是system下的所有子键,"system"这个宽字符的长度为12; 过滤条件分2种情况:
(1) @CompleteName.Length 为12,且操作的是"system"父键,先释放@CompleteName.Buffer,再分配内存填充重定向内容,完成后的效果如下:
kd> dt nt!_unicode_string f94693a8
nt!_UNICODE_STRING
"\REGISTRY\USER\.DEFAULT\Volatile"
+0x000 Length : 0x40
+0x002 MaximumLength : 0x42
+0x004 Buffer : 0xe1825ee8 "\REGISTRY\USER\.DEFAULT\Volatile"
成功返回STATUS_REPARSE,给ObpLookupObjectName函数看的.
(2) @CompleteName.Length >= 14, 即操作的"system"下的子键(eg."SYSTEM\CurrentControlSet"),操作和上面相似.
更改后的内容即为 "\REGISTRY\USER\.DEFAULT\Volatile\CurrentControlSet"
若不满足以上条件,调用原始函数,放行...
--*/
---------------------------------------------------------------------------------------
之所以diyhack同学说可以动态还原到保护之前的状态,我想是因为可以save "\REGISTRY\USER\.DEFAULT\Volatile" 成hive,再restore到真正的system键下...
和sysnap同学的有所不同,那个是写到cache中,但不让其写入磁盘文件,而刷新cache只能重新启动后才会有效果...
详细信息请参见PDB,注释精度精确到每个变量 / 跳转. 由于是古老的object type hook,以前写过,所以懒得完全按照原作者的风格逆成C, 各位想了解原理的,将就着看看...
CCB结构貌似在不同的系统版本中有所变化,还望大牛们多多分享已经逆出来的结构体,
k5f0_4f0.sys.IDB.sudami.rar (695.05 KB)