Windows操作系统学习之——启动引导过程调试

2026/1/27 17:05:46

Windows操作系统学习之——启动引导过程调试

关于Windows的启动引导过程,相信很多大牛都了如指掌,这里只是将自己的学习过程分享,文章中肯定有很多理解的不是很到位的地方,还望各位牛指点。

一、MBR调试

关于MBR的调试,网上也有好多帖子了,这个帖子也只是把我的学习过程分享出来,如果可以,我会从MBR开始,一步一步的去调试,去学习Windows操作系统,同时也把这个过程分享出来。闲话不多说了,开始进入主题。 目前用到的工具: 虚拟机:VMware

系统:ReactOS.0.3.15(安装win7 32位或者XP系统也可以用这个方法调试,这里选择ReactOS是为了后面的调试做准备)

调试工具:IDA 首先设置虚拟机。在VMware创建的系统文件夹下找到.vmx文件,用记事本打开,添加如下配置信息 代码:

debugStub.listen.guest32 = \debugStub.hideBreakpoints = \bios.bootDelay = \

然后设置IDA。打开IDA,Debugger-->Attach-->Remote GDB debugger,在弹出的对话框进行如下设置

启动虚拟机后,再点击IDA弹出的对话框的\按钮,选择第一个进程,点\,如下图

进入调试窗口后,转到0x7c00处,按\下断点,然后按\运行程序,当程序断下来之后,按\,选择16位编码,这时反汇编可能会变成一堆数据,我们只要将其选中(446个字节),然后按“C”,选择“Force”,将数据强行转换成代码即可。

接下来就开始我们的调试了,先看下面的代码 代码:

MEMORY:7C00 loc_7C00: ; CODE XREF: MEMORY:loc_7CAEJ MEMORY:7C00 cli MEMORY:7C01 cld

MEMORY:7C02 xor ax, ax MEMORY:7C04 mov ss, ax MEMORY:7C06 mov ds, ax MEMORY:7C08 mov bp, 7C00h

MEMORY:7C0B lea sp, [bp-20h] MEMORY:7C0E sti

MEMORY:7C0F mov ax, 1FE0h MEMORY:7C12 mov es, ax MEMORY:7C14 assume es:nothing MEMORY:7C14 mov si, bp MEMORY:7C16 mov di, bp MEMORY:7C18 mov cx, 100h

MEMORY:7C1B rep movsw ; 把MBR移动到1FE0h:7C00h处 MEMORY:7C1D jmp far ptr 1FE0h:7C22h

这段代码很简单,就是把MBR拷贝到1FE0h:7C00h处,然后跳转到1FE0h:7C22h继续执行。接下来是在分区表中查找活动分区,看代码 代码:

MEMORY:27A22 loc_27A22: ; CODE XREF: MEMORY:7C1DJ MEMORY:27A22 mov ds, ax MEMORY:27A24 assume ds:MEMORY MEMORY:27A24 mov ss, ax MEMORY:27A26 assume ss:MEMORY MEMORY:27A26 xor ax, ax MEMORY:27A28 mov es, ax

MEMORY:27A2A lea di, [bp+1BEh] ; 获取分区表地址 MEMORY:27A2E test byte ptr [di], 80h ; 是否是活动分区 MEMORY:27A31 jnz short loc_7AA0附件 6243

MEMORY:27A33 add di, 10h ; 每个分区表项大小为16个字节 MEMORY:27A36 cmp di, 7DFEh ; 分区表搜索是否结束 MEMORY:27A3A jb short loc_7A2E

这里需要对MBR有所了解才行。MBR是磁盘的第一个扇区,占512个字节(每个扇区都是512个字节)。前446个字节是引导代码,接下来的64个字节是分区表,共四个表项,最后两个字节是结束标志0xAA55。分区表每个表项16个字节,第一个字节是分区标记,表示这个分区是不是活动分区(0x80为活动分区,否则为0)。如下图所示

上面这段代码就是检测每个分区表项的第一个字节是不是0x80,如果是就跳转。我们接下来看跳转过去的代码 代码:

MEMORY:27AA0 call loc_7AB3 MEMORY:27AA3 jb short loc_7A5B

MEMORY:27AA5 cmp es:word_7DFE, 0AA55h MEMORY:27AAC jnz short loc_7A7F MEMORY:27AAE jmp far ptr loc_7C00 跳转过来就是一个call,我们跟进去看看。 代码:

MEMORY:27AB3 mov bx, 55AAh

MEMORY:27AB6 mov ah, 41h ; 'A'

