百度空间 | 百度首页 
 
查看文章
 
[note]逆向diyhack同学的注册表重定向
2009年04月14日 星期二 21:08

    最近一段时间复习高等数学,工作以外基本没什么时间,看到又一个注册表还原程序([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)


类别:Note | 浏览() | 评论 (5)
 
最近读者:
 
网友评论:
1
2009年04月14日 星期二 21:38 | 回复
唔,又逆了~强大啊,呵呵!学习学习
 
2
2009年04月14日 星期二 22:51 | 回复
膜拜大牛
 
3
2009年04月15日 星期三 20:45 | 回复
非常感谢大米,注释太详细了,哈哈,F5下就是源码。
 
4
2009年04月16日 星期四 21:45 | 回复
大米逆向真猛啊 膜拜后在学习
 
6
2009年04月23日 星期四 08:12 | 回复
复习高等数学
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu