前言

引导型病毒指寄生在磁盘引导区或主引导区的计算机病毒。这种病毒利用系统引导时,不对主引导区的内容正确与否进行判别的缺点,在引导系统的过程中入侵系统,驻留内存,监视系统运行,伺机传染和破坏。按照引导型病毒在硬盘上的寄生位置又可细分为主引导记录病毒和分区引导记录病毒。我们未来的几次课,会专门从各个角度来分析这种病毒的特点,阐述病毒原理,提出应对方法。而本次课程的内容主要来讨论一下引导区的解析。

通过WinHex来手动解析引导区

WinHex是一个强大的十六进制编辑工具,也是一个强大的磁盘编辑工具。这里我们打开WinHex,选择菜单栏中的“工具”->“打开磁盘”,选择“物理磁盘”中的“HD0”。

当打开磁盘后,会看到很多十六进制数据,这些数据一眼看上去难以理解,但是当根据其各种不同的结构进行解析后就一目了然了。因此,重要的是学习其各种结构。这里不对硬盘中涉及的全部结构进行介绍(指的是文件格式),主要介绍一下组成引导区的各个结构体。

引导区,也叫做主引导记录(MasterBoot Record,简称MBR)。MBR位于整个硬盘的0柱面0磁头1扇区的位置。MBR在计算机引导过程中起着重要的作用。MBR可以分为五部分,分别是引导程序、Windows磁盘签名、保留位、分区表和结束标志。这五部分构成了一个完整的引导区,引导区的大小为512个字节。我们通过WinHex来具体看一下每一部分的内容,来了解一下这512个字节的作用。

首先看一下引导记录,如下图所示:

上图的红框中就是MBR的引导程序,也就是从偏移为0的位置,到偏移为0x1b7处。引导程序会判断MBR的有效性,判断磁盘分区的合法性,并且把控制权交给操作系统。引导程序占用了MBR的前440个字节(0x0——0x1b7)。

再来看一下Windows的磁盘签名,如下图所示:

上图中位于偏移0x1b8——0x1bb位置的内容就是Windows的磁盘签名,也就是紧接着引导程序的4个字节。Windows磁盘签名对于MBR来说不是必须的,但是对于Windows系统来说是必须的,它是Windows系统在初始化时写入的,Windows依靠磁盘签名来识别硬盘,如果该签名丢失,则Windows认为该磁盘没有被初始化。可以看到,上图中的磁盘签名为0xf63af73a。

紧接着在磁盘签名后面的两个字节是保留字节,也就是暂时没有被MBR使用的位置。在这里,保留字节全为0。

在保留字节后面的64个字节,则保存了分区表:

分区表在MBR中占据了64个字节的位置(0x1be——0x1fd),分区表被称为DPT(DiskPartition Table),它在MBR中是一个非常关键的数据结构。分区表是用来管理硬盘分区的,如果丢失或者被破坏的话,硬盘的分区就会丢失。分区表占用了64个字节,用每16个字节来描述一个分区项的数据结构。由于其字节数的限制,一个硬盘最多可以有4个主硬盘分区(注意:是主硬盘分区)。上图中的红框部分就是一个分区表项,可以看到,当前硬盘中只有一个分区表项。硬盘中的磁盘可以分为主磁盘分区和扩展分区,使用过DOS命令中的FDISK的话应该很清楚。通常情况下,主分区是C盘。在系统中除了C盘以外,还可能存在D盘、E盘、F盘等分区。这3个分区都是从扩展分区中分配出来的,而这些分区并不在MBR中保存。右键单击“我的电脑”,在菜单中选择“管理”命令将出现“计算机管理”,选择“磁盘管理”,就可以显示如下内容:

从上图中可以看到,在磁盘上,D盘、E盘的周围有一个绿色的框,这个框就表示扩展分区。

下面具体地介绍一下。单击WinHex的菜单项“视图”->“模版管理”,就会出现“模版管理器对话框”:

这里我们双击“主引导记录”,就会打开MBR的偏移解析器:

在上图中可以清晰地看到分区表项的内容,红框中的内容就是对我们有用的字段。其中第一个是在MBR中偏移为0x1be的位置,这个位置的值为0x80。这个值是一个引导标志,表示该分区是一个活动分区。在MBR中偏移为0x1c2的位置处保存的值为0x07,这个值表示的是分区的类型,0x07说明是NTFS的系统文件格式。在偏移0x1c6的位置处,保存的值是63,该值表示在本分区前使用了多少个扇区。那么63说明当前分区前使用了63个扇区。最后的0x1ca处保存的值为41913522,表示本分区的总的扇区数目。一个扇区有512个字节,那么41913522扇区是多大呢?我们可以计算一下,首先用41913522×512求出本扇区占多少个字节。通过计算获得本分区所占的字节数为21459723264字节,那么字节如何转化成GB呢?这是一个简单的公式,1024字节等于1KB,1024KB等于1MB,1024MB等于1GB,那么做一个简单的除法就可以了。用21459723264÷1024÷1024÷1024就得出了当前分区是多少个GB了,如下图所示:

