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

储巢HIVE及实现注册表隐藏 储巢, 巢箱,巢室,隐藏注册表 阅读详情
作 者:  Sysnap
---------------------------------------------
目录
1 用windbg简单认识下HIVE文件
2 用ZwSaveKey生成一个HIVE文件
3 ring3来简单解释这个HIVE文件

1 用windbg简单认识下HIVE文件
物理上的HIVE文件
1 注册表是由许多个HIVE文件组成的
2 一个HIVE文件由许多个BIN组成,一般一个HIVE文件的开头会有一个文件头,用与描述这个HIVE文件的一些全局信息
3 一个BIN由许多个CELL组成
而CELL有好几种类型
比如 key cell(cm_key_node) value cell(CM_KEY_VALUE) subbkey-list cell,value-

list cell等

一个HIVE文件的结构
-------------         |
_HBASE_BLOCK |
_BIN0        |
_BIN1        |
_BIN2        |
:                |
:                |
_BINx        |
------------- |
一般自己映射HIVE文件,得到映射的基地址,这个基地址加上1页的大小就来到第一个BIN了
,BIN也是一个数据结构,里面也包含了一些描述这个BIN的信息,我们称之为BIN头,一个BIN
头的大小一般是0X20,所以一个BIN后的0X20开始就是我们的第一个CELL了,怎样把一个键及其下面的子键保存为HIVE文件,微软提供了API RegSaveKey,建议学习的时候用这个API来生成一个简单的HIVE文件,然后用WINHEX之类的工具查看该HIVE文件的内部,知道个大概

注册表相关的函数

用户态的regxxx
内核的NT和CM系列(关于CM系列的,一般都是没有导出的,如果想使用可以靠导出的获取没

导出的方法)

实验:
0 用winHex打开一个HIVE文件,看看其里面的内容

1了解与注册表有关的几个结构
用命令 dt nt!*cm*
这样就会列出一大堆数据结构出来,关于每个数据结构是怎样的,自己再dt看
比较重要的有
(HBASE_BLOCK)
NT!_CMHIVE
NT!_CMHIVE
NT!_CM_KEY_HASH
NT!_CM_KEY_BODY
NT!_CM_KEY_NODE
NT!_CM_KEY_VALUE
NT!_CM_KEY_SECURITY
NT!_CM_KEY_CONTROL_BLOCK

2一个简单的实验
lkd> !reg dumppool
...略,这里会列出许多的HIVE

dumping hive at e1022b60 (NONAME)
Stable Length = 1000
1/1 pages present
Volatile Length = 1000
can't read HMAP_ENTRY at e1b16000
0/1 pages present
Total pages present = 4311 / 14680

用!reg baseblock查看这个HIVE的基块

lkd> !reg baseblock e1022b60
FileName : NONAME
Signature: HBASE_BLOCK_SIGNATURE
Sequence1: 1
Sequence2: 1
TimeStamp: 0 0
Major    : 1
Minor    : 3
Type     : HFILE_TYPE_PRIMARY
Format   : HBASE_FORMAT_MEMORY
RootCell : 20
Length   : 0
Cluster : 1
CheckSum : 0


用!reg openkeys列出HIVE文件所有打开的键

lkd> !reg openkeys e1022b60

Index 48: 1cbf04a8 kcb=e1035a70 cell=00000188 f=00200004 /REGISTRY/USER
Index 1b8: dc72ea09 kcb=e3fefb48 cell=80000020 f=00300008

/REGISTRY/USER/S-1-5-18
Index 595: d936a631 kcb=e1035008 cell=00000020 f=002c0000 /REGISTRY
Index 698: bd68092e kcb=e1035248 cell=00000120 f=00200004

/REGISTRY/MACHINE

用!reg cellindex查看一下打开键的CELL单元.它是一个_cm_key_node结构

kd> !reg cellindex e1022b60 0x120

Map = e1022bc0 Type = 0 Table = 0 Block = 0 Offset = 120
MapTable     = e1033000
BlockAddress = e1032000

pcell: e1032124

