在我们开始讲解之前,了解一下注册表hive的基本结构将会对你有很大的帮助。
高级结构
在注册表hive中,存在两个高级数据结构:header和hbin cells。
注册表头
注册表头的长度为4096(0x1000)个字节,其中包含有以下几个非常重要的信息:
l 签名
l 最后一次写入数据的时间戳
l 主版本号和次版本号
l Root cell偏移量
l 长度
l 文件名
虽然这些内容看起来并不是非常的复杂,但这些信息却是你在进一步了解hive结构的时候将会用到的东西。
我们通过WinHex打开了一个注册表hive之后,得到了下图中所包含的内容:
签名
我们可以在偏移量0x0处找到有关签名的信息,其长度为4个字节。签名信息为ASCII字符串“regf”,签名之后的内容即为整个hive文件的数据信息。
最后一次写入数据的时间戳
我们可以在偏移量0xc处找到最后一次写入数据的时间戳,系统使用了一个长度为64位的整数来对它进行存储,这个数值表示的是从UTC时间的1601年1月1日至今的100纳秒间隔数,这是一个Windows的FILETIME。
在上面的这张截图中,时间戳为0x01CE9F3B1ABB0041。你可以看到时间戳的数据在上图中是以逆序出现的。这是因为系统在存储它时采用的是小端存储格式。这个时间戳所代表的十进制数为130216515440672833
将此类十六进制数值按照正确的字节顺序直接输入类似DCode等工具之后,我们便能够直接得到确切的日期。我们将上图中时间戳的十六进制数值输入之后,便能得到UTC时间的日期-“2013年8月22日星期四,时间为13时25分44秒”。
在.net中,专门有一个用于将FILETIME转换为DateTimeOffset的函数。
在我的注册表分析程序中,所有的时间戳都被转换成了DateTimeOffset,这将可以使你更加容易地将时间戳转换成任意时区的时间,但系统默认为UTC时间。
主版本号和次版本号
偏移量0x14处开始即为主版本号的信息,系统采用了一个32位的整形数值来存储它。从偏移量0x18处开始即为次版本号的信息,数据长度与主板本一致。在上面的截图中你可以看到,系统同样采用了小端存储格式来存储这些数据。
版本号是非常重要的一个信息,因为系统的某些行为和功能只有在特定的版本中才会存在。比如说,在1.4版本以及更高的版本之中,系统存储大数据的时候所采用的存储方式与1.4以下版本所采用的方式是不一样的。当我们讨论用于存储数值的vk cell记录时我们将会看到更多这样的情况。
Root cell偏移量
从0x24处开始即为有关root cell偏移量的信息,系统通过一个32位长度的无符号整数来存储这一数据。
注册表中使用了很多无符号整数,所以我们首先得了解一下有符号整数与无符号整数之间有什么区别。无符号整数只能是整数,一个32位长度的无符号整数最大值为4,294,967,295。这也就意味着一个无符号整数的数值大小只能在0至4,294,967,295之间。
首先我们得回顾一下一些简单的知识,既然我们已经讨论了32位长的数值,那么我们现在就可以将32除以8,这样就可以得到数据的字节数,即4。
在十六进制数中,一个32位长度的无符号整形的最大值为0xFFFFFFFF,总共有八个F。整个数据长度为4个字节(FF FF FF FF),4字节乘以8即为32位。
对于有符号整数而言,从0开始数轴的左边即为负数。在32位长度的有符号整数中,其最小值为–2,147,483,648,最大值为2,147,483,647。正如你所猜测的那样,将这两个数的绝对值相加,得到的正是4,294,967,295。
当我们涉及到不同的cell以及list记录时(尤其是数据大小),正数和负数之间的对比是至关重要的。
让我们重新回到root cell偏移量上,在上面的截图中,root偏移量为0x20,这是root cell的相对位置。在注册表中所有的偏移量都是相对于第一个hbin记录而言的(关于这部分的信息,我们将会在讲解完注册表头的内容之后给大家详细介绍)。
在此,我要提醒大家一下,hive头部的长度为4096(0x1000)个字节。这也就意味着偏移量0x1000处的内容为第一个hbin cell的信息。如果要计算root cell的绝对位置,我们还必须加上0x1000,即得到0x20。结果即为偏移量0x1200,对偏移量进行进一步的分析,我们就可以得到root cell的数据结构了。
正如你所看到的那样,在上图中,偏移量0x1000处开始即为hbin的头部数据,我们的root cell就在hbin cell之中。我们将会在接下来的文章中对hbin cells进行进一步讲解。
长度
偏移量0x28处的数据即为注册表hive的长度。系统同样使用了一个32位长度的无符号整数来存储这一数据,该数据表示的是在这个注册表hive中,当前所有正在使用的hbin cells的大小。在第一张截图中,我们可以看到其长度为0x0086F000或8,843,264个字节。
但需要注意的是,这个大小与磁盘中注册表hive的大小并不相同。这一数值中并不包含注册表头的大小,除此之外,也不包含注册表hive结尾处的一些其他数据。
数据长度可以保证注册表分析程序能能够完整读取注册表hive中所有正在使用的数据域。我的注册表分析器可以利用这个数据来校验读取到的数据字节长度。在某些情况下,长度域中有可能会存在一些错误的数据或者是零。在这种情况下,我的注册表分析器将会对这些数据进行检测,如果全部为零,那么这段数据将会被忽略不计。如果程序检测到非零数据,程序将会以警告的形式进行报告。
文件名
文件名是内嵌在注册表中的。我们可以在偏移量0x30处找到它。系统采用的是UTF-16的小端存储格式来对其进行存储,字符串以NUL字符结尾。在第一张截图中,我们可以看到文件名为“??C:Usersericntuser.dat”,从中我们可以了解到用户的配置文件。
在其他的注册表hive中并不包含绝对路径,但我们可以在最右边的部分看到文件名的信息。下图所给出的信息就是一个例子:
这是System32Config中的一个SOFTWARE hive。
hbin cells
hbin cells是一个“容器”,它可以存储注册表hives中所有其他的记录。
hbin cells包含了下面几项重要的信息:
l 签名
l 文件偏移(FileOffset)
l 数据大小
虽然这些内容看起来并不是非常的复杂,但这些信息却是非常重要的。
我们通过WinHex打开了一个注册表hive之后,得到了下图所显示出来的内容:
签名
我们可以在hbin cell中偏移量0x0处找到签名信息,其长度为4个字节。我们可以看到一个ASCII字符串“hbin”,所有hbin cells的数据都是从这个签名处开始的。
文件偏移(FileOffset)
FileOffset是相对偏移。我们可以在hbin cell中相对偏移量0x4处找到它,系统采用了一个32位长度的无符号整数来对它进行存储。
在上面这张截图中,我们可以看到偏移量0x00000000。既然这是第一个hbin cell,那么相对偏移量当然是0了。如果需要计算hbin cell的绝对偏移量,只需要用FileOffset加上0x1000即可得到。
数据大小
数据大小可以在hbin cell中的相对偏移量0x8处找到。在上面所给出的例子中,数据大小为0x1000(同样采用的是小端存储格式)。0x1000的十进制数值为4096.大多数的hbin cells为0x1000个字节,但这并不是绝对的。
现在,你应该已经了解了注册表的基本结构了,那么我们将会进一步给大家介绍一些更加有趣的内容,例如注册表项(以及子项),值,以及包含这些数据的列表等等。
我们将会在第二季中给大家介绍NK记录。
发表评论
您还未登录,请先登录。
登录