seg
000
:
7
C
00
seg
000
segment byte public 'CODE' use
16
[
/
size]
seg
000
:
7
C
00
assume cs
:
seg
000
seg
000
:
7
C
00
;org
7
C
00
h
seg
000
:
7
C
00
assume es
:
nothing
,
ss
:
nothing
,
ds
:
nothing
,
fs
:
nothing
,
gs
:
nothing
seg
000
:
7
C
00
xor ax
,
ax ; ax
=
0
seg
000
:
7
C
02
mov ss
,
ax ; ss
=
0
seg
000
:
7
C
04
mov sp
,
7
C
00
h ; sp
=
0
x
7
c
00
seg
000
:
7
C
07
sti ; 开起段中断
seg
000
:
7
C
08
push ax
seg
000
:
7
C
09
pop es ; es
=
0
seg
000
:
7
C
0
A push ax
seg
000
:
7
C
0
B pop ds ; ds
=
0
seg
000
:
7
C
0
C cld ; 关闭段中断
seg
000
:
7
C
0
D push ax
seg
000
:
7
C
0
E mov si
,
7
C
00
h
seg
000
:
7
C
11
mov di
,
600
h
seg
000
:
7
C
14
mov cx
,
200
h ; 循环次数,
512
次,也就是mbr的大小
seg
000
:
7
C
17
rep movsb ; rep movsb将ds
:
si拷贝到es
:
di处,长度为cx
seg
000
:
7
C
17
; 即将mbr从
0
x
7
c
00
拷贝到
0
x
600
处
seg
000
:
7
C
19
mov di
,
61
Eh
seg
000
:
7
C
1
C push di
seg
000
:
7
C
1
D retf ; jmp到
0
x
61
E
seg
000
:
7
C
1
D ; 也就是继续执行下一条指令(可以用IDA动态调试看)
seg
000
:
7
C
1
E ;
seg
000
:
7
C
1
E xor bx
,
bx ; 这里本来是
7
c
1
E,因为静态调试,就把它当成
61
E
seg
000
:
7
C
20
xor dx
,
dx
seg
000
:
7
C
22
mov si
,
7
BEh ;
0
x
600
+
0
x
1
BE 偏移
0
x
1
BE为分区表起始位置
seg
000
:
7
C
25
mov cl
,
4
;
4
个分区表项
seg
000
:
7
C
27
seg
000
:
7
C
27
loc_
7
C
27
:
; CODE XREF
:
seg
000
:
7
C
32
j
seg
000
:
7
C
27
test byte ptr [si]
,
80
h ; 判断是否是活动分区,
0
x
80
为活动分区,由于[si]是
2
个字节,我测试的[si]为
0
x
180
seg
000
:
7
C
2
A jz short loc_
7
C
2
F ; 是活动分区的时候不跳转,否则跳转
seg
000
:
7
C
2
C mov dx
,
si
seg
000
:
7
C
2
E inc bx ; bx
=
1
,接着之前的
0
seg
000
:
7
C
2
F
seg
000
:
7
C
2
F loc_
7
C
2
F
:
; CODE XREF
:
seg
000
:
7
C
2
Aj
seg
000
:
7
C
2
F
add
si
,
10
h ; 活动分区表指向下一个
seg
000
:
7
C
32
loop loc_
7
C
27
; 判断是否是活动分区,
0
x
80
为活动分区,由于[si]是
2
个字节,我测试的[si]为
0
x
180
seg
000
:
7
C
34
cmp bx
,
1
; 判断是否只有一个活动分区表
seg
000
:
7
C
37
jz short Find_Partition ; 只有一个就跳转
seg
000
:
7
C
39
mov si
,
0
C
4
h ; 如果活动分区表为
0
或者大于
1
,则错误,si
=
C
4
h
seg
000
:
7
C
3
C mov cx
,
17
h ; cx
=
17
h 十进制的
23
(Invalid partition table的长度)
seg
000
:
7
C
3
F jmp short Print_Error ; si
=
C
4
h
+
600
h
=
6
C
4
h,指向Invalid partition table字符串
seg
000
:
7
C
41
;
seg
000
:
7
C
41
nop
seg
000
:
7
C
42
seg
000
:
7
C
42
Find_Partition
:
; CODE XREF
:
seg
000
:
7
C
37
j
seg
000
:
7
C
43
mov ah
,
41
h ; int
13
41
号功能,检测特定驱动器是否有扩展功能
seg
000
:
7
C
45
mov dl
,
80
h
seg
000
:
7
C
47
mov bx
,
55
AAh ; 如果存在扩展
13
H功能,执行完int
13
,bx
=
AA
55
h,CL
=
5
seg
000
:
7
C
4
A int
13
h ; DISK
-
Check
for
INT
13
h Extensions
seg
000
:
7
C
4
A ; BX
=
55
AAh
,
DL
=
drive
number
seg
000
:
7
C
4
A ; Return
:
CF
set
if
not
supported
seg
000
:
7
C
4
A ; AH
=
extensions
version
seg
000
:
7
C
4
A ; BX
=
AA
55
h
seg
000
:
7
C
4
A ; CX
=
Interface support bit map
seg
000
:
7
C
4
C pop dx
seg
000
:
7
C
4
D cmp bx
,
0
AA
55
h ; 判断是否存在扩展INT
13
功能
seg
000
:
7
C
51
jnz short loc_
7
C
86
; 调用int
13
的
02
号读扇区功能
seg
000
:
7
C
53
test cl
,
1
; 此时CL
=
5
seg
000
:
7
C
56
jz short loc_
7
C
86
; 调用int
13
的
02
号读扇区功能
seg
000
:
7
C
58
mov ax
,
4200
h
seg
000
:
7
C
5
B mov si
,
7
ADh ; si
=
7
ADh
seg
000
:
7
C
5
E mov cl
,
10
h ; 循环次数
seg
000
:
7
C
60
seg
000
:
7
C
60
loc_
7
C
60
:
; CODE XREF
:
seg
000
:
7
C
64
j
seg
000
:
7
C
60
mov byte ptr [si]
,
0
;
7
ADh到
7
BDh之间这
0
x
10
全部赋值为
0
seg
000
:
7
C
63
inc si
seg
000
:
7
C
64
loop loc_
7
C
60
;
7
ADh到
7
BDh之间这
0
x
10
全部赋值为
0
seg
000
:
7
C
66
mov si
,
7
ADh
seg
000
:
7
C
69
mov di
,
dx ; dx
=
0
x
7
BE
seg
000
:
7
C
6
B mov byte ptr [si]
,
10
h ; 设置
7
AD到
7
BD之间的值分别为
seg
000
:
7
C
6
B ;
10
00
01
00
00
7
C
00
00
3
F
00
00
00
00
00
00
00
seg
000
:
7
C
6
E mov byte ptr [si
+
2
]
,
1
seg
000
:
7
C
72
mov
word
ptr [si
+
4
]
,
7
C
00
h
seg
000
:
7
C
77
mov bx
,
[di
+
8
]
seg
000
:
7
C
7
A mov [si
+
8
]
,
bx
seg
000
:
7
C
7
D mov bx
,
[di
+
0
Ah]
seg
000
:
7
C
80
mov [si
+
0
Ah]
,
bx
seg
000
:
7
C
83
jmp short loc_
7
C
94
; 此时ax
=
4200
h,
seg
000
:
7
C
83
; 继续利用int
13
检测驱动器的扩展性
seg
000
:
7
C
83
;
seg
000
:
7
C
85
db
90
h ;
seg
000
:
7
C
86
;
seg
000
:
7
C
86
seg
000
:
7
C
86
loc_
7
C
86
:
; CODE XREF
:
seg
000
:
7
C
51
j
seg
000
:
7
C
86
; seg
000
:
7
C
56
j
seg
000
:
7
C
86
mov ax
,
201
h ; 调用int
13
的
02
号读扇区功能
seg
000
:
7
C
89
mov bx
,
7
C
00
h
seg
000
:
7
C
8
C mov si
,
dx
seg
000
:
7
C
8
E mov cx
,
[si
+
2
]
seg
000
:
7
C
91
mov dh
,
[si
+
1
] ; 将活动分区的第一个扇区读入到内存地址
0000
:
7
c
00
seg
000
:
7
C
94
seg
000
:
7
C
94
loc_
7
C
94
:
; CODE XREF
:
seg
000
:
7
C
83
j
seg
000
:
7
C
94
mov dl
,
80
h ; 此时ax
=
4200
h,
seg
000
:
7
C
94
; 继续利用int
13
检测驱动器的扩展性
seg
000
:
7
C
96
int
13
h ; DISK
-
READ SECTORS INTO MEMORY
seg
000
:
7
C
96
; AL
=
number
of
sectors
to
read
,
CH
=
track
,
CL
=
sector
seg
000
:
7
C
96
; DH
=
head
,
DL
=
drive
,
ES
:
BX
-
>
buffer
to
fill
seg
000
:
7
C
96
; Return
:
CF
set
on error
,
AH
=
status
,
AL
=
number
of
sectors
read
seg
000
:
7
C
98
mov si
,
7
DFEh
seg
000
:
7
C
9
B cmp
word
ptr [si]
,
0
AA
55
h ; 检测
0000
:
7
dfe是否等于
0
xaa
55
,
若不等于则显示
"Missing Operating System"
seg
000
:
7
C
9
F jz short DBR ; 相等就跳到DBR执行
seg
000
:
7
CA
1
mov si
,
0
DBh
seg
000
:
7
CA
4
mov cx
,
18
h ; 循环次数十进制
24
,Missing Operating System长度为
24
seg
000
:
7
CA
7
jmp short Print_Error ; si
=
C
4
h
+
600
h
=
6
C
4
h,指向Invalid partition table字符串
seg
000
:
7
CA
7
;
seg
000
:
7
CA
9
db
90
h ;
seg
000
:
7
CAA ;
seg
000
:
7
CAA
seg
000
:
7
CAA DBR
:
; CODE XREF
:
seg
000
:
7
C
9
Fj
seg
000
:
7
CAA xor ax
,
ax
seg
000
:
7
CAC push ax
seg
000
:
7
CAD mov ax
,
7
C
00
h
seg
000
:
7
CB
0
push ax
seg
000
:
7
CB
1
retf ; jmp到
0000
:
7
c
00
处,将控制权交给DBR
seg
000
:
7
CB
2
;
seg
000
:
7
CB
2
seg
000
:
7
CB
2
Print_Error
:
; CODE XREF
:
seg
000
:
7
C
3
Fj
seg
000
:
7
CB
2
; seg
000
:
7
CA
7
j
seg
000
:
7
CB
2
add
si
,
600
h ; si
=
C
4
h
+
600
h
=
6
C
4
h,指向Invalid partition table字符串
seg
000
:
7
CB
6
seg
000
:
7
CB
6
loc_
7
CB
6
:
; CODE XREF
:
seg
000
:
7
CBEj
seg
000
:
7
CB
6
lodsb ; 块装入指令
,
ds
:
si的值赋给al
seg
000
:
7
CB
6
; cx
=
23
为循环变量(loop的循环结束条件cx
=
0
)
seg
000
:
7
CB
6
; 一次显示一个al字符
seg
000
:
7
CB
7
mov bx
,
7
seg
000
:
7
CBA mov ah
,
0
Eh
seg
000
:
7
CBC int
10
h ;
-
VIDEO
-
WRITE CHARACTER AND ADVANCE CURSOR
(
TTY WRITE
)
seg
000
:
7
CBC ; AL
=
character
,
BH
=
display
page
(
alpha modes
)
seg
000
:
7
CBC ; BL
=
foreground color
(
graphics modes
)
seg
000
:
7
CBE loop loc_
7
CB
6
; 块装入指令
,
ds
:
si的值赋给al
seg
000
:
7
CBE ; cx
=
23
为循环变量(loop的循环结束条件cx
=
0
)
seg
000
:
7
CBE ; 一次显示一个al字符
seg
000
:
7
CC
0
seg
000
:
7
CC
0
loc_
7
CC
0
:
; CODE XREF
:
seg
000
:
7
CC
2
j
seg
000
:
7
CC
0
mov cl
,
0
Fh
seg
000
:
7
CC
2
loop loc_
7
CC
0
seg
000
:
7
CC
2
;
seg
000
:
7
CC
4
aInvalidPartitionTa db 'Invalid partition tableMissing operating system'
,
0
[size
=
3
]seg
000
:
7
CF
4
aMasterBootReco db 'Master Boot Record Wrote
by
MBR By DiskGenius'
,
0