知识回顾
我们关于注册表hive基础知识介绍的内容到这一季也就基本上完结了。如果你没有阅读过我们之前的几季,下面是文章链接:
| 第一季-基本概述
| 第二季-NK记录
| 第四季-SK记录
我们强烈建议读者在阅读本篇文章之前,先按顺序完成之前几季的学习。
在我们对列表结构进行讲解之前,让我们先回顾一下注册表的整体结构。
一个注册表hive是由一个头部Header以及多个hbin记录所组成的。而每一个hbin记录又是由cell记录,列表(list)记录,以及数据(data)记录所组成的。
Cell记录中包含NK,VK以及SK记录。
列表记录中含有li,ri,以及db记录(之后还会介绍更多相关的内容)。
数据记录是用来存储一些类似数据值等数据的。
下图显示的就是其具体的结构:
尽管从图片上看,似乎每一条hbin记录的大小都是一样的,但系统并没有这样的要求和规定。系统只要求hbin记录的大小为4096个字节的整数倍。
如果你需要对一个注册表hive进行解析,下面列出的是常用的方法:
1. 打开文件
2. 读取header
(1) 得到RootCellOffset
(2) 得到长度值
3. 定位hbin
(1) 确定hbin的长度值
4. 找到hbin中的记录
(1) Cell
(2) 列表(List)
(3) 数据(Data)
5.利用记录信息进行分析
6. 继续进行第三步,直到长度值符合要求
7. 关闭文件
起始点是RootCellOffset处的NK记录。如果你想了解如何找到RootCellOffset,请点击这里以了解更多详细信息。现在开始,你就可以仔细分析这些键值以及一些相关值了。
下图显示的是一个root cell中的具体信息,我们将会在接下来的讨论中使用到这些信息。
在图片底部,我们可以看到组成这个root cell的十六进制原始数据。
数据值
我们首先要讨论的就是Value列表的cell索引 ,其位于偏移量0x2C处。在上面的例子中,value列表的cell索引为0x188,其十进制数值为392。这是一个相对偏移量。
在接下来的讨论中,我们还会见到各种不同类型的列表,但我们现在仍将继续讨论上面的这个例子。既然value列表位于相对偏移量0x188处,那么只要在这个偏移量上加上0x1000,我们就能够得到其绝对地址了。
下图显示的是偏移量0x1188处的数据:
前四个字节的数据为大小值。这是一个长度为32位的有符号整数。我们可以看到列表的大小为-8个字节。在此之前我们也曾见过大小值为负数的情况,大小值为负数意味着这个列表当前正在使用中。
当我们得到了大小值之后,我们就可以继续对后面的偏移量数据进行研究了。
在得到了VK记录所处的偏移量位置之后,我们就可以得到组成VK记录的字节数据了。
在下图中,VK记录的值位于相对偏移量0x170(十进制数值为368)处:
在大多数情况下,value并不会使用列表来进行表示。但当我们在处理VK记录时,某些情况之下还是需要与列表打交道的。
列表(Lists)
在之前的章节中我们已经介绍了注册表通常是如何使用列表的。接下来,我们会对各种不同类型的列表进行讲解。lf以及lh列表与我们之前所见到的列表工作机制是一样的,所以我们不会对其进行过多的讲解。
在注册表hive中,总共有五种不同类型的列表结构,具体信息如下:
| lf
| lh
| li
| ri
| db
lf列表和lh列表
lf列表和lh列表的结构非常相似。其基本结构如下:
| 偏移量0x00: 大小 (4个字节)
| 偏移量0x04: 签名: (2个字节)
| 偏移量0x06: 入口数量(2个字节)
| 偏移量0x08: 偏移量记录
n -相对偏移量(4个字节)
n 哈希值 (4 个字节)
| …
lf列表与lh列表之间的区别在于两者的Hash格式不同。
在lf列表中,哈希值为表项名称的前四个字符。
在lh列表中,哈希值是一个特定的数值,即一个长度为32位的无符号整数。
数值哈希的工作机制如下:
1. 首先,将哈希值设置为零
2. 然后从左至右对子项名称的字符进行哈希操作。
除此之外,还有几点注意事项需要你注意。如需了解完整的信息,请点击这里查看章节4.29的内容。
下图显示的是一个lh列表的原始数据形式(下图显示的数据并不完整,但你只要理解就可以了)。在这种列表中,从共有506个偏移量。
li列表与ri列表
li列表与ri列表的结构非常简单。其结构如下:
| 偏移量0x00: 大小 (4个字节)
| 偏移量0x04: 签名: (2个字节)
| 偏移量0x06:入口数量(2个字节)
| 偏移量0x08: 偏移量记录
n -相对偏移量(4个字节)
| …
下图显示的是一个li列表的实例:
下图显示的是一个ri列表的实例:
在上面ri列表的实例中,其大小为-16字节。偏移量0x04处为签名信息。偏移量0x06处为入口数量-2。
从偏移量0x08处开始,我们能够看到下列两个偏移量:
0x717020
0x72F020
ri列表比较与众不同,其中的偏移量并不直接指向NK记录,其指向的是其他的列表。
回想一下,注册表hive是有版本区别的。
只有在1.3版本的hive中才有li记录。对于1.3版本的注册表hive,ri列表指向的是li列表。在1.5版本的注册表hive中,ri列表指向的永远都是lh记录。
如果我们对上面例子中的偏移量0x717020进行分析,我们就会发现:
当你找出ri列表中每一个偏移量所指向的内容之后,你就可以研究与每一个列表相关联的NK记录了。
db列表
我们最后一个要进行讨论的就是db列表,这通常会涉及到大数据的情况。db列表一般用于VK记录中,当VK记录的数据非常大(数据大于16344个字节)时,VK记录就会使用一个db列表。只有在版本高于1.3的注册表hive中你才能找到db列表。
Db列表的结构别其他所有的列表结构都要简单,其结构如下:
| 偏移量0x00: 大小 (4个字节)
| 偏移量0x04: 签名: (2个字节)
| 偏移量0x06:入口数量(2个字节)
| 偏移量0x08: 偏移量记录
下图显示的是一个db列表的实例:
在这个实例中,从偏移量0x08处开始,相对偏移量为0x078F30。如果我们在此基础上再加上0x1000,我们就可以得到下列数据:
在上面的这个例子中,我们跳过代表“大小”的数据后,我们可以得到一组相对偏移量:
0x07B020
0x07F020
这一组偏移量包含有VK记录的数据。
以上的内容即为列表(List)的相关知识。
我们对注册表hive的基础知识讲解系列就到此结束了,也许很多人还没有真正看懂其中的内容,也许很多人会觉得意犹未尽。但我希望大家都能够从中找到自己感兴趣的部分。如果你还没有完全弄明白其中的知识,请仔细查阅原文以获取更多的内容。如果你希望看到关于其他话题的文章,请及时告知于我。感谢大家的耐心阅读!
还没有评论,来说两句吧...