由上图可见,当前分区占用了19个GB的大小。

在MBR中还有最后一个内容,就是紧跟着DPT后面的两个字节,也就是MBR最后的两个字节。这两个字节是MBR的结束标志,用“55 AA”来表示。引导程序会判断MBR扇区的最后两个字节是否为“55 AA”,如果不是则报错。

至此,关于利用WinHex解析MBR的部分就介绍完了,相信大家已经对MBR有了比较全面的认识。

MBR引导程序解析

我们刚才分析过了, MBR的大小为512个字节。其实这些字节在WinHex中观察,就是一大段的十六进制数据,但事实上,它是一段汇编程序的机器码,所以这里我们有必要把这段代码提取出来,利用反汇编工具进行分析。

首先在WinHex中选中这512个字节,然后单击鼠标右键,选择“编辑”->“复制选块”->“置入新文件”,给这个文件起一个名字,比如我这里将其保存为MBR,然后确定。

接下来我们使用IDA来打开这个文件,注意这里使用十六位的模式打开即可(如果大家想查看带有注释的代码,可以利用IDA打开MBR.idb这个文件)。

这段代码的主要功能是将位于0x7C1B位置的内容复制到0x61B的位置,并跳转过去执行。这段指令一共是0x1B字节,在执行完拷贝操作之后,这段代码就不需要了,所以复制的时候只是复制了0x1E5字节的内容,而不是0x200字节。接下来有:

上述代码的功能是通过循环语句来查找活动分区。接下来有:

这段代码是在当分区标志为0x80时执行的,用于继续检查余下的分区表的情况。接下来有:

上述代码会在分区表首字节出现错误的情况下执行,由最后的jmp可以知道,这是一个死循环,用于显示错误信息。接下来有:

这段代码中,如果出现错误,依旧会跳转到出错打印的代码,执行死循环。如果没有错误,则会执行sub_9B,也就是读取扇区的内容。最后有:

最后的这段代码用于检测结束标志位以及FAT32是否做过验证,然后跳转去执行DBR(DOS BOOT RECORD,DOS引导记录)。至此,也就完成了MBR的功能。

小结

我们这次的课程首先利用WinHex给大家手动解析了MBR的构造,之后分析了MBR的引导程序。这些知识都是MBR病毒分析的基础,也是重中之重,希望大家能够掌握,从而为接下来的学习打好基础。