MEMORY:27AB8 int 13h ; DISK - Check for INT 13h Extensions MEMORY:27AB8 ; BX = 55AAh, DL = drive number MEMORY:27AB8 ; Return: CF set if not supported MEMORY:27AB8 ; AH = extensions version MEMORY:27AB8 ; BX = AA55h

MEMORY:27AB8 ; CX = Interface support bit map MEMORY:27ABA jb short loc_7AEE MEMORY:27ABC cmp bx, 0AA55h MEMORY:27AC0 jnz short loc_7AEE MEMORY:27AC2 test cl, 1

MEMORY:27AC5 jz short loc_7AEE MEMORY:27AC7 jmp short loc_7AD9

这里其实是检测int 13h的拓展功能可不可以用,如果可用,则跳转到1FE0h:7AD9h处,否则跳转到1FE0h:7AEEh处。我们先来看1FE0h:7AEEh处的代码 代码:

MEMORY:27AEE mov ax, 204h MEMORY:27AF1 mov bx, 7C00h

MEMORY:27AF4 mov cx, [di+2] ;di为分区表首地址 MEMORY:27AF7 mov dh, [di+1]

MEMORY:27AFA int 13h ; DISK - READ SECTORS INTO MEMORY MEMORY:27AFA ; AL = number of sectors to read, CH = track, CL = sector

MEMORY:27AFA ; DH = head, DL = drive, ES:BX -> buffer to fill MEMORY:27AFA ; Return: CF set on error, AH = status, AL = number of sectors read

MEMORY:27AFC retn

这里其实是使用了int 13h来读取扇区数据(不是拓展功能),先来看看介绍: int 13h,ah=02h 读扇区说明:

调用此功能将从磁盘上把一个或更多的扇区内容读进存贮器。因为这是一个 低级功能,在一个操作中读取的全部扇区必须在同一条磁道上(磁头号和磁道号 相同)。BIOS不能自动地从一条磁道末尾切换到另一条磁道开始,因此用户必须 把跨多条磁道的读操作分为若干条单磁道读操作。 入口参数:

AH=02H 指明调用读扇区功能。

AL 置要读的扇区数目,不允许使用读磁道末端以外的数值,也不允许 使该寄存器为0。

DL 需要进行读操作的驱动器号。 DH 所读磁盘的磁头号。 CH 磁道号的低8位数。

CL 低5位放入所读起始扇区号,位7-6表示磁道号的高2位。 ES:BX 读出数据的缓冲区地址。 返回参数:

如果CF=1,AX中存放出错状态。读出后的数据在ES:BX区域依次排列。

详情请参见磁盘错误状态返回码一文。

由此可知,上面的代码是读取4个扇区的数据到1FE0h:7C00h处,读取的偏移由分区表的起始CHS确定。接下来我们来看1FE0h:7AD9h处的代码 代码:

MEMORY:27AC9 db 10h MEMORY:27ACA db 0 MEMORY:27ACB db 4 MEMORY:27ACC db 0 MEMORY:27ACD db 0 MEMORY:27ACE db 7Ch ; | MEMORY:27ACF db 0 MEMORY:27AD0 db 0

MEMORY:27AD1 word_27AD1 dw 0 ; DATA XREF: MEMORY:7CDCw MEMORY:27AD3 word_27AD3 dw 0 ; DATA XREF: MEMORY:loc_7CE2w MEMORY:27AD5 db 0 MEMORY:27AD6 db 0 MEMORY:27AD7 db 0 MEMORY:27AD8 db 0

MEMORY:27AD9 ; --------------------------------------------------------------------------- MEMORY:27AD9 mov ax, [di+8] MEMORY:27ADC mov word_7CD1, ax MEMORY:27ADF mov ax, [di+0Ah] MEMORY:27AE2 mov word_7CD3, ax MEMORY:27AE5 mov ax, 4200h MEMORY:27AE8 mov si, 7CC9h

MEMORY:27AEB int 13h ; DISK - IBM/MS Extension - EXTENDED READ (DL - drive, DS:SI - disk address packet) MEMORY:27AED retn

这里其实也是读取扇区数据,不过使用的是int 13h的拓展功能来读取。我们先来了解下int 13h的拓展功能怎么读取数据 入口: AH = 42h DL = 驱动器号

DS:SI = 磁盘地址数据包(Disk Address Packet) 返回:

CF = 0,AH = 0 成功 CF = 1,AH = 错误码

这里涉及到一个结构体,我们先看这个结构体: struct DAP{

BYTE PacketSize; //数据包尺寸,固定为0x10 BYTE Reserved; //保留

WORD BlockCount; //要传输的扇区数


Windows操作系统学习之——启动引导过程调试.doc 将本文的Word文档下载到电脑
搜索更多关于: Windows操作系统学习之——启动引导过程调试 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219