注册表hive基础知识介绍第五季-列表(List)

阅读量198147

|

发布时间 : 2016-01-04 10:24:41

x
译文声明

本文是翻译文章,文章来源:360安全播报

原文地址:http://binaryforay.blogspot.jp/2015/08/registry-hive-basics-part-5-lists.html

译文仅供参考,具体内容表达以及含义原文为准。

https://p0.ssl.qhimg.com/t0131059fdc465bf053.png

知识回顾

我们关于注册表hive基础知识介绍的内容到这一季也就基本上完结了。如果你没有阅读过我们之前的几季,下面是文章链接:

|   第一季-基本概述

|   第二季-NK记录

|   第三季-VK记录(上)

|   第三季-VK记录(下)

|   第四季-SK记录

我们强烈建议读者在阅读本篇文章之前,先按顺序完成之前几季的学习。

在我们对列表结构进行讲解之前,让我们先回顾一下注册表的整体结构。

一个注册表hive是由一个头部Header以及多个hbin记录所组成的。而每一个hbin记录又是由cell记录,列表(list)记录,以及数据(data)记录所组成的。

Cell记录中包含NK,VK以及SK记录。

列表记录中含有li,ri,以及db记录(之后还会介绍更多相关的内容)。

数据记录是用来存储一些类似数据值等数据的。

下图显示的就是其具体的结构:

https://p1.ssl.qhimg.com/t016bc497e51a31419e.png

尽管从图片上看,似乎每一条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中的具体信息,我们将会在接下来的讨论中使用到这些信息。

http://p6.qhimg.com/t012c1ae995cfcdd859.png

在图片底部,我们可以看到组成这个root cell的十六进制原始数据。

数据值

我们首先要讨论的就是Value列表的cell索引 ,其位于偏移量0x2C处。在上面的例子中,value列表的cell索引为0x188,其十进制数值为392。这是一个相对偏移量。

在接下来的讨论中,我们还会见到各种不同类型的列表,但我们现在仍将继续讨论上面的这个例子。既然value列表位于相对偏移量0x188处,那么只要在这个偏移量上加上0x1000,我们就能够得到其绝对地址了。

下图显示的是偏移量0x1188处的数据:

https://p5.ssl.qhimg.com/t018355140f2d9f1dd4.png

前四个字节的数据为大小值。这是一个长度为32位的有符号整数。我们可以看到列表的大小为-8个字节。在此之前我们也曾见过大小值为负数的情况,大小值为负数意味着这个列表当前正在使用中。

当我们得到了大小值之后,我们就可以继续对后面的偏移量数据进行研究了。

在得到了VK记录所处的偏移量位置之后,我们就可以得到组成VK记录的字节数据了。

在下图中,VK记录的值位于相对偏移量0x170(十进制数值为368)处:

http://p1.qhimg.com/t018d13e76ef0726285.png

在大多数情况下,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个偏移量。

http://p4.qhimg.com/t016ce4246f4f57c3f4.png

li列表与ri列表

li列表与ri列表的结构非常简单。其结构如下:

|   偏移量0x00: 大小 (4个字节)

|   偏移量0x04: 签名: (2个字节)

|   偏移量0x06:入口数量(2个字节)

|   偏移量0x08: 偏移量记录

n   -相对偏移量(4个字节)

|   …

下图显示的是一个li列表的实例:

http://p9.qhimg.com/t01e4a2cd6e78a7d79c.png

下图显示的是一个ri列表的实例:

http://p4.qhimg.com/t017ba39f2ff326ef63.png

在上面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进行分析,我们就会发现:

http://p3.qhimg.com/t016ce4246f4f57c3f4.png

当你找出ri列表中每一个偏移量所指向的内容之后,你就可以研究与每一个列表相关联的NK记录了。

db列表

我们最后一个要进行讨论的就是db列表,这通常会涉及到大数据的情况。db列表一般用于VK记录中,当VK记录的数据非常大(数据大于16344个字节)时,VK记录就会使用一个db列表。只有在版本高于1.3的注册表hive中你才能找到db列表。

Db列表的结构别其他所有的列表结构都要简单,其结构如下:

|   偏移量0x00: 大小 (4个字节)

|   偏移量0x04: 签名: (2个字节)

|   偏移量0x06:入口数量(2个字节)

|   偏移量0x08: 偏移量记录

下图显示的是一个db列表的实例:

http://p0.qhimg.com/t01ce4703f3871e7cbf.png

在这个实例中,从偏移量0x08处开始,相对偏移量为0x078F30。如果我们在此基础上再加上0x1000,我们就可以得到下列数据:

http://p1.qhimg.com/t01e2f6c873c586fbdf.png

在上面的这个例子中,我们跳过代表“大小”的数据后,我们可以得到一组相对偏移量:

0x07B020
0x07F020

这一组偏移量包含有VK记录的数据。

以上的内容即为列表(List)的相关知识。

我们对注册表hive的基础知识讲解系列就到此结束了,也许很多人还没有真正看懂其中的内容,也许很多人会觉得意犹未尽。但我希望大家都能够从中找到自己感兴趣的部分。如果你还没有完全弄明白其中的知识,请仔细查阅原文以获取更多的内容。如果你希望看到关于其他话题的文章,请及时告知于我。感谢大家的耐心阅读!

本文翻译自360安全播报 原文链接。如若转载请注明出处。
分享到:微信
+10赞
收藏
WisFree
分享到:微信

发表评论

Copyright © 北京奇虎科技有限公司 三六零数字安全科技集团有限公司 安全KER All Rights Reserved 京ICP备08010314号-66