首页
社区
课程
招聘
[原创]MBR和DBR详细分析
发表于: 2007-8-30 11:14 84606

[原创]MBR和DBR详细分析

HSQ 活跃值
8
2007-8-30 11:14
84606

之所以贴出来,是有些地方不明白,希望能于大家交流分析
我系统2K PRO SP4,C盘采用NTFS,用WinHex提取MBR和DBR,拿IDA分析的.关键在DBR几处不明白.
1.一点预备知识:
主引导扇区代码(MBR)

 
;====================================================================================
; 
; MBR( Master Boot Record )主引导记录包含两部分的内容,前446字节为启动代码及数据,而
; 从446(0x1BE)开始则是分区表,分区表由四个分区项组成,每个分区项数据为16字节,记录了
; 启动时需要的分区参数。
;
; 在CPU上电之后,若由硬盘启动,则BIOS将硬盘的主引导记录(位于0柱面、0磁道、1扇区)读
; 入7C00处,然后将控制权交给主引导代码。主引导代码的任务包括:
; (1) 扫描分区表,找到一个激活(可引导)分区;
; (2) 找到激活分区的起始扇区;
; (3) 将激活分区的引导扇区装载到内存7C00处;
; (4) 将控制权交给引导扇区代码;
;  
; 如果主引导代码无法完成上述任务,它将显示以下错误信息之一:
; No active partition.
; Invalid partition table.
; Error loading operating system.
; Missing operating system.
;
;====================================================================================
; FAT16分区尺寸与LBA
;====================================================================================
; LBA   HeadsPerCylinder SectorsPerTrack  Maximum Size for Boot Partition
; Disabled 64     32     1GB
; Enabled  255     63     4GB
;
; 为了适应超过8G的硬盘,Windows2000忽略了Start CHS和End CHS,而使用StartLBA和TotalSector    
; 来确定分区在整个磁盘中的位置和大小。
;  
;====================================================================================
;     分区表项结构(16字节)
;====================================================================================
;
; typedef struct _PARTITION_ENTRY
; {
;  UCHAR BootIndicator;  // 能否启动标志
;  UCHAR StartHead;   // 该分区起始磁头号
;  UCHAR StartSector;  // 起始柱面号高2位:6位起始扇区号
;  UCHAR StartCylinder;  // 起始柱面号低8位
;  UCHAR PartitionType;  // 分区类型
;  UCHAR EndHead;   // 该分区终止磁头号
;  UCHAR EndSector;   // 终止柱面号高2位:6位终止扇区号
;  UCHAR EndCylinder;  // 终止柱面号低8位
;  ULONG StartLBA;   // 起始扇区号
;  ULONG TotalSector;  // 分区尺寸(总扇区数)
; }PARTITION_ENTRY,*PPARTITION_ENTRY;
;
;====================================================================================
;    主引导记录(MBR)结构 
;====================================================================================
; typedef struct _MASTER_BOOT_RECORD
; {
;  UCHAR    BootCode[446];
;  PARTITION_ENTRY  Partition[4];
;  USHORT    Signature;
; }MASTER_BOOT_RECORD,*PMASTER_BOOT_RECORD;
;
;====================================================================================

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (29)
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
2
3.DBR详细分析
code:7C00 ; File Name   : D:\DBR.COM
code:7C00 ; Format      : MS-DOS COM-file
code:7C00 ; Base Address: 1000h Range: 10100h-10300h Loaded length: 200h
code:7C00
code:7C00                 .686p
code:7C00                 .mmx
code:7C00                 .model tiny
code:7C00
code:7C00 ; ###########################################################################
code:7C00
code:7C00 ; Segment type: Pure code
code:7C00 code          segment byte public 'CODE' use16
code:7C00                 assume cs:code
code:7C00                 org 7C00h
code:7C00                 assume es:nothing, ss:nothing, ds:code, fs:nothing, gs:nothing
code:7C00
code:7C00 ; =============== S U B R O U T I N E =======================================
code:7C00
code:7C00                 public start
code:7C00 start           proc far
code:7C00                 jmp     short begin
code:7C00
code:7C02 ; ---------------------------------------------------------------------------
code:7C02                 nop
code:7C02
code:7C02 ; ---------------------------------------------------------------------------
code:7C03 sz_Ntfs         db 'NTFS    ',0
code:7C0C                 db 2, 8, 7 dup(0), 0F8h, 2 dup(0), 3Fh, 0, 0FFh, 0, 3Fh, 7 dup(0), 80h, 0, 80h, 0, 4Dh
code:7C0C                 db 83h, 0EEh, 7 dup(0), 0Ch, 5 dup(0), 10h, 7 dup(0), 0F6h, 3 dup(0), 1, 3 dup(0), 61h
code:7C0C                 db 0F5h, 0B9h, 0B3h, 2Fh, 0F6h, 33h, 13h, 4 dup(0)
code:7C54 ; ---------------------------------------------------------------------------
code:7C54
code:7C54 begin:           
code:7C54                 cli
code:7C55                 xor     ax, ax
code:7C57                 mov     ss, ax
code:7C59                 mov     sp, 7C00h
code:7C5C                 sti
code:7C5D                 mov     ax, 7C0h 
code:7C60                 mov     ds, ax
code:7C62                 assume ds:nothing
code:7C62                 call    GetCurrentDriveParaments
code:7C62
code:7C65                 mov     ax, 0D00h 
code:7C68                 mov     es, ax
code:7C6A                 xor     bx, bx
code:7C6C                 mov     byte ptr ds:0Eh, 10h
code:7C71                 call    ReadDiskSectors
code:7C71
code:7C74                 push    0D00h 
code:7C77                 push    26Ah 
code:7C7A                 retf
code:7C7A
code:7C7A start           endp 
code:7C7A
code:7C7B ; =============== S U B R O U T I N E =======================================
code:7C7B
code:7C7B GetCurrentDriveParaments proc near      
code:7C7B                 mov     dl, ds:24h      ; DL = drive number,Why must use ds:24h Memory?
code:7C7F                 mov     ah, 8
code:7C81                 int     13h
code:7C83                 jnb     short success   
code:7C83
code:7C85                 mov     cx, 0FFFFh
code:7C88                 mov     dh, cl
code:7C88
code:7C8A success:                              
code:7C8A                 movzx   eax, dh         ; why now can use 'EAX' register,but it in use 16?
code:7C8E                 inc     ax
code:7C8F                 movzx   edx, cl         
code:7C93                 and     dl, 3Fh
code:7C96                 mul     dx
code:7C98                 xchg    cl, ch
code:7C9A                 shr     ch, 6
code:7C9D                 inc     cx
code:7C9E                 movzx   ecx, cx
code:7CA2                 mul     ecx
code:7CA5                 mov     ds:20h, eax
code:7CA9                 retn
code:7CA9
code:7CA9 GetCurrentDriveParaments endp
code:7CA9
code:7CAA ; =============== S U B R O U T I N E =======================================
code:7CAA
code:7CAA CheckExtenInt13 proc near               
code:7CAA                 mov     ah, 41h
code:7CAC                 mov     bx, 55AAh
code:7CAF                 mov     dl, ds:24h
code:7CB3                 int     13h
code:7CB5                 jb      short exit
code:7CB5
code:7CB7                 cmp     bx, 0AA55h
code:7CBB                 jnz     short exit
code:7CBB
code:7CBD                 test    cl, 1
code:7CC0                 jz      short exit
code:7CC0
code:7CC2                 inc     byte ptr ds:14h ; set a flage
code:7CC6 exit:                                  
code:7CC6                 retn
code:7CC6
code:7CC6 CheckExtenInt13 endp
code:7CC6
code:7CC7 ; =============== S U B R O U T I N E =======================================
code:7CC7
code:7CC7 ReadDiskSectors proc near               
code:7CC7                 pushad
code:7CC9                 push    ds
code:7CCA                 push    es
code:7CCB continue_work:                     
code:7CCB                 mov     eax, ds:10h
code:7CCF                 add     eax, ds:1Ch
code:7CD4                 cmp     eax, ds:20h
code:7CD9                 jb      read_disk_sectors
code:7CD9
code:7CDD                 push    ds
code:7CDE                 push    large 0
code:7CE1                 push    eax
code:7CE3                 push    es
code:7CE4                 push    bx
code:7CE5                 push    large 10010h
code:7CEB                 cmp     byte ptr ds:14h, 0 ; check a flage
code:7CF0                 jnz     continue
code:7CF0
code:7CF4                 call    CheckExtenInt13
code:7CF4
code:7CF7                 cmp     byte ptr ds:14h, 0 ; check a flage
code:7CFC                 jz      cant_continue
code:7D00 continue:                           
code:7D00                 mov     ah, 42h
code:7D02                 mov     dl, ds:24h
code:7D06                 push    ss
code:7D07                 pop     ds
code:7D08                 mov     si, sp
code:7D0A                 int     13h
code:7D0C                 pop     eax
code:7D0E                 pop     bx
code:7D0F                 pop     es
code:7D10                 pop     eax
code:7D12                 pop     eax
code:7D14                 pop     ds
code:7D15                 jmp     short exit
code:7D15
code:7D17 ; ---------------------------------------------------------------------------
code:7D17 read_disk_sectors:                    
code:7D17                 xor     edx, edx
code:7D1A                 movzx   ecx, word ptr ds:18h
code:7D20                 div     ecx
code:7D23                 inc     dl
code:7D25                 mov     cl, dl
code:7D27                 mov     edx, eax
code:7D2A                 shr     edx, 10h
code:7D2E                 div     word ptr ds:1Ah
code:7D32                 xchg    dl, dh          ; DH = head
code:7D34                 mov     dl, ds:24h      ; ES:BX -> buffer to fill
code:7D38                 mov     ch, al          ; CH = track
code:7D3A                 shl     ah, 6           ; DL = drive
code:7D3D                 or      cl, ah          ; CL = sector
code:7D3F                 mov     ax, 201h        ; AL = number of sectors to read
code:7D42                 int     13h
code:7D42
code:7D44 exit:   
code:7D44                 jb      cant_continue
code:7D44
code:7D48                 mov     ax, es
code:7D4A                 add     ax, 20h
code:7D4D                 mov     es, ax
code:7D4F                 inc     dword ptr ds:10h
code:7D54                 dec     word ptr ds:0Eh
code:7D58                 jnz     continue_work
code:7D58
code:7D5C                 pop     es
code:7D5D                 pop     ds
code:7D5E                 popad
code:7D60                 retn
code:7D60
code:7D61 ; ---------------------------------------------------------------------------
code:7D61
code:7D61 cant_continue:                    
code:7D61                                        
code:7D61                 mov     al, ds:1F8h
code:7D64                 call    PrintErrorMessage
code:7D64
code:7D67                 mov     al, ds:1FBh
code:7D6A                 call    PrintErrorMessage
code:7D6A
code:7D6D                 sti
code:7D6D
code:7D6E no_end:                                
code:7D6E                 jmp     short no_end
code:7D6E
code:7D6E ReadDiskSectors endp
code:7D6E
code:7D70 ; =============== S U B R O U T I N E =======================================
code:7D70
code:7D70 PrintErrorMessage proc near           
code:7D70                                       
code:7D70                 mov     ah, 1
code:7D72                 mov     si, ax
code:7D72
code:7D74
code:7D74 continue:                           
code:7D74                 lodsb
code:7D75                 cmp     al, 0
code:7D77                 jz      short exit
code:7D77
code:7D79                 mov     ah, 0Eh
code:7D7B                 mov     bx, 7
code:7D7E                 int     10h             
code:7D7E                                         
code:7D80                 jmp     short continue
code:7D80
code:7D82 ; ---------------------------------------------------------------------------
code:7D82 exit:                                 
code:7D82                 retn
code:7D82
code:7D82 PrintErrorMessage endp
code:7D82
code:7D82 ; ---------------------------------------------------------------------------
code:7D83                 db 0Dh, 0Ah
code:7D85 sz_DiskReadError db 'A disk read error occurred',0
code:7DA0                 db 0Dh, 0Ah
code:7DA2 sz_NtldrIsMissing db 'NTLDR is missing',0
code:7DB3                 db 0Dh, 0Ah
code:7DB5 sz_NtldrIsCompressed db 'NTLDR is compressed',0
code:7DC9                 db 0Dh, 0Ah
code:7DCB sz_PressCtrlAltDel db 'Press Ctrl+Alt+Del to restart',0Dh,0Ah,0
code:7DEB                 db 0Dh dup(0), 83h, 0A0h, 0B3h, 0C9h, 2 dup(0), 55h, 0AAh
code:7DEB code          ends
code:7DEB
code:7DEB                 end start

