安装grub后的mbr反汇编

安装grub后的mbr导出反汇编:

 

0x1BE地址开始处为 分区表

分区表结构体定义:

00000000 patation        struc ; (sizeof=0x10)
00000000 State           db ?                    ; state
00000001 StartHead       db ?
00000002 StartSC         dw ?
00000004 Type            db ?
00000005 EndHead         db ?
00000006 EndSC           dw ?
00000008 Relative        dd ?
0000000C Sectors         dd ?
00000010 patation        ends

 

反汇编具体内容加注释:

 

seg000:0000 ; File Name   : E:/grubmbr
seg000:0000 ; Format      : Binary file
seg000:0000 ; Base Address: 0000h Range: 0000h - 0200h Loaded length: 0200h
seg000:0000
seg000:0000                 .686p
seg000:0000                 .mmx
seg000:0000                 .model flat
seg000:0000
seg000:0000 ; ===========================================================================
seg000:0000
seg000:0000 ; Segment type: Pure code
seg000:0000 seg000          segment byte public 'CODE' use16
seg000:0000                 assume cs:seg000
seg000:0000                 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
seg000:0000
seg000:0000 ; =============== S U B R O U T I N E =======================================
seg000:0000
seg000:0000 ; Attributes: noreturn
seg000:0000
seg000:0000 sub_0           proc near
seg000:0000                 jmp     short loc_4A
seg000:0002 ; ---------------------------------------------------------------------------
seg000:0002                 nop
seg000:0003                 mov     ss, ax
seg000:0005                 mov     sp, 7C00h
seg000:0008                 mov     si, sp
seg000:000A                 mov     es, ax
seg000:000C                 mov     ds, ax
seg000:000E                 sti
seg000:000F                 cld
seg000:0010                 mov     di, 600h
seg000:0013                 mov     cx, 100h
seg000:0016                 repne movsw
seg000:0018                 jmp     far ptr 0:61Dh
seg000:001D ; ---------------------------------------------------------------------------
seg000:001D                 mov     si, 7BEh
seg000:0020                 mov     bl, 4
seg000:0022
seg000:0022 loc_22:                                 ; CODE XREF: sub_0+33j
seg000:0022                 cmp     byte ptr [si+0], 80h ; '€'
seg000:0026                 jz      short loc_37
seg000:0028                 cmp     byte ptr [si+0], 0
seg000:002C                 jnz     short loc_4C
seg000:002E                 add     si, 10h
seg000:0031                 dec     bl
seg000:0033                 jnz     short loc_22
seg000:0035                 int     18h             ; TRANSFER TO ROM BASIC
seg000:0035                                         ; causes transfer to ROM-based BASIC (IBM-PC)
seg000:0035                                         ; often reboots a compatible; often has no effect at all
seg000:0037
seg000:0037 loc_37:                                 ; CODE XREF: sub_0+26j
seg000:0037                 mov     dx, [si+0]
seg000:003A                 mov     cx, [si+2]
seg000:003D                 mov     ax, [bp+di]
seg000:003F                 add     bh, bh          ; DATA XREF: puts-2r
seg000:003F ; ---------------------------------------------------------------------------
seg000:0041                 db    0
seg000:0042                 dw 2000h                ; 代码地址
seg000:0044                 dw 1                    ; mbr需加载的引导程序所在绝对扇区数
seg000:0046                 db    0
seg000:0047                 db    0
seg000:0048                 dw 200h                 ; 相当于代码段基址
seg000:004A ; ---------------------------------------------------------------------------
seg000:004A
seg000:004A loc_4A:                                 ; CODE XREF: sub_0j
seg000:004A                 cli
seg000:004B                 nop
seg000:004C
seg000:004C loc_4C:                                 ; CODE XREF: sub_0+2Cj
seg000:004C                                         ; DATA XREF: sub_59+24r ...
seg000:004C                 nop
seg000:004D                 test    dl, 80h
seg000:0050                 jnz     short loc_54
seg000:0052                 mov     dl, 80h ; '€'
seg000:0054
seg000:0054 loc_54:                                 ; CODE XREF: sub_0+50j
seg000:0054                 jmp     far ptr 0:7C59h
seg000:0054 sub_0           endp ; sp-analysis failed
seg000:0054
seg000:0059
seg000:0059 ; =============== S U B R O U T I N E =======================================
seg000:0059
seg000:0059
seg000:0059 sub_59          proc near
seg000:0059                 xor     ax, ax
seg000:005B                 mov     ds, ax
seg000:005D                 mov     ss, ax
seg000:005F                 mov     sp, 2000h       ; DATA XREF: sub_0+35r
seg000:0062                 sti
seg000:0063                 mov     al, ds:7C40h
seg000:0066                 cmp     al, 0FFh
seg000:0068                 jz      short loc_6C
seg000:006A                 mov     dl, al
seg000:006C
seg000:006C loc_6C:                                 ; CODE XREF: sub_59+Fj
seg000:006C                 push    dx
seg000:006D                 mov     si, 7D7Fh
seg000:0070                 call    puts            ; 显示GRUB(GRUB Loading stage...中的GRUB)
seg000:0073                 test    dl, 80h
seg000:0076                 jz      short loc_CC
seg000:0078                 mov     ah, 41h ; 'A'
seg000:007A                 mov     bx, 55AAh
seg000:007D                 int     13h             ; 1) 检验扩展功能是否存在
seg000:007D                                         ; 入口:
seg000:007D                                         ; AH = 41h
seg000:007D                                         ; BX = 55AAh
seg000:007D                                         ; DL = 驱动器号
seg000:007D                                         ; 返回:
seg000:007D                                         ; CF = 0
seg000:007D                                         ; AH = 扩展功能的主版本号
seg000:007D                                         ; AL = 内部使用
seg000:007D                                         ; BX = AA55h
seg000:007D                                         ; CX = API 子集支持位图
seg000:007D                                         ; CF = 1
seg000:007D                                         ; AH = 错误码 01h,无效命令
seg000:007D                                         ;
seg000:007D                                         ; 这个调用检验对特定的驱动器是否存在扩展功能。如果进位标志置 1则此驱动器不支持扩展功能。如果进位标志为 0,同时 BX = AA55h,则存在扩展功能。此时 CX 的 0 位表示是否支持第一个子集,1位表示是否支持第二个子集.
seg000:007D                                         ; 对于 1.x 版的扩展 Int13H 来说,主版本号 AH = 1。AL 是副版本号,但这仅限于 BIOS 内部使用,任何软件不得检查 AL 的值。
seg000:007D                                         ;
seg000:007F                 pop     dx
seg000:0080                 push    dx
seg000:0081                 jb      short loc_CC    ; 不支持则跳转loc_CC处,cf标志为1,jb 跳转成立
seg000:0081                                         ;
seg000:0083                 cmp     bx, 0AA55h
seg000:0087                 jnz     short loc_CC    ; 不支持则跳转loc_CC处
seg000:0089                 mov     al, ds:7C41h
seg000:008C                 test    al, al
seg000:008E                 jnz     short loc_95    ; 该参数标志不为0,则不需检查CX中存储的API子集支持位图
seg000:0090                 and     cx, 1
seg000:0093                 jz      short loc_CC    ; 如果子集位图为0,则跳转LOC_CC
seg000:0095
seg000:0095 loc_95:                                 ; CODE XREF: sub_59+35j
seg000:0095                 mov     ecx, [si+10h]   ; 194处数据
seg000:0099                 mov     si, 7C05h
seg000:009C                 mov     byte ptr [si-1], 1 ; 0x7c04字节标记内存是否已加载第二个扇区数据。为1表示已加载,为0表示加载失败。
seg000:009C                                         ; 此标记会在后续第二个扇区的程序中使用到
seg000:00A0                 mov     ebx, ds:7C44h
seg000:00A5                 mov     word ptr [si], 10h
seg000:00A9                 mov     word ptr [si+2], 1
seg000:00AE                 mov     [si+8], ebx
seg000:00B2                 mov     word ptr [si+6], 7000h
seg000:00B7                 xor     eax, eax
seg000:00BA                 mov     [si+4], ax
seg000:00BD                 mov     [si+0Ch], eax   ; -1 1
seg000:00BD                                         ; 00 10h   地址7c05 si指向此地址
seg000:00BD                                         ; 02 1
seg000:00BD                                         ; 04 0
seg000:00BD                                         ; 06 7000h
seg000:00BD                                         ; 08 1
seg000:00BD                                         ; 0a 0
seg000:00BD                                         ; 0c 0
seg000:00C1                 mov     ah, 42h ; 'B'
seg000:00C3                 int     13h             ; 将第二扇区的内容读到内存0地址处
seg000:00C3                                         ; INT 13 - IBM/MS INT 13 Extensions - EXTENDED READ
seg000:00C3                                         ;         AH = 42h
seg000:00C3                                         ;         DL = drive number
seg000:00C3                                         ;         DS:SI -> disk address packet (see #0204)
seg000:00C3                                         ; Return: CF clear if successful
seg000:00C3                                         ;             AH = 00h
seg000:00C3                                         ;         CF set on error
seg000:00C3                                         ;             AH = error code (see #0166)
seg000:00C3                                         ;             disk address packet's block count field set to number of blocks
seg000:00C3                                         ;               successfully transferred
seg000:00C3                                         ; SeeAlso: AH=02h,AH=41h"INT 13 Ext",AH=43h"INT 13 Ext"
seg000:00C3                                         ;
seg000:00C3                                         ; Format of disk address packet:
seg000:00C3                                         ; Offset  Size    Description     (Table 0204)
seg000:00C3                                         ;  00h    BYTE    10h (size of packet)
seg000:00C3                                         ;  01h    BYTE    reserved (0)
seg000:00C3                                         ;  02h    WORD    number of blocks to transfer (max 007Fh for Phoenix EDD)
seg000:00C3                                         ;  04h    DWORD   -> transfer buffer
seg000:00C3                                         ;  08h    QWORD   starting absolute block number
seg000:00C3                                         ;                 (for non-LBA devices, compute as
seg000:00C3                                         ;                   (Cylinder*NumHeads + SelectedHead) * SectorPerTrack +
seg000:00C3                                         ;                   SelectedSector - 1
seg000:00C5                 jb      short loc_CC    ; 如果读取失败则跳转loc_CC处
seg000:00C7                 mov     bx, 7000h
seg000:00CA                 jmp     short loc_149
seg000:00CC ; ---------------------------------------------------------------------------
seg000:00CC
seg000:00CC loc_CC:                                 ; CODE XREF: sub_59+1Dj
seg000:00CC                                         ; sub_59+28j ...
seg000:00CC                 mov     ah, 8
seg000:00CE                 int     13h             ; DISK - DISK - GET CURRENT DRIVE PARAMETERS (XT,AT,XT286,CONV,PS)
seg000:00CE                                         ; DL = drive number
seg000:00CE                                         ; Return: CF set on error, AH = status code, BL = drive type
seg000:00CE                                         ; DL = number of consecutive drives
seg000:00CE                                         ; DH = maximum value for head number, ES:DI -> drive parameter
seg000:00D0                 jnb     short loc_DC
seg000:00D2                 test    dl, 80h
seg000:00D5                 jz      near ptr stru_1BE.EndHead
seg000:00D9                 jmp     loc_169         ; 'Hard Disk'
seg000:00DC ; ---------------------------------------------------------------------------
seg000:00DC
seg000:00DC loc_DC:                                 ; CODE XREF: sub_59+77j
seg000:00DC                 mov     si, 7C05h
seg000:00DF                 mov     byte ptr [si-1], 0 ; 将扇区2已读入标志置为0
seg000:00E3                 xor     eax, eax
seg000:00E6                 mov     al, dh
seg000:00E8                 inc     ax
seg000:00E9                 mov     [si+4], eax
seg000:00ED                 xor     dx, dx
seg000:00EF                 mov     dl, cl
seg000:00F1                 shl     dx, 2
seg000:00F4                 mov     al, ch
seg000:00F6                 mov     ah, dh
seg000:00F8                 inc     ax
seg000:00F9                 mov     [si+8], ax
seg000:00FC                 xor     ax, ax
seg000:00FE                 mov     al, dl
seg000:0100                 shr     al, 2
seg000:0103                 mov     [si], eax
seg000:0106                 mov     eax, ds:7C44h
seg000:010A                 xor     edx, edx
seg000:010D                 div     dword ptr [si]
seg000:0110                 mov     [si+0Ah], dl
seg000:0113                 xor     edx, edx
seg000:0116                 div     dword ptr [si+4]
seg000:011A                 mov     [si+0Bh], dl
seg000:011D                 mov     [si+0Ch], ax
seg000:0120                 cmp     ax, [si+8]
seg000:0123                 jge     short loc_161
seg000:0125                 mov     dl, [si+0Dh]
seg000:0128                 shl     dl, 6
seg000:012B                 mov     cl, [si+0Ah]
seg000:012E                 inc     cl
seg000:0130                 or      cl, dl
seg000:0132                 mov     ch, [si+0Ch]
seg000:0135                 pop     dx
seg000:0136                 mov     dh, [si+0Bh]
seg000:0139                 mov     bx, 7000h
seg000:013C                 mov     es, bx
seg000:013E                 assume es:nothing
seg000:013E                 xor     bx, bx
seg000:0140                 mov     ax, 201h
seg000:0143                 int     13h             ; DISK - READ SECTORS INTO MEMORY
seg000:0143                                         ; AL = number of sectors to read, CH = track, CL = sector
seg000:0143                                         ; DH = head, DL = drive, ES:BX -> buffer to fill
seg000:0143                                         ; Return: CF set on error, AH = status, AL = number of sectors read
seg000:0145                 jb      short loc_171   ; 'Read'
seg000:0147                 mov     bx, es
seg000:0149
seg000:0149 loc_149:                                ; CODE XREF: sub_59+71j
seg000:0149                 mov     es, word ptr ds:7C48h
seg000:014D                 assume es:nothing
seg000:014D                 pusha
seg000:014E                 push    ds
seg000:014F                 mov     cx, 100h
seg000:0152                 mov     ds, bx
seg000:0154                 assume ds:nothing
seg000:0154                 xor     si, si
seg000:0156                 xor     di, di
seg000:0158                 cld
seg000:0159                 rep movsw               ; 将7000:0处的0x200字节内容复制到0x200:0地址处
seg000:015B                 pop     ds
seg000:015C                 assume ds:nothing
seg000:015C                 popa
seg000:015D                 jmp     word ptr ds:7C42h ; 跳转到0x2000地址处执行
seg000:0161 ; ---------------------------------------------------------------------------
seg000:0161
seg000:0161 loc_161:                                ; CODE XREF: sub_59+CAj
seg000:0161                 mov     si, 7D85h
seg000:0164                 call    puts            ; 输出‘Geom’
seg000:0167                 jmp     short loc_177   ; ' Error'
seg000:0169 ; ---------------------------------------------------------------------------
seg000:0169
seg000:0169 loc_169:                                ; CODE XREF: sub_59+80j
seg000:0169                 mov     si, 7D8Ah       ; 'Hard Disk'
seg000:016C                 call    puts
seg000:016F                 jmp     short loc_177   ; ' Error'
seg000:0171 ; ---------------------------------------------------------------------------
seg000:0171
seg000:0171 loc_171:                                ; CODE XREF: sub_59+ECj
seg000:0171                 mov     si, 7D94h       ; 'Read'
seg000:0174                 call    puts
seg000:0177
seg000:0177 loc_177:                                ; CODE XREF: sub_59+10Ej
seg000:0177                                         ; sub_59+116j
seg000:0177                 mov     si, 7D99h       ; ' Error'
seg000:017A                 call    puts
seg000:017D
seg000:017D loc_17D:                                ; CODE XREF: sub_59:loc_17Dj
seg000:017D                 jmp     short loc_17D
seg000:017D sub_59          endp ; sp-analysis failed
seg000:017D
seg000:017D ; ---------------------------------------------------------------------------
seg000:017F aGrub           db 'GRUB ',0
seg000:0185 aGeom           db 'Geom',0
seg000:018A aHardDisk       db 'Hard Disk',0
seg000:0194 aRead           db 'Read',0
seg000:0199 aError          db ' Error',0
seg000:01A0 ; ---------------------------------------------------------------------------
seg000:01A0 ; START OF FUNCTION CHUNK FOR puts
seg000:01A0
seg000:01A0 loc_1A0:                                ; CODE XREF: puts+3j
seg000:01A0                 mov     bx, 1
seg000:01A3                 mov     ah, 0Eh
seg000:01A5                 int     10h             ; - VIDEO - WRITE CHARACTER AND ADVANCE CURSOR (TTY WRITE)
seg000:01A5 ; END OF FUNCTION CHUNK FOR puts        ; AL = character, BH = display page (alpha modes)
seg000:01A5                                         ; BL = foreground color (graphics modes)
seg000:01A7
seg000:01A7 ; =============== S U B R O U T I N E =======================================
seg000:01A7
seg000:01A7
seg000:01A7 puts            proc near               ; CODE XREF: sub_59+17p
seg000:01A7                                         ; sub_59+10Bp ...
seg000:01A7
seg000:01A7 ; FUNCTION CHUNK AT seg000:01A0 SIZE 00000007 BYTES
seg000:01A7
seg000:01A7                 lodsb
seg000:01A8                 cmp     al, 0
seg000:01AA                 jnz     short loc_1A0
seg000:01AC                 retn
seg000:01AC puts            endp ; sp-analysis failed
seg000:01AC
seg000:01AC ; ---------------------------------------------------------------------------
seg000:01AD                 db    0
seg000:01AE                 db    0
seg000:01AF                 db    0
seg000:01B0                 db    0
seg000:01B1                 db    0
seg000:01B2                 db    0
seg000:01B3                 db    0
seg000:01B4                 db    0
seg000:01B5                 db    0
seg000:01B6                 db    0
seg000:01B7                 db    0
seg000:01B8                 db    0
seg000:01B9                 db    0
seg000:01BA                 db    0
seg000:01BB                 db    0
seg000:01BC                 db    0
seg000:01BD                 db    0
seg000:01BE stru_1BE        patation <80h, 1, 1, 4Dh, 7Fh, 813Fh, 3Fh, 0FFEC1h>; 0
seg000:01BE                                         ; CODE XREF: sub_59+7Cj
seg000:01BE                 patation <0, 0, 8641h, 4Eh, 7Fh, 6BFh, 2FFD00h, 0FDF80h>; 1
seg000:01BE                 patation <0, 0, 441h, 4Fh, 7Fh, 857Fh, 1FFE00h, 0FFF00h>; 2
seg000:01BE                 patation <0, 0, 8201h, 83h, 7Fh, 37Fh, 0FFF00h, 0FFF00h>; 3
seg000:01FE                 db  55h ; U
seg000:01FF                 db 0AAh ; ?
seg000:01FF seg000          ends
seg000:01FF
seg000:01FF
seg000:01FF                 end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值