楼主: 冰琥珀

[红盟杯]Windows操作系统学习之——MBR调试(一)

[复制链接]
  • TA的每日心情
    奋斗
    2017-1-16 20:03
  • 签到天数: 116 天

    [LV.6]常住居民II

    发表于 2015-4-22 00:42:45 | 显示全部楼层 |阅读模式
    ##########################################
    #  Title    : Windows操作系统学习之——MBR调试(一)
    #  Time   :2015年04月22日
    #  Team  :ihonker Team
    #  Author : 冰琥珀
    #  首发   :  52pojie 投稿至 ihonker.org
    #######################################

            以前的帐号居然还在,既然如此,就来支持下吧

            关于MBR的调试,网上也有好多帖子了,这个帖子也只是把我的学习过程分享出来,如果可以,我会从MBR开始,一步一步的去调试,去学习Windows操作系统,同时也把这个过程分享出来。闲话不多说了,开始进入主题。
            目前用到的工具:
            虚拟机:VMware
            系统:ReactOS.0.3.15(安装win7 32位或者XP系统也可以用这个方法调试,这里选择ReactOS是为了后面的调试做准备)
            调试工具:IDA    首先设置虚拟机。在VMware创建的系统文件夹下找到.vmx文件,用记事本打开,添加如下配置信息
    [AppleScript] 纯文本查看 复制代码
    debugStub.listen.guest32 = "TRUE"
    debugStub.hideBreakpoints = "TRUE"
    bios.bootDelay = "3000"

            然后设置IDA。打开IDA,Debugger-->Attach-->Remote GDB debugger,在弹出的对话框进行如下设置
    1.jpg
            启动虚拟机后,再点击IDA弹出的对话框的"OK"按钮,选择第一个进程,点"OK",如下图
    2.jpg
            进入调试窗口后,转到0x7c00处,按"F2"下断点,然后按"F9"运行程序,当程序断下来之后,按"Alt+s",选择16位编码,这时反汇编可能会变成一堆数据,我们只要将其选中(446个字节),然后按“C”,选择“Force”,将数据强行转换成代码即可。
    3.jpg
            接下来就开始我们的调试了,先看下面的代码
    [AppleScript] 纯文本查看 复制代码
    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继续执行。接下来是在分区表中查找活动分区,看代码
    [AppleScript] 纯文本查看 复制代码
    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[attach]6243[/attach]
    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)。如下图所示
    MBR.jpg
            上面这段代码就是检测每个分区表项的第一个字节是不是0x80,如果是就跳转。我们接下来看跳转过去的代码
    [AppleScript] 纯文本查看 复制代码
    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,我们跟进去看看。
    [AppleScript] 纯文本查看 复制代码
    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处的代码
    [AppleScript] 纯文本查看 复制代码
    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处的代码
    [AppleScript] 纯文本查看 复制代码
    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;                //要传输的扇区数
            WORD        BufferOffset;        //传输缓冲区偏移地址
            WORD        BufferSegment;        //传输缓冲区段地址
            DWORD        LBNLow;                //要读取数据的起始扇区号低位
            DWORD        LBNHigh;                //要读取数据的起始扇区号高位
    };

            这个结构体就是上面MEMORY:27AC9开始的数据,在读取的时候,把这个结构体的地址传给si,然后调用int 13h来读取。上面这两段代码其实读取的是活动分区的引导扇区数据(每个分区的第一个扇区都分区引导扇区,这里要和MBR区分开来)。读完之后,程序反回继续前面的call下面的代码
    [AppleScript] 纯文本查看 复制代码
    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

            这里其实是检测分区引导扇区是否正确读取,如果正确读取则跳转去执行分区引导扇区的代码(这里是jmp far ptr loc_7C00)。
        额……就先写到这吧。因为执行分区引导代码会涉及到文件系统的一些东西,我们分开来分享,不然一个帖子一大堆东西,大家也没耐心看。感兴趣的童鞋可以按照上面的方法自己去调试下代码。

    评分

    参与人数 1i币 +20 贡献 +2 收起 理由
    管理01 + 20 + 2 支持原创

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2016-3-22 14:15
  • 签到天数: 95 天

    [LV.6]常住居民II

    发表于 2015-4-22 10:30:47 | 显示全部楼层
    大牛是要出逆向分析的套餐么

    点评

    只是分享下学习的过程  详情 回复 发表于 2015-4-22 10:56
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-16 20:03
  • 签到天数: 116 天

    [LV.6]常住居民II

     楼主| 发表于 2015-4-22 10:56:24 | 显示全部楼层
    这盐有点咸 发表于 2015-4-22 10:30
    大牛是要出逆向分析的套餐么

    只是分享下学习的过程
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-11-2 19:55
  • 签到天数: 94 天

    [LV.6]常住居民II

    发表于 2015-4-24 22:57:36 | 显示全部楼层
    你在写快播?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-28 08:56:16 | 显示全部楼层
    还是不错的哦,顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-28 09:32:15 | 显示全部楼层
    学习学习技术,加油!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-2-12 22:05
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2015-6-28 12:23:13 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-28 12:59:09 | 显示全部楼层
    感谢楼主的分享~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-29 02:50:20 | 显示全部楼层
    支持中国红客联盟(ihonker.org)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-29 06:45:17 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2024-11-23 09:44 , Processed in 0.031523 second(s), 14 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部