写一个程序来简单地解析一下引导区。在整个过程中,编写程序不是难点,难点在于引导区的各个数据结构和备结构之问的数据关系。
为了能写出程序,先进行一次对引导区的手动分析,使用的工具是WinHex。
通过WinHex来手动解析引导区
WinHex是一个强大的十六迸制编辑工具,也是一个强大的磁盘编辑上具。打开WinHex,并打开磁盘,如图6-35、图6-36和图6-37所示。
当打开磁盘后,会看到很多密密麻麻的十六进制的数据,这些数据很像学习PE文件结构时的情况,一眼看上去不能理解,当根据其各种不同的结构进行解析后就一目了然了,因此重要的是学习其各种结构,这里不对磁盘中涉及的全部各个结构都进行介绍,主要介绍一下组成引导区的各个结构体。
引导区,也叫主引导记录,MBR位于整个磁盘的0柱面0磁头1扇区的位置处,MBR在计算机引导过程中起到非常重要的作用,MBR可以分为五部分,分别是引导程序,Windwos磁盘签名,保留位,分区表和结束标志,这五部分构成了一个完整的引导区,引导区的大小为512个字节,我们通过Winhex来具体查看一下每一部分的内容,来了解一下这512个字节的作用。
首先来看一下引导记录.
被选中的地方就是MBR的引导程序。引导程序会判断MBR的有效性,判断磁盘分区的合法性,及把控制权交给操作系统。引导程序占用了MBR的前440字节。再来看一下Windows的磁盘签名,如图6-39所示。
在图6-39中被选中的位置就是Windows的磁盘签名,它的位置在紧接引导程序的第4个字节。Windows磁盘签名对于MBR来说不是必须的,但是对于Windows系统来说是必须的,它是Windows系统在初始化时写入的,Windows依靠磁盘签名来识别硬盘,如果该签名丢失则Windows认为该磁盘没有被初始化。在图6-39中,Windows的磁盘签名为“BF5FBF5F”。
紧接在磁盘签名后的两个字节是保留字节,也就是暂时没有被mbr使用的位置。
在保留的两个字节后的64个字节,则保存了分区表,如图6-40所示。
分区表在MBR巾占用了64个字节的位置,分区表被称为DPT(Disk Partition Table).它在MBR中是一个非常关键的数据结构。分区表是用来管理硬盘分区的,如果丢失或者破坏的话,硬盘的分区就会丢失。分区表占用了64个字节,用每16个字节来描述一个分区项的数据结构。由于其字节数的限制,一个硬盘最多可以有4个主硬盘分区(注意,是主硬盘分区)。图640中框住的部分就是一个分区表项,可以看出,MBR中只有两个分区表项。硬盘中的磁盘可以分为主磁盘分区和扩展分区,使用过DOS命令中的FDISDK的话应该很清楚。通常情况下,主分区是C盘。在系统中除了C盘以外,还可能存在D盘、E盘、F盘等分区,这3个分区都是从扩展分区中分配出来的,而这些分区并不在MBR中保存。右键单击“我的电脑”,在菜单中选择“管理”命令将出现“计算机管理”这个程序,选择“磁盘管理”,显示如图6-41所示的窗口。
可以看出,在磁盘上,D盘、E盘、F盘、G盘的周围有一个绿色的框,这个框就表示为扩展分区。
下面具体地介绍一下。单击WinHex的菜单项“视图”→“模板管理”命令,出现如图6-42所示的对话框
在模板管理器对话框中苏昂机MASTERBOOTRECORD,也就是主引导记录,出现如图6-43所示的MBR的偏移解析器。
可以清晰的看到两个分区表项的内容,分别是PARTITONTABLEENTRY#1和PARTITIONTABLEENTRY#2,对我们有用的字段已经用框选中,下面介绍PARTITIONTABLEENTRY#1中对于我们有用的几个字段,第一个是在MBR中偏移为0x1BE的位置,这个位置的值为0x80,该值室一个引导标志,表示该分区是一个活动分区,在MBR中偏移0X1C2的位置处保存的值为0x07,这个值表示的是分区的类型,0x07表示该值为nts的系统文件格式,在偏移0x1c6的位置处保存的值为63,该值表示在本分区前使用了多少个扇区,这里表示当前分区前使用了63个扇区,最后一个0x1ca处保存的值为16386237,该位置表示本分区的总扇区数,一个扇区有512个字节数,那个16386237个扇区是多大呢?我们计算一下,首先用16386237x512求出本扇区占了多少字节,通过计算获得本分区所占字节数为8389153344字节,那么字节如何转换成GB呢?这是一个简单的公式,1024字节等于1KB,1024KB等于1MB,1024MB等于1GB,那么做一个简单的除法就可以了,用8389753344/1024/1024/1024就得出了当前分区是多少GB了,得出的结果如图6-44所示。
当前的分区占用了7.81个GB的大小(c盘大小为7.81GB)。关于Partitimr-Table Entry #2大家可以自己进行分析.这里就不介绍了。
在MBR中还有最后一个内容,如图6-40所示,在图6-40中紧接着DPT后面的两个字节就是MBR中最后的两个字节,这两个字节是mbr结束标志,用“55 AA”表示.引导程序会判断MBR扇区的最后两个字节是否为“55 AA”,如果不是则报错。
到此,关于MBR的部分就介绍完了,相信大家己对MBR有了比较全面的了解。下面来写一个简单的程序将上面的通过WinHex分析的内容解析出来。
通过程序解析MBR
对于我们来说,解析MBR可能不会有太大的问题,因为前面解析过PE文件结构。虽然解析过PE文件,但是还是有一些微小的几点差别,首先造成解析困难的一点是MBR没有给出具体的结构体。当初分析PE文件结构时,各个结构体在WinNt,h头文件中都有给出定义,而MBR的定义是没有给出的。因此上面也没有对照着结构体给大家介绍。再一个问题是,解析PE文件结构时,我们会打开具体的可执行文件去按照PE文件结构的定义进行解析,而硬盘的引导区属于哪个文件?用WinHex打开的是物理硬盘,那么我们如何来打开物理硬盘。这可能是两个比较困惑的地方。不过,这些都不是太大的问题。只要我们解决了这两个问题,我们的解析其实就容易多了。
自定义MBR的各种结构体
下面介绍如何将MBR的信息定义成一个个的结构体,通过前面用Winhex对MBR的手动分析,我们了解到MBR分为五部分。并且知道每部分占用的字节数,因此,可以将MBR定义为如下:
这就是定义的MBR了,引导程序共440个个字节,Windows签名共4个字节,保留字节共2个字节,分区表共64个字节,再加上2个结束标志,一工512个字节。不过这样的定义并不好,因为里面的常量比较多,下面修改一下,定义如下:这样定义后,可以很方便地获得引导程序的大小和分区表的大小。虽然这样定义直观一些,但是还不能算太直观,因为定义的都是unsigned-char类型,无法真正反映出每个成员变量的具体含义。下面再次进行修改,定义如下:
这次修改后,可以很容易地从MBR这个结构体中看出主要两个成员娈量的含义了。虽然直观了,但还是有问题。Dpt其实是一个有4条记录的表,也就是说它其实是一个数组,这样的定义当解析它的时候并不方便。这样的定义方便我们一次性将DPT读出,只要再定义一个DP的结构体来对DPT进行转换,就可以方便地对DPT进行解析了。下面再次定义一个结构体,定义如下:有了这个结构体,就可以方便地对DPT进行解析了。最后两个定义就是对MBR各结构体的完整定义(这几个结构体是笔者自己定义的,可以会有很多考虑不周的地方,网上有公开的结构体的定义,大家可以白行参考。之所以如此反复介绍如何进行MBR结构体的定义,是想告诉大家一个在没有相关数据结构定义的情况下如何通过自己的分析来定义数据结构的思路和方法)。
大家想考一下,如果不定义这些结构体是不是就无法对MBR进行解析,定义了这些结构体后对于解析MIIR有哪些影响。对于MBR的解析,可以完全不定义这些结构体,定义这些结构体的目的是方便对程序的后期维护,并使程序在整体上有一个良好的格式。定义数据结构可以清晰地表达各个数据结构之间的关系,让我们在写程序的过程中有一个清晰的思路.让看程序的人也可以一日了然。
硬盘设备的符号链接
有了上面的结构体,解析MBR已经不是太大的问题了。不过还有一个问题,那就是如何打开硬盘读取MBR。其实很简单,只要打开硬盘设备提供的设备符号链接就可以了。如何找到硬盘的设备符号链接呢?有一款工具WinObj可以帮助查找到。打开winobj.再依次打开左边的树形控件.
可以找到硬盘设备的设备名,例如可以通过\Device\harddisk0\dr0这个设备名再去查找相应的设备符号链接,我们在一次打开winobj左边的树形控件,如图6-46所示。
可以看到硬盘的设备符号链接为physicaidrive0,在使用时应该书写为\\.\physicadrive0.
下面简单的介绍一下设备名和设备符号链接,每个设备在Windows的内核中都有对应的驱动模块,在驱动模块中回味设备提供一个名字来对设备进行操作,驱动模块中提供的名字即为设备名,设备名只能在内核模块中使用,如果想要应用程序下对设备进行操作,不能直接使用设备名,应该使用设备符号链接,设备符号链接就是驱动模块为应用程序提供的操作设备的一个符号,通过这个符号可以与设备进行对应。
解析MBR的程序实现
到了这里大家可能会觉得通过程序解析MBR已经不是问题了,下面直接提供程序的代码吧。如果代码中有不理解的地方,可以参考一下我们是如何通过WINHEX对mbr的解析了,代码如下:
代码非常短,也不复杂,看起来跟读写文件没什么太大的差别,其实就是在读写文件。
前面介绍过,windows将各种设备都当作文件来看待,因此打开硬盘设备的时候直接使用CreateFile0函数就可以了。关于MBR的部分就介绍到这里了。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。