首页 > 逆向调试 > MBR基本结构

MBR基本结构

近两年MBR病毒还是不少见的,闹得比较大的有“鬼影”病毒、BMW病毒等。所以我觉得还是有必要了解一下MBR的相关知识,最好能找个样本分析下。

MBR定义

MBR全称Master Boot Record,中文叫做“主引导记录”,又叫做“主引导扇区”,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的地址为0柱面0磁道1扇区。MBR 的主要作用是检查分区状态,寻找活动分区,并将控制权交给活动分区引导记录DBR,再由分区引导程序加载操作系统。标准MBR的结构如下:
MBR基本结构
主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。MBR是由分区程序所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导。
硬盘分区表占据主引导扇区的64个字节(偏移0x01BE至偏移0x01FD),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。具体每个字节的定义可以参见硬盘分区结构信息:
硬盘分区表结构
结束标志字0×55和0xAA是主引导扇区的最后两个字节,是检验主引导记录是否有效的标志。

查看MBR

可以使用WinHex来查看MBR,方法为:打开WinHex,然后在菜单栏选择“工具”、“打开磁盘”,在“物理驱动器”一栏选择自己的硬盘打开就可以了。同时,可以选中MBR之后,通过WinHex的“编辑”菜单下的“复制选块”、“到新文件”来保存MBR,方便反汇编。

其实MBR就是存在于主硬盘的最前头的512个字节的数据,所以也可以自己写个程序读就是了。一般的电脑就一块硬盘,所以可以使用CreateFile这个API去打开\\.\PHYSICALDRIVE0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// File: Mbr2File.c
// Author: 代码疯子
// Blog: Http://Www.ProgramLife.Net/
#include <windows.h>
#include <stdio.h>
 
#define FIRST_HARD_DISK TEXT("\\\\.\\PHYSICALDRIVE0")
#define MBR_DATA_LENGTH 512
#define DUMP_FILE_NAME TEXT("MBR.bin")
 
int main(int argc, char *argv)
{
    HANDLE hFile = INVALID_HANDLE_VALUE;
    BYTE pbMbr[MBR_DATA_LENGTH] = {0};
    DWORD dwVal = 0;
    BOOL bRet = FALSE;
 
    hFile = CreateFile(
                FIRST_HARD_DISK,
                GENERIC_READ,
                FILE_SHARE_READ,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("Open disk failure with error code %d\n", GetLastError());
        return 1;
    }
 
    bRet = ReadFile(hFile, pbMbr, MBR_DATA_LENGTH, &dwVal, NULL);
    if (!bRet)
    {
        printf("Read MBR failure with error code %d\n", GetLastError());
        CloseHandle(hFile);
        return 1;
    }
    CloseHandle(hFile);
 
    hFile = CreateFile(
        DUMP_FILE_NAME,
        GENERIC_WRITE,
        FILE_SHARE_READ,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("Create dump file failure with error code %d\n", GetLastError());
        return 1;
    }
 
    bRet = WriteFile(hFile, pbMbr, MBR_DATA_LENGTH, &dwVal, NULL);
    if (!bRet)
    {
        printf("Dump data to file failure with error code %d\n", GetLastError());
        CloseHandle(hFile);
        return 1;
    }
    CloseHandle(hFile);
 
    printf("Dump MBR to file succeed, press ENTER to continue...\n");
    getchar();
 
    return 0;
}

Reference
维基百科:主引导记录(http://zh.wikipedia.org/wiki/MBR
看雪论坛:神奇的MBR(http://bbs.pediy.com/showthread.php?t=120613


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> MBR基本结构
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2012年2月1日21:34 | #1

    学习了,了解操作系统必备的知识点

    [回复]

    代码疯子 回复:

    @the5fire的技术博客, 呵呵,这个简单介绍看看WIKI就好了,试着看了下汇编代码,但家里上网不方便就暂时没看了

    [回复]

  2. Drizzt
    2012年2月11日14:07 | #2

    啊,多谢楼主了。原来winhex还有这个用途。
    PS:你的博客里面内容真的很实用。 [em019]

    [回复]

    Drizzt 回复:

    @Drizzt, 再请教下,保存了MBR文件以后,怎么反汇编这个文件?是不是只反汇编MBR前面的代码区?谢谢

    [回复]

    代码疯子 回复:

    @Drizzt, 用IDA Pro吧。把MBR代码用IDA打开,选择16位模式(MBR是16位汇编)

    [回复]

    Drizzt 回复:

    @代码疯子, 好的,谢谢你。觉得看这个比起汇编书籍爽多了!

    [回复]

    代码疯子 回复:

    @Drizzt, 不用客气。有汇编基础的话看点反汇编代码还是有意思多了。 [em022]

    [回复]