一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:460500587
微信公众号:计算机与网络安全
ID:Computer-network
很多病毒会感染磁盘的引导区,这导致了病毒在系统启动前就会执行病毒。下面介绍一下引导区的知识,并写一个程序来简单地解析一下引导区。在整个过程中,编写程序不是难点,难点在于引导区的各个数据结构和各结构之间的数据关系。
为了能写出程序,先进行一次对引导区的手动分析,使用的工具是WinHex。
一、通过WinHex来手动解析引导区
WinHex是一个强大的十六进制编辑工具,也是一个强大的磁盘编辑工具。打开WinHex,并打开磁盘,如图1、图2和图3所示。
图1 WinHex工具栏
图2 选择物理磁盘
图3 打开后的位置
当打开磁盘后,会看到很多密密麻麻的十六进制数据,这些数据很像学习PE文件结构时的情况。一眼看上去不能理解,当根据其各种不同的结构进行解析后就一目了然了。因此,重要的是学习其各种结构。这里介绍一下组成引导区的各个结构体。
引导区,也叫主引导记录(Master Boot Record,简称MBR)。MBR位于整个硬盘的0柱面0磁头1扇区的位置处。MBR在计算机引导过程中起着重要的作用。MBR可以分为五部分,分别是引导程序、Windows磁盘签名、保留位、分区表和结束标志。这五部分构成了一个完整的引导区,引导区的大小为512个字节。我们通过WinHex来具体查看一下每一部分的内容,来了解一下这512个字节的作用。
首先来看一下引导记录,如图4所示。
图4 MBR的引导程序
在图4中被选中的地方就是MBR的引导程序。引导程序会判断MBR的有效性,判断磁盘分区的合法性,及把控制权交给操作系统。引导程序占用了MBR的前440字节。
再来看一下Windows的磁盘签名,如图5所示。
图5 MBR中的Windows磁盘签名
在图5中被选中的位置就是Windows的磁盘签名,它的位置在紧接引导程序的第4个字节。Windows磁盘签名对于MBR来说不是必须的,但是对于Windows系统来说是必须的,它是Windows系统在初始化时写入的,Windows依靠磁盘签名来识别硬盘,如果该签名丢失则Windows认为该磁盘没有被初始化。在图5中,Windows的磁盘签名为“0xBF5FBF5F”。
紧接在磁盘签名后的两个字节是保留字节,也就是暂时没有被MBR使用的位置。
在保留的两个字节后的64个字节,则保存了分区表,如图6所示。
图6 MBR中的分区表
分区表在MBR中占用了64个字节的位置,分区表被称为DPT(Disk Partition Table),它在MBR中是一个非常关键的数据结构。分区表是用来管理硬盘分区的,如果丢失或者破坏的话,硬盘的分区就会丢失。分区表占用了64个字节,用每16个字节来描述一个分区项的数据结构。由于其字节数的限制,一个硬盘最多可以有4个主硬盘分区(注意,是主硬盘分区)。图6中框住的部分就是一个分区表项,可以看出,MBR中只有两个分区表项。硬盘中的磁盘可以分为主磁盘分区和扩展分区,使用过DOS命令中的FDISDK的话应该很清楚。通常情况下,主分区是C盘。在系统中除了C盘以外,还可能存在D盘、E盘、F盘等分区,这3个分区都是从扩展分区中分配出来的,而这些分区并不在MBR中保存。右键单击“我的电脑(或计算机)”,在菜单中选择“管理”命令将出现“计算机管理”这个程序,选择“磁盘管理”,显示如图7所示的窗口。
图7 磁盘管理
从图7中可以看出,在磁盘上,D盘、E盘、F盘、G盘的周围有一个绿色的框,这个框就表示为扩展分区。
下面具体地介绍一下。单击WinHex的菜单项“视图”->“模板管理”命令,出现如图8所示的对话框。
图8 模板管理器
在“模板管理器”对话框中双击“Master Boot Record”,也就是主引导记录,出现如图9所示的MBR的偏移解析器。
图9 MBR偏移解析器
在图9中可以清晰地看到两个分区表项的内容,分别是Partition Table Entry #1和Partition Table Entry #2。对我们有用的字段已经用框选中。下面介绍Partition Table Entry #1中对于我们有用的几个字段。第一个是在MBR中偏移为0x1BE的位置,这个位置的值为0x80。该值是一个引导标志,表示该分区是一个活动分区。在MBR中偏移0x1C2的位置处保存的值为0x07,这个值表示的是分区的类型,0x07表示该值为NTFS的系统文件格式。在偏移0x1C6的位置处保存的值为63,该值表示在本分区前使用了多少个扇区,这里表示当前分区前使用了63个扇区。最后一个0x1CA处保存的值为16386237,该位置表示本分区的总扇区数。一个扇区有512个字节数,那个16386237个扇区是多大呢?我们计算一下,首先用16386237 × 512求出本扇区占多少字节。通过计算获得本分区所占字节数为8389753344字节,那么字节如何转换成GB呢?这是一个简单的公式,1024字节等于1KB,1024KB等于1MB,1024MB等于1GB,那么做一个简单的除法就可以了。用8389753344/1024/ 1024/1024就得出了当前分区是多少个GB了,得出的结果如图10所示。
图10 第一个分区的大小
从图10可以看出,当前的分区占用了7.81个GB的大小(C盘大小为7.81GB)。关于Partition Table Entry#2大家可以自己进行分析,这里就不介绍了。
在MBR中还有最后一个内容,如图6所示。在图6中紧接着DPT后面的两个字节就是MBR中最后的两个字节。这两个字节是MBR的结束标志,用“55AA”表示。引导程序会判断MBR扇区的最后两个字节是否为“55AA”,如果不是则报错。
到此,关于MBR的部分就介绍完了,相信大家已对MBR有了比较全面的了解。下面来写一个简单的程序将上面的通过WinHex分析的内容解析出来。
二、自定义MBR的各种结构体
下面介绍如何将MBR的信息定义成一个个的结构体。通过前面用WinHex对MBR的手动分析,我们了解到MBR分为五部分,并且知道每部分占用的字节数。因此,可以将MBR定义为如下:
这就是定义的MBR了,引导程序共440个字节,Windows签名共4个字节,保留字节共2个字节,分区表共64个字节,再加上2个结束标志,一共512个字节。不过这样的定义并不好,因为里面的常量比较多,下面修改一下,定义如下:
这样定义后,可以很方便地获得引导程序的大小和分区表的大小。虽然这样定义直观一些,但是还不能算太直观,因为定义的都是unsignedchar类型,无法真正反映出每个成员变量的具体含义。下面再次进行修改,定义如下:
这次修改后,可以很容易地从MBR这个结构体中看出主要两个成员变量的含义了。虽然直观了,但还是有问题。DPT其实是一个有4条记录的表,也就是说它其实是一个数组,这样的定义当解析它的时候并不方便。这样的定义方便我们一次性将DPT读出,只要再定义一个DP的结构体来对DPT进行转换,就可以方便地对DPT进行解析了。下面再次定义一个结构体,定义如下:
有了这个结构体,就可以方便地对DPT进行解析了。最后两个定义就是对MBR各结构体的完整定义(这几个结构体是自己定义的,可以会有很多考虑不周的地方,网上有公开的结构体的定义,大家可以自行参考。之所以如此反复介绍如何进行MBR结构体的定义,是想告诉大家一个在没有相关数据结构定义的情况下如何通过自己的分析来定义数据结构的思路和方法)。
如果不定义这些结构体是不是就无法对MBR进行解析,定义了这些结构体后对于解析MBR有哪些影响。对于MBR的解析,可以完全不定义这些结构体,定义这些结构体的目的是方便对程序的后期维护,并使程序在整体上有一个良好的格式。定义数据结构可以清晰地表达各个数据结构之间的关系,让我们在写程序的过程中有一个清晰的思路,让看程序的人也可以一目了然。
硬盘设备的符号链接
有了上面的结构体,解析MBR已经不是太大的问题了。不过还有一个问题,那就是如何打开硬盘读取MBR。其实很简单,只要打开硬盘设备提供的设备符号链接就可以了。如何找到硬盘的设备符号链接呢?有一款工具WinObj可以帮助查找到。打开WinObj,再依次打开左边的树形控件,如图11所示。
图11 WinObj找到的硬盘设备
通过图11可以找到硬盘设备的设备名,例如可以通过\Device\Harddisk0\DR0这个设备名再去查找相应的设备符号链接。我们再依次打开WinObj左边的树形控件,如图12所示。
图12 WinObj找到的硬盘设备符号链接
从图12中可以看到硬盘的设备符号链接为PhysicalDrive0 ,在使用时应该书写为\\.\PhysicalDrive0。
下面简单地介绍一下设备名和设备符号链接。每个设备在Windows的内核中都有对应的驱动模块,在驱动模块中会为设备提供一个名字来对设备进行操作,驱动模块中提供的名字即为“设备名”。设备名只能在内核模块中使用。如果想要在应用程序下对设备进行操作,不能直接使用设备名,应该使用设备符号链接。设备符号链接就是驱动模块为应用程序提供的操作设备的一个符号,通过这个符号可与设备进行对应。
四、解析MBR的程序实现
到了这里大家可能会觉得通过程序解析MBR已经不是问题了,下面直接提供程序的代码吧。如果代码中有不理解的地方,可以参考一下我们是如何通过WinHex对MBR的解析了。代码如下:
代码非常短,也不复杂,看起来跟读写文件没什么太大的差别,其实就是在读写文件。前面介绍过,Windows将各种设备都当作文件来看待,因此打开硬盘设备的时候直接使用CreateFile()函数就可以了。关于MBR的部分就介绍到这里了。
微信公众号:计算机与网络安全
ID:Computer-network
【推荐书籍】