得到CELL的地址pcell: e1032124后,接着
lkd> dt _cm_key_node e1032124
nt!_CM_KEY_NODE
   nt!_CM_KEY_NODE
   +0x000 Signature        : 0x6b6e
   +0x002 Flags            : 0x20
   +0x004 LastWriteTime    : _LARGE_INTEGER 0x1c8a59a`913acf5a
   +0x00c Spare            : 0
   +0x010 Parent           : 0x20
   +0x014 SubKeyCounts     : [2] 5
   +0x01c SubKeyLists      : [2] 0x448
   +0x024 ValueList        : _CHILD_LIST
   +0x01c ChildHiveReference : _CM_KEY_REFERENCE
   +0x02c Security         : 0x78
   +0x030 Class            : 0xffffffff
   +0x034 MaxNameLen       : 0x10
   +0x038 MaxClassLen      : 0
   +0x03c MaxValueNameLen : 0
   +0x040 MaxValueDataLen : 0
   +0x044 WorkVar          : 0
   +0x048 NameLength       : 7
   +0x04a ClassLength      : 0
   +0x04c Name             : [1] 0x414d

我们来解读这里的信息:
1 +0x000 Signature        : 0x6b6e 0x6b6e表示NK,_cm_key_node结构的标识符
2 +0x014 SubKeyCounts     : [2] 5 表示该键有5个子键
3 +0x01c SubKeyLists      : [2] 0x448 表示子键列表单元的单元索引为0x448
4 +0x024 ValueList        : _CHILD_LIST 表示本键键值单元的索引

注册表的组织
这里我们首先了解一个概念,单元索引
单元索引:是一个CELL在HIVE文件上的偏移量
看一下_CM_KEY_NODE这个结构,我们以HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001

/Services/6to4这个键为例,你可以把它及其子键保存为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_MACHINE/SYSTEM/ControlSet001/Services/6to4这个键就是一个

_CM_KEY_NODE结构,ValueList的值就是一个单元索引了,由这个"单元索引"我们可以找到

6to4这个键的"键值列表单元",有了"键值列表单元",我们就可以找到"键值单元",有了键

值单元,我们就可以找到数据了
一般就是下面这条线
----------------------------------------------------------------------------
键单元----键值列表单元单元索引---键值列表单元--键值单元--数据单元
----------------------------------------------------------------------------
B子键
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/6to4下面还有三个子键,怎么找,

请看_CM_KEY_NODE里面的俩个成员
+0x014 SubKeyCounts     : [2] Uint4B
+0x01c SubKeyLists      : [2] Uint4B

SubKeyCounts表示这个键单元有多少个子键,SubKeyLists是子键列表单元的单元索引
所以一般SubKeyCounts是用于控制遍历子键的一个变量,这里我们应该知道怎么找到一个

键单元的子键了
----------------------------------------
SubKeyLists----子键列表单元-----子键单元
----------------------------------------
一个键可能有多个子键,由SubKeyCounts标识



2 用ZwSaveKey生成一个HIVE文件
这里我们用驱动程序,不过用户程序也是可以的,很简单,就是获得ZwSaveKey所需要的句柄,这里我们用了ZwOpenKey和ZwCreateFile,我们把//REGISTRY//MACHINE//SYSTEM//ControlSet001//Services这个键极其子键保存为一个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"//REGISTRY//MACHINE//SYSTEM//ControlSet001//Services");
    RtlInitUnicodeString(&filepath,L"//Device//HarddiskVolume1//my.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文件,接着我们就是解释它
首先把这个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      :%s/n",   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;index1<dirKey->NumberOfKeys;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;index2<subkey->NumberOfKeys;index2++)
    {
            ListValue(keypath,(PCM_KEY_NODE)((&subkey->ValueData_Offset)[index2]+RootBin));
    
        }
    }

}


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

相关推荐

注册表文件读写,解析HIVE文件方式

注册表文件读写,解析HIVE文件方式 NT Registry Hive access library, constants & structures 以直接读写注册表所属文件方式读写注册表,可以避开注册表监控软件. 支持系统:win2ksp4,winxp sp2, winxp sp3

[note]注册表之HIVE

1.HIVE结构 首先,要明白的是注册表是由多个hive文件组成. 而一个hive是由许多bin组成,一个bin是由很多cell组成. 而cell可以有好几种类型.比如keycell(cm_key_node)valuecell(CM_KEY_VALUE)subbkey-listcell,value-listcell等 当新的数据要扩张一个hive时,...

a519609598的博客 324

S32K3 eMIOS使用介绍(PWM输出与输入捕获)——基于MCAL

本文基于 S32K3xx系列芯片、S32 Design Studio for S32 Platform开发平台以及EB tresos 28.0.0、 MCAL层,介绍pwm的输出及输入捕获。

HeFlyYoung的博客 2万+

Windows注册表HIVE文件格式解析

Windows注册表HIVE文件格式解析 2010-02-16 15:39 我们可以用系统提供的注册表编辑器(regedit)来访问和修改注册表中的数据。直观的讲,注册表呈现出来的是图1所示的形式,它由根键(rootkey)、子键(subkey)、键值(value)和数据(data)组成。数据之间有类型的分别,常见的有:REG_SZ、字符串型,REG_BINARY、二进

lionzl的专栏 1495

海豚调度器(dolphinscheduler)再次使用,添加钉钉预警

1,首先我们部署是海豚调度器 1.3.8版本,由于页面只有邮件预警,所以在了解源码的同时,需要添加钉钉预警 2,说明,这一块是同事搞的,不是我搞的,新版本的dolphinscheduler已经有了钉钉模块,只是新版本还没有发布 3,我们现在只是添加简单的钉钉预警,任务成功或者失败会发送邮件+钉钉 4,具体操作 找到最新的源码devhttps://github1s.com/apache/dolphinscheduler/blob/dev/dolphinscheduler-alert/src/ma...

qq_31866793的博客 3085

从代码学习深度强化学习 - 目标导向的强化学习-HER算法 PyTorch版

经典的深度强化学习算法,如 PPO、SAC 等,在各自擅长的任务中都取得了非常好的效果。但它们通常都局限在解决单个任务上,换句话说,训练好的算法,在运行时也只能完成一个特定的任务。想象一个场景:我们想让一个机械臂能把桌子上的任何一个物体重置到任意一个指定位置。对于传统强化学习而言,如果目标物体的初始位置和目标位置每次都变化,那么这就是一个全新的任务。即便任务的“格式”——抓取并移动——是一样的,但策略本身可能需要重新训练。这显然效率极低。为了解决这类问题,

weixin_43887510的博客 1504

Windows 取证之注册表

Registry)是操作系统和其应用程序中的一个重要的层次型数据库,用于存储系统和应用程序的配置信息。早在推出OLE技术的时候,注册表就已经出现。但是,从Windows 95开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统中继续沿用至今。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

wangluoanquan111的博客 672

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 407

转:Windows注册表HIVE文件格式解析

<br />Windows注册表HIVE文件格式解析<br /> 文章作者:fahrenheit <br /> 引言 <br /><br />   相信大家对Windows系统的注册表(registry)一定都不陌生了,我们可以用系统提供的注册表编辑器(regedit)来访问和修改注册表中的数据。直观的讲,注册表呈现出来的是图1所示的形式,它由根键(rootkey)、子键(subkey)、键值(value)和数据(data)组成。数据之间有类型的分别,常见的有:REG_SZ、字符串型,REG_BINA

tompaz的专栏 2228

Oracle EBS R12.2 安装 -- Step by Step

Oracle EBS R12.2 安装 -- Step by Step

Albert Tan DBA之路 1514

Android 以太网802.1x 配置

802.1X认证网络配置摘要:本文介绍了通过wpa_supplicant.conf文件配置802.1X企业网络认证的两种方法:PEAP-MSCHAPv2方式和TLS方式。PEAP方式需设置SSID、用户名、密码,可选择是否验证CA证书;TLS方式则需要配置客户端证书、私钥及CA证书路径。文件配置完成后需设置权限并重启设备。最后提出如何验证802.1X配置是否生效的问题,但未给出具体验证方法。该配置适用于需要802.1X认证的企业网络环境。

zhaoyufei133的博客 460

ReactOS-Freeldr注册表HIVE文件格式

ReactOS的注册表信息存储在ReactOS/System32/CONFIG/SYSTEM文件中。注册表文件使用的一种特殊的格式——HIVE。HIVE文件主要由BASE_BLOCK/BIN/CELL三部分组成的。BASE_BLOCK是文件头,大小为4KB,里面存储了整个文件的一些全局信息。BIN是以4KB对其的一段空间,里面管理了若干个CELL。CELL是一段用户自定义大小的空间,注册表的键

cradiator的专栏 1390

AI智算-K8s+vLLM & Ray:DeepSeek-r1 671B 满血版分布式推理部署实践

自从上次发布 【AI-智算】K8s+SGLang实战:DeepSeek-r1:671b满血版多机多卡私有化部署全攻略] 文章后,本次将演示另一个主流推理引擎工具——vLLM,结合K8s、LWS、Ray、Volcano等技术栈,部署DeepSeek-r1 671b 满血版分布式推理集群,并对比其与SGLang推理引擎的性能表现。

Kason_iWiki 1826

HIVE注册表的实现

功夫不负有心人,经过几天的努力,Hive注册表终于可以实现了。当用颤抖的手指点开菜单发现设置可以保存后,心中一阵狂喜。这段时间在网上也参考了不少别人的心得,自己成功了,不敢独享,特来与大家share一下!好了,废话说完了,下面说正事。先说下我对Hive注册表的浅显理解。Hive主要功能是实现注册表的掉电保存,它是如何实现的呢?首先把注册表分为两部分:boot.hv第一部分、system.h

大海的故乡 1604

FAST-LIVO2 源码精读(十六):接入自定义传感器——多雷达适配与内外参标定

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏第十六篇。上一篇拆解了中每个关键参数的物理含义与调参路径,并反复强调外参RclPcl与时间偏移配错即全局失效;本篇承接这一悬念,回答更前置的工程问题——如何把 FAST-LIVO2 接到一套全新硬件上:新雷达如何通过的类型分支适配、相机内参与畸变模型如何配置、两组外参与时间偏移如何标定出来并填入 YAML,最后给出一份落地检查清单。

PX4-SLAM-PNC 200

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCE恢复默认HIVE注册表的方法

  当Wince使用了HIVE注册表后,每次用户的注册表改动将得到保存,但是在某些应用场合需要将注册表还原成为出厂的默认设置,通常要求能够在AP中通过点击一个按钮来实现这种clean boot。使用我前面的文章的方法配置的HIVE系统注册表和HIVE用户注册表分别保存在/HDD/Document and Setting/system.hv 中和 /HDD/Document and Settin

Do you have little time 7438

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

建立HIVE注册表

To use the hive-based registry1.    Add the Hive-based Registry Catalog item to your OS design. 2.    Verify the following registry settings in the Platform.reg file for your OS design. [HKEY_LO

青瓜王子的博客 782

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WINCE基于hive注册表的实现

********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi) 时间:2010.12.26 类别:WINCE嵌入操作系统 ********************************LoongEmbedded********************

lqxandroid2012的专栏 861

Windows注册表Hive文件格式解析

相信大家对Windows系统的注册表一定都不陌生了,我们可以用系统提供的注册表编辑器regedit来访问和修改注册表中的数据。它由根键 (rootkey)、子键(subkey)、键值(value)和数据 (data)组成。数据类型如下:        注册表相当于Windows系统中所有32位硬件/驱动和32位应用程序的数据文件,是一个系统信息的数据库。既然是数据文件,那在磁盘上就一定有

zacklin的专栏 2437

wince 5.0 6.0 HIVE注册表

<br />wince 6.0一直困扰我的hive注册表问题,今天解决了,主要问题就是"RegistryFlags"=dword:1 。下面是我参考的,感觉不错,顺便转过来。。。<br /> <br /> <br /> <br />CE的HIVE注册表可以使用户操作的相关设置以注册表的形式保存到DOM等存储设备中.加了HIVE的相关组件后,可以通过手动或自动方式保存信息到存储设备里. <br /> 手动存储方式是执行一个软件后,把用户设置的相关信息回写到HIVE注册表里面 <br />&#6

每天进步一点点 1713

的注册表_到底要不要清理注册表?

注册表是Windows操作系统的一个核心数据库,记载着机子的硬件信息、系统配置、用户配置等各种“高大上”的数据。对于Windows用户来说,如果不会手动修改个注册表项,简直都不好意思自称“电脑高手”。“高手”们热衷于通过regedit提升电脑运行速度、DIY系统配置,把0改成1,把1改成2,狂拽炫酷;而包括我在内的“低手”们只得望其项背,据说保不齐能把系统改瘫了,轻易不敢碰得,但有一项技能是可以轻...

weixin_34856035的博客 3084
上一篇: XML下载者
下一篇: 内核读写只读内存方法总结[Delphi描述]
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值