简单认识下注册表的HIVE文件格式( 二 )


20x014 SubKeyCounts;;: [2] 5 表示该键有5个子键
30x01c SubKeyLists;;;: [2] 0x448 表示子键列表单元的单元索引为0x448
40x024 ValueList;;;;;: _CHILD_LIST 表示本键键值单元的索引
注册表的组织
这里我们首先了解一个概念,单元索引
单元索引:是一个CELL在HIVE文件上的偏移量
看一下_CM_KEY_NODE这个结构,我们以HKEY_LOCAL_MACHINESYSTEMControlSet001
Services6to4这个键为例,你可以把它及其子键保存为HIVE文件,然后观察
lkd> dt _CM_KEY_NODE
nt!_CM_KEY_NODE
0x000 Signature;;;;;: Uint2B
0x002 Flags;: Uint2B
0x004 LastWriteTime;: _LARGE_INTEGER
0x00c Spare;: Uint4B
0x010 Parent: Uint4B
0x014 SubKeyCounts;;: [2] Uint4B
0x01c SubKeyLists;;;: [2] Uint4B
0x024 ValueList;;;;;: _CHILD_LIST
0x01c ChildHiveReference : _CM_KEY_REFERENCE
0x02c Security : Uint4B
0x030 Class;: Uint4B
0x034 MaxNameLen;;;;: Uint4B
0x038 MaxClassLen;;;: Uint4B
0x03c MaxValueNameLen : Uint4B
0x040 MaxValueDataLen : Uint4B
0x044 WorkVar; : Uint4B
0x048 NameLength;;;;: Uint2B
0x04a ClassLength;;;: Uint2B
0x04c Name;;: [1] Uint2B
A键值
HKEY_LOCAL_MACHINESYSTEMControlSet001Services6to4这个键就是一个
_CM_KEY_NODE结构,ValueList的值就是一个单元索引了,由这个"单元索引"我们可以找到
6to4这个键的"键值列表单元",有了"键值列表单元",我们就可以找到"键值单元",有了键
值单元,我们就可以找到数据了
一般就是下面这条线
----------------------------------------------------------------------------
键单元----键值列表单元单元索引---键值列表单元--键值单元--数据单元
----------------------------------------------------------------------------
B子键
HKEY_LOCAL_MACHINESYSTEMControlSet001Services6to4下面还有三个子键,怎么找,
请看_CM_KEY_NODE里面的俩个成员
0x014 SubKeyCounts;;: [2] Uint4B
0x01c SubKeyLists;;;: [2] Uint4B
SubKeyCounts表示这个键单元有多少个子键,SubKeyLists是子键列表单元的单元索引
所以一般SubKeyCounts是用于控制遍历子键的一个变量,这里我们应该知道怎么找到一个
键单元的子键了
----------------------------------------
SubKeyLists----子键列表单元-----子键单元
----------------------------------------
一个键可能有多个子键,由SubKeyCounts标识
2 用ZwSaveKey生成一个HIVE文件
这里我们用驱动程序,不过用户程序也是可以的,很简单,就是获得ZwSaveKey所需要的句柄,这里我们用了ZwOpenKey和ZwCreateFile,我们把REGISTRYMACHINESYSTEMControlSet001Services这个键极其子键保存为一个HIVE文件.这个HIVE文件的路径是C:my.dat
NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,
IN PUNICODE_STRING theRegistryPath)
{

HANDLE keyhandle,filehandle;

IO_STATUS_BLOCK iostatus;
OBJECT_ATTRIBUTES keyoa ,fileoa;

UNICODE_STRING; keypath,filepath;
RtlInitUnicodeString(&keypath,L"REGISTRYMACHINESYSTEMControlSet001Services");
RtlInitUnicodeString(&filepath,L"DeviceHarddiskVolume1my.dat");

InitializeObjectAttributes(
&keyoa,
&keypath,
OBJ_CASE_INSENSITIVE,
0,
0
);
InitializeObjectAttributes(
&fileoa,
&filepath,
OBJ_CASE_INSENSITIVE| OBJ_KERNEL_HANDLE,
0,
0
);


ZwOpenKey(&keyhandle,
KEY_ALL_ACCESS,
&keyoa);

ZwCreateFile(
&filehandle,
FILE_ALL_ACCESS,
&fileoa,
&iostatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_Create| FILE_OPEN | FILE_OVERWRITE_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
NULL
);
ZwSaveKey(keyhandle,
filehandle );

theDriverObject->DriverUnload = OnUnload;
return STATUS_SUCCESS;
}

3 ring3来简单解释这个HIVE文件
好了,到了这一步我们已经有了一个HIVE文件,接着我们就是解释它

推荐阅读