4.分析文本文档及原程序下载
上传的附件:
2007-8-30 11:25
0
雪    币: 8764
活跃值: (5240)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
学习一下长长知识。。。
2007-8-30 14:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好东西啊,如果有C语言写的那就更加好了.
2007-9-2 17:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你这不是难为楼主吗,C语言能写出512字节的程序,然后控制最后每个字节的代码?
2007-9-6 10:54
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
经典回顾中..........
2007-9-9 13:14
0
雪    币: 225
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
好东西,值得顶!
2007-9-12 14:20
0
雪    币: 248
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错,顶一下!!!
2007-9-15 15:00
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
9
收藏研究中~~~
2007-9-15 18:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢分享欢乐
2007-9-16 15:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
很有用处 感谢楼主分享。 好好学习中。
2007-10-27 20:21
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
12
呵呵,eax寄存器可以跟是不是16位的code没有关系。
2007-10-30 14:21
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
code:7C74                 push    0D00h
code:7C77                 push    26Ah
code:7C7A                 retf

这以后呢??
2009-12-16 13:34
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
先收藏先吧
2009-12-16 15:25
0
雪    币: 324
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
顶顶顶顶顶顶!正需要ing
2009-12-16 19:09
0
雪    币: 1324
活跃值: (5179)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
收藏!!!!!!!
2010-8-30 06:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
感谢分享,正在找这方面的资料。
2011-9-2 00:49
0
雪    币: 20
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
感谢楼主,学习了
2011-9-28 16:27
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
有用。。。。。。。。。。。。。。。。。。。。。。。
2011-10-26 08:56
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
code:7C74                 push    0D00h
code:7C77                 push    26Ah
code:7C7A                 retf

这后面有人能解释下就好了
2012-2-14 01:00
0
雪    币: 8
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
怎么用WinHex提取MBR和DBR?
2012-7-7 13:31
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
进入DOS模式,直接用DEBUG,打命令可以看到,其它方法不会。
2012-7-7 16:45
0
雪    币: 8
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
正在分析,
push 0d00
push 261
retf
楼主你的代码详细在哪了?
2012-7-19 17:09
0
雪    币: 274
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
收藏了,好好观赏~~
2012-7-20 18:21
0
雪    币: 459
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
好东西,最好能画个流程图
2012-11-18 13:54
0
游客
登录 | 注册 方可回帖
返回
//