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


首先把这个HIVE文件读入内存,基地址加上一个页的大小就来到了第一个BIN,BIN头大小是0X20我们不用理,加上0X20后我们就来到了第一个CELL...即ROOTCELL...接着就是开始解释这个HIVE文件了
void ListValue( PCHAR keypath,; PCM_KEY_NODE KeyNode )
{
char *SubKeyName=keypath;
PCHAR val;

memcpy(keypath,&KeyNode->KeyName,KeyNode->KeyName);
keypath =KeyNode->KeyName_len;
printf("the key name;;;:%sn",SubKeyName);

}

void ListSubKeys( PCHAR keypath,; PCM_KEY_NODE KeyNode )
{
RootBin=(PCHAR)KeyNode-0x20;

PCM_KEY_FAST_INDEX dirKey = (PCM_KEY_FAST_INDEX)(RootBin KeyNode->Subkeys_offset);
for(ULONG index1=0;index1NumberOfKeys;index1)
{

PCM_KEY_FAST_INDEX subkey = (PCM_KEY_FAST_INDEX)((&dirKey->ValueData_Offset)[index1] RootBin);
if(dirKey->Signature[1]=="f")
{
ListValue(keypath,(PCM_KEY_NODE)((&dirKey->ValueData_Offset)[index1*2] RootBin));

}
else
for(ULONG index2=0;index2NumberOfKeys;index2)
{
ListValue(keypath,(PCM_KEY_NODE)((&subkey->ValueData_Offset)[index2] RootBin));

}
}
}

后注:在dump hive时,正常是没有问题的...但如果使用了combojiang那篇隐藏注册表里面的那个驱动程序来隐藏注册表...比如它里面隐藏了Services键下的子键Beep,,,那我们在dump Services时就会失败....也不知道是什么原因,,应该是被什么干扰了吧...不过你可以自己复制原始的HIVE文件,在解释它...这个程序再改改应该可以...不过到了这里你应该对HIVE文件有个大概的理解了..

推荐阅读