病毒木马查杀实战第023篇:MBR病毒之引导区的解析的更多相关文章

  1. 病毒木马查杀实战第025篇:JS下载者脚本木马的分析与防御

    前言 这次我与大家分享的是我所总结的关于JS下载者脚本木马的分析与防御技术.之所以要选择这样的一个题目,是因为在日常的病毒分析工作中,每天都会遇到这类病毒样本,少则几个,多则几十个(当然了,更多的样本 ...

  2. 病毒木马查杀实战第011篇:QQ盗号木马之专杀工具的编写

    前言 由于我已经在<病毒木马查杀第004篇:熊猫烧香之专杀工具的编写>中编写了一个比较通用的专杀工具的框架,而这个框架对于本病毒来说,经过简单修改也是基本适用的,所以本文就不讨论那些重叠的 ...

  3. 病毒木马查杀实战第010篇:QQ盗号木马之十六进制代码分析

    前言 按照我的个人习惯,在运用诸如IDA Pro与OllyDBG对病毒进行逆向分析之前,我都会利用一些自动化的工具,通过静态或动态的分析方法(参见<病毒木马查杀第008篇:熊猫烧香之病毒查杀总结 ...

  4. 病毒木马查杀实战第009篇:QQ盗号木马之手动查杀

    前言 之前在<病毒木马查杀第002篇:熊猫烧香之手动查杀>中,我在不借助任何工具的情况下,基本实现了对于"熊猫烧香"病毒的查杀.但是毕竟"熊猫烧香" ...

  5. 病毒木马查杀实战第024篇:MBR病毒之编程解析引导区

    前言 通过之前的学习,相信大家已经对磁盘的引导区有了充分的认识.但是我们之前的学习都是利用现成的工具来对引导区进行解析的,而对于一名反病毒工程师而言,不单单需要有扎实的逆向分析功底,同时也需要有很强的 ...

  6. 病毒木马查杀实战第020篇:Ring3层主动防御之基本原理

    前言 假设说我们的计算机中安装有杀毒软件,那么当我们有意或无意地下载了一个恶意程序后.杀软一般都会弹出一个对话框提示我们,下载的程序非常可能是恶意程序,建议删除之类的.或者杀软就不提示.直接删除了:或 ...

  7. 病毒木马查杀实战第015篇:U盘病毒之脱壳研究

    前言 因为我们的终于目标是编写出针对于这次的U盘病毒的专杀工具.而通过上次的分析我们知道,病毒有可能在不同的计算机中会以不同的名称进行显示.假设真是如此,那么就有必要在此分析出病毒的命名规律等特征,然 ...

  8. 病毒木马查杀实战第017篇:U盘病毒之专杀工具的编写

    前言 经过前几次的讨论,我们对于这次的U盘病毒已经有了一定的了解,那么这次我们就依据病毒的行为特征,来编写针对于这次U盘病毒的专杀工具. 专杀工具功能说明 因为这次是一个U盘病毒,所以我打算把这次的专 ...

  9. 病毒木马查杀实战第022篇:txt病毒研究

    前言 反病毒爱好者们非常喜欢讨论的一个问题就是,现在什么样的病毒才算得上是主流,或者说什么样的病毒才是厉害的病毒呢?我们之前的课程所解说的都是Ring3层的病毒.所以有些朋友可能会觉得.那么Ring0 ...

随机推荐

  1. Prometheus时序数据库-数据的插入

    Prometheus时序数据库-数据的插入 前言 在之前的文章里,笔者详细的阐述了Prometheus时序数据库在内存和磁盘中的存储结构.有了前面的铺垫,笔者就可以在本篇文章阐述下数据的插入过程. 监 ...

  2. Java基础语法学习

    Java基础语法学习 1. 注释 单行注释: //单行注释 多行注释: /*多行注释 多行注释 多行注释 多行注释 */ 2. 关键字与标识符 关键字: Java所有的组成部分都需要名字.类名.变量名 ...

  3. 从Android手机的抢红包插件说起

    前语 最近,Android手机上的手机管家更新了新版本,提供了红包闹钟功能,只要有微信红包或者QQ红包,就会自动提醒.恰逢最近又在做UI自动化的工作,使用到UI Automator框架.几行代码,就可 ...

  4. 【LeetCode】2020-03 每日一题

    121. 买卖股票的最佳时机(简单) [分类]:模拟.思维 [题解]:可以用O(n)的复杂度完成,只需要在遍历的时候记录到当前位置为止买入股票的最小价格minn,再维护一个当前卖出股票价(a-minn ...

  5. Linux入门视频笔记一(基本命令)

    一.简单命令 1.date:当前时间 2.cal:当前日期(日历格式) ①cal 2019:2019年全年日历 ②cal 1 2019:2019年1月份 二.Linux文件结构 1.根目录:root( ...

  6. 周期串(JAVA语言)

    package 第三章习题; /*  * 如果一个字符可以由某个长度为k的字符串重复多次得到,则称该串以k为周期.  * 例如:abcabcabcabc 以3为周期(注意:它也以6和12为周期)  * ...

  7. 使用ant design vue的日历组件,实现一个简单交易日与非交易日的切换

    使用ant design vue的日历组件,实现一个简单交易日与非交易日的切换 需求: 日历区分交易日.非交易日 可以切换面板查看整年交易日信息 可以在手动调整交易日.非交易日 演示实例 序--使用软 ...

  8. Hibernate的Dao层通用设计

    hibernate作为一款优秀的数据库持久化框架,在现实的运用中是非常广泛的.它的出现让不熟悉sql语法的程序员能开发数据库连接层成为一种可能,但是理想与现实永远是有差距的.开发过程中如果只使用hql ...

  9. 用 customRef 做一个防抖函数,支持 element 等UI库。

    这几天学习Vue的官网,看到 customRef 提供了一个例子,研究半天发现这是一个防抖函数,觉得挺好,于是把这个例子扩展了一下,可以用于表单子控件和查询子控件. 需求 v-model 基于 ele ...

  10. 前端学习 node 快速入门 系列 —— 报名系统 - [express]

    其他章节请看: 前端学习 node 快速入门 系列 报名系统 - [express] 最简单的报名系统: 只有两个页面 人员信息列表页:展示已报名的人员信息列表.里面有一个报名按钮,点击按钮则会跳转到 ...