1、申请ID:SuuXaxLZtQDNxLR
2、个人邮箱: 610644034@qq.com
3、原创技术文章
由于以前的账号太久没有登陆,现在已经找不回了,想重新注册,希望看到申请的管理员帮个忙。
一、原创技术文章 https://bbs.kanxue.com/thread-212994.htm
二、翻了一下硬盘,就地发个以前自己撸的源码,由于没有上传附件的权限,整个项目包括一个VB修改MBR工具源码没有办法上传,所以就核心源码直接发:
功能: 多分区选择引导启动 MBR
描述: MBR 引导显示 Enter 1 2 3 4 Load Dbr: 的时候输入数字从对应主分区引导启动系统。
asm 文件源码如下:
data segment
data ends
stack segment
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
;寄存器环境准备
xor ax,ax; 准备寄存器 33 C0
mov ss,ax; 准备堆栈段寄存器 8E D0
; 33 C0 8E D0 给出MBR特征码提供搜索MBR程序,提取MBR用
sti; 允许中断 FB
;=====================================================================================================================
mov sp, 07C00h; 准备堆栈寄存器 BC 00 7C
mov si, sp; mbr 准备复制的源地址 8B F4
mov di, 0600h; mbr 准备复制的目的地址 BF 00 06
push ax; 50
mov cl , 0; B1 00 正好在 0fh 偏移量位置,方便以后查找和修改 ******************
pop es; 准备代码段寄存器 07
push ax; 50
pop ds; 准备数据段寄存器 1F
cld; rep 指令si di 自加1 FC
;起始代码不变
;=====================================================================================================================
;准备寄存器环境
;cl 为 原始MBR的扇区号
;sp 7C00h
;si 7C00h
;di 0600h
;ax 0
;bp 指向 0600h 的分区表
;bx 指向 07C00h 的分区表
;dl 为 BIOS 环境磁盘驱动器 号
;每次 pusha popa 都恢复这个环境
mov bp , 00600h + 01beh ; bp 指向 00600h 的分区表
mov bx , 07C00h + 01beh ; bx 指向 07C00h 的分区表
db 1h dup(60h); pusha 寄存器全部保存 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
;------------------------------------------------
;修正 FAT32 引导扇区号 + 6
;mov bp , bx
;mov cl , 4
Scan_Set_DPT_Fat32_Boot_Loop:
; cmp byte ptr [bp + 4] , 0efh; fat32 分区标识
; jz Scan_Set_DPT_Fat32_Boot_SetFat32 ;
; cmp byte ptr [bp + 4] , 0bh; fat32 分区标识
; jz Scan_Set_DPT_Fat32_Boot_SetFat32 ;
; cmp byte ptr [bp + 4] , 0ch; fat32 分区标识
; jnz Scan_Set_DPT_Fat32_Boot_Check_byte1 ;
Scan_Set_DPT_Fat32_Boot_SetFat32:
; add byte ptr [bp + 2], 6 ; fat32 分区引导扇区在分区第6扇区 + 6
; add byte ptr [bp + 8], 6 ; fat32 分区引导扇区在分区第6扇区 + 6
; adc byte ptr [bp + 0ah], 0 ; fat32 分区引导扇区在分区第6扇区
Scan_Set_DPT_Fat32_Boot_Check_byte1:
; add bp, 10h
;loop Scan_Set_DPT_Fat32_Boot_Loop;
;------------------------------------------------
;拷贝MBR 从 07C00h 到 0600h
mov cx,200h;复制的字节数
rep movsb; 复制 mbr 拷贝 ds:si 到 es:di上,长度为cx
;也就是将MBR从07C00h处拷贝到 0600h,长度为200h 即512字节
;------------------------------------------------
;跳转到 0600h 的 Check_F_Mbr: 执行
db 6Ah,00h ; push word 00h
mov si , offset Check_F_Mbr - offset start + 00600h
push si
retf; 跳转到 0600h 的 Check_F_Mbr:执行
;=====================================================================================================================
Check_F_Mbr: ;检查没有 原始MBR
db 1h dup(61h); popa 寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 1h dup(60h); pusha 寄存器全部保存 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
cmp cl , 0; cl 原始MBR 的扇区号
jne Load_Boot_Mbr; 有 原始MBR
;------------------------------------------------
Look_Boot_Dbr: ;寻找活动分区启动
mov cx , 4 ;
Look_Boot_Dbr_Loop:
cmp byte ptr [bp + 0] , 0 ; 判断分区活动状态
jl Look_Boot_Dbr_Read_Dbr;
add bp , 010h;
Loop Look_Boot_Dbr_Loop
;-----------------------------------------------
Error_Boot:
hlt ;处理器暂停
jmp Error_Boot ;
;-----------------------------------------------
Look_Boot_Dbr_Read_Dbr:
call Read_Disk_Proc ;
jb Error_Boot ; 读扇区失败
cmp word ptr[ si + 510 ] , 0aa55h
jne Error_Boot ; 读扇区没有55aa标志
db 1h dup(61h) ; popa 寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 6Ah,00h ; push word 00h
push si;
retf;
;-----------------------------------------------
Load_Boot_Mbr: ;加载原始mbr
xor ch , ch;
mov word ptr [bp] , 00080h;
mov [bp + 8] , cx;
mov [bp + 0ah] , ax;
inc cl
mov [bp + 2] , cx;
call Read_Disk_Proc ;读原始MBR扇区
jb Error_Boot;
db 1h dup(61h); popa 寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 1h dup(60h); pusha 寄存器全部保存 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
cmp word ptr[ si + 510 ] , 0aa55h
jne Error_Boot ; 读扇区没有55aa标志
mov bp , bx
mov cx , 4 ;
Cel_DPT_Boot:
mov byte ptr [bp + 0] , 0 ; 取消所有分区活动状态
add bp , 010h
Loop Cel_DPT_Boot
Boot_Loop:
;-----------------------------------------------
mov si , offset init_msg - offset start + 0600h;
mov cx , 019h;
Show_Char_A: ;循环显示一个字符
lodsb;
mov bx, 7;
mov ah, 0Eh;
int 10h;
loop Show_Char_A;
;-----------------------------------------------
xor ax,ax;
int 16h ;捕捉键盘输入
cmp al,'1';
je Boot_Tab ;键盘输入 1 跳到0分区表项引导
cmp al,'2';
je Boot_Tab ;键盘输入 2 跳到1分区表项引导
cmp al,'3';
je Boot_Tab ;键盘输入 3 跳到2分区表项引导
cmp al,'4';
jne Boot_Loop; 键盘输入 4 跳到3分区表项引导 否则重新提示输入
;-----------------------------------------------
;捕捉到键盘输入(1/2/3/4键)后定位对应的分区表位置
Boot_Tab:
push ax;
mov bx, 7 ; 显示键盘输入
mov ah, 0Eh
int 10h;
pop cx ; cl 获取键盘输入码
sub cl , '1';
mov al , 10h;
mul cl ; ax 为 选中分区表项的 分区表偏移量
mov bp , ax;
add bp , 7C00h + 01beh;
mov byte ptr [bp] , 080h; 设置选中分区活动状态
db 1h dup(61h); popa 寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 6Ah,00h ; push word 00h
db 68h,00h,7Ch ; push word 7C00h
retf;
; ---------------------------------------------------------------------------
;参数 bp 指向 分区表项 DPT , 返回 jnb 到读取成功处理
Read_Disk_Proc:
; ---------------------------------------------------------------------------
mov byte ptr [bp+11h], 5
mov [bp] , dl
Read_Disk_Mode_Sel: ;选择扇区读寻址方式
db 1h dup(60h); pusha 寄存器全部保存
call Disk_Read_Sel_Mode
db 1h dup(61h); popa 寄存器全部恢复
db 1h dup(60h); pusha 寄存器全部保存
jb Disk_Read_SHS
Read_Disk_LBA: ;LBA 方式区读寻址方式
db 6Ah,00h ; push word 00h
db 6Ah,00h ; push word 00h
push word ptr [bp+0Ah]
push word ptr [bp+8]
db 6Ah,00h ; push word 00h
db 68h,00h,7Ch ; push word 7C00h 保存数据地址
db 6Ah,01h ; push word 01h 读多少扇区
db 6Ah,10h ; push word 010h
mov ah, 42h ;
mov dl, [bp+0]
mov si, sp
int 13h
lahf
add sp, 10h
jmp Disk_Read_Check_Exit
; ---------------------------------------------------------------------------
Disk_Read_SHS: ;SHS 方式区读寻址方式
mov ax, 201h ; al 读多少扇区
mov bx, 7C00h ; 保存数据地址
mov dl, [bp+0]
mov dh, [bp+1]
mov cl, [bp+2]
mov ch, [bp+3]
int 13h
lahf
Disk_Read_Check_Exit:
call Disk_Read_Reset;
db 1h dup(61h); popa 寄存器全部恢复
sahf
jnb Disk_Read_On
dec byte ptr [bp+11h]
jnz Disk_Read_Check_Exit_Error
cmp byte ptr [bp+0], 80h
jz Disk_Read_Check_Exit_Error
mov byte ptr [bp+0], 80h
jmp Read_Disk_Mode_Sel
; ---------------------------------------------------------------------------
Disk_Read_Check_Exit_Error:
stc;
Disk_Read_On:
retn;
; ---------------------------------------------------------------------------
Disk_Read_Sel_Mode: ;获取磁盘寻址模式
push bp
mov dl, [bp+0]
mov ah, 8
int 13h
pop bp
jb Disk_Read_Sel_Mode_SHS
mov dl, [bp+0]
mov bx, 55AAh
mov ah, 41h
int 13h
jb Disk_Read_Sel_Mode_SHS
cmp bx, 0AA55h
jnz Disk_Read_Sel_Mode_SHS
test cl, 1
jnz Disk_Read_Sel_Mode_LBA
Disk_Read_Sel_Mode_SHS:
stc;
retn; jnb LBA模式
Disk_Read_Sel_Mode_LBA:
clc;
retn; jnb LBA模式
; ---------------------------------------------------------------------------
Disk_Read_Reset: ; 磁盘复位
xor ah, ah
mov dl, [bp+0]
int 13h
retn;
; ---------------------------------------------------------------------------
init_msg db 0dh,0ah,'Enter 1 2 3 4 Load Dbr:'
;Error_msg db 'Error Dbr',0dh,0ah,0h
;boot_msg db 0dh,0ah,'boot Look Dbr X'
db 200H dup(0);全0标志
code ends
end start
以上asm文件编译链接出来的MBR为:
33 C0 8E D0 FB BC 00 7C 8B F4 BF 00 06 50 B1 00 <- 该值指定原始MBR的扇区号,0为无原始MBR或者不进行原始MBR引导,非0则会加载对应扇区继续引导启动,可根据需要修改
07 50 1F FC BD BE 07 BB BE 7D 60 B9 00 02 F3 A4
6A 00 BE 27 06 56 CB 61 60 80 F9 00 75 23 B9 04
00 80 7E 00 00 7C 08 83 C5 10 E2 F5 F4 EB FD E8
83 00 72 F8 81 BC FE 01 55 AA 75 F0 61 6A 00 56
CB 32 ED C7 46 00 80 00 89 4E 08 89 46 0A FE C1
89 4E 02 E8 5F 00 72 D4 61 60 81 BC FE 01 55 AA
75 CA 8B EB B9 04 00 C6 46 00 00 83 C5 10 E2 F7
BE 53 07 B9 19 00 AC BB 07 00 B4 0E CD 10 E2 F6
33 C0 CD 16 3C 31 74 0C 3C 32 74 08 3C 33 74 04
3C 34 75 DC 50 BB 07 00 B4 0E CD 10 59 80 E9 31
B0 10 F6 E1 8B E8 81 C5 BE 7D C6 46 00 80 61 6A
00 68 00 7C CB C6 46 11 05 88 56 00 60 E8 55 00
61 60 72 22 6A 00 6A 00 FF 76 0A FF 76 08 6A 00
68 00 7C 6A 01 6A 10 B4 42 8A 56 00 8B F4 CD 13
9F 83 C4 10 EB 15 B8 01 02 BB 00 7C 8A 56 00 8A
76 01 8A 4E 02 8A 6E 03 CD 13 9F E8 3D 00 61 9E
73 12 FE 4E 11 75 0C 80 7E 00 80 74 06 C6 46 00
80 EB A9 F9 C3 55 8A 56 00 B4 08 CD 13 5D 72 17
8A 56 00 BB AA 55 B4 41 CD 13 72 0B 81 FB 55 AA
75 05 F6 C1 01 75 02 F9 C3 F8 C3 32 E4 8A 56 00
CD 13 C3 0D 0A 45 6E 74 65 72 20 31 20 32 20 33
20 34 20 4C 6F 61 64 20 44 62 72 3A 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|