带密保护码的MBR启动程序
nasm吧
全部回复
仅看楼主
level 1
mqron 楼主
RG 0600H
XOR AX,AX ; AX = 0
MOV DS,AX ; 设置数据段寄存器 DS:SI
MOV ES,AX ; 设置附加段寄存器 ES:DI
MOV SS,AX ; 设置堆栈段寄存器
MOV SI,7C00H ;源地址 MOV ES,AX ; 设置附加段寄存器 ES:DI
MOV DI,0600h; DI = 0600H 将MBR代码移动到0600H处
MOV CX,512 ; 待移动的字节数
CLD ; 方向为向前递增
REP MOVSB
;call 0:RealStart
JMP 0:RealStart
; 真正开始
RealStart:
MOV BYTE[BOOTDRIVER] , dl ;保存得到启动的驱动器号 CMP BYTE[Password],0
JZ START
.Password:
MOV SI,PBuffer
.KET:
MOV AH,0H
INT 16H ;接收按键
CMP AL,08H
JZ .DEL ; ;删除
CMP AL,0DH
JZ .ENT ;回车
CMP AL,33
JNG .KET
CMP AL,125
JG .KET
CMP SI,PBuffer+8
JNL .KET
MOV BYTE[SI],AL
INC SI
MOV BYTE[SI],0
JMP .KET
.DEL:
CMP SI,PBuffer
JZ .KET
DEC SI
MOV BYTE[SI],0
JMP .KET
.ENT:
PUSHA
MOV SI,Password
MOV DI,PBuffer
.EN1:
MOV AL,BYTE[SI]
CMP AL,0
JZ START
CMP BYTE[DI],AL
JNZ .EN1L
INC SI
INC DI
JMP .EN1
.EN1L:
POPA
JMP .Password
.ERR:
START:
MOV AH,41H ;====================================================================
MOV BX,055AAH ; 检查是否支持磁盘中断INT 13H的扩展
INT 13H ;====================================================================
JC .LookupActive ; 如果失败,进位标志为1
MOV BYTE [DiskExtension],0x1 ; 设置支持磁盘扩展标志.LookupActive: ; 查找激活分区
MOV SI,bootid ; 指向分区表.CheckNext: ;检查激活分区
MOV AL,[SI]
CMP BYTE [SI],0x80 ; 检查该分区是否激活
JZ .LoadBootSector ; 装载激活分区的引导扇区
ADD SI,10H ; 指向下一个分区表项
INC BYTE[ActivePartition]
CMP BYTE[ActivePartition],3
JG .Missing ; 没有找到激活分区
JMP .CheckNext
.LoadBootSector: ; 装载激活分区的引导扇区
MOV BL,BYTE [ActivePartition] ; 载入激活分区表项索引
MOV AH,0
MOV AL,0x10
MUL BL
MOV SI,bootid
ADD SI,AX
MOV DL,BYTE [BOOTDRIVER] ; 设置驱动器号 CMP BYTE [DiskExtension],01H ; 检查是否支持扩展磁盘调用
JNZ .NoDiskExtension
; 使用扩展磁盘调用读取引导扇区
; INT 13H
; AH = 42H
; DL = Drive Number
; DS:SI = 指向磁盘地址包的指针
MOV AX,WORD[SI+8]
MOV WORD[DAP_SECTOR_LOW],AX
MOV AX,WORD[SI+10]
MOV WORD[DAP_SECTOR_LOW+2],AX
MOV SI,DAP_PACKET_SIZE
MOV AH,42H
INT 13H
JC .Error
JMP .CheckBootSector
2011年10月15日 06点10分 1
level 1
mqron 楼主
.NoDiskExtension:
;====================================================================
;
; INT 13H
; AH = 2 柱面号:0 - 1023
; AL = 要读取的扇区数 磁头号:0 - 255
; CH = 柱面号低8位 扇区号:1 - 63
; CL = 柱面号高2位 : 6位扇区号
; DH = 磁头号
; DL = 驱动器号
; ES:BX = 缓冲区
;
;==================================================================== ; 读取引导扇区
MOV DH,BYTE[SI+1] ; 该分区起始磁头号
MOV CX,word[SI+2] ; 起始柱面号高2位:6位起始扇区号
;MOV CH,BYTE[SI
+3
] ; 起始柱面号高2位:6位起始扇区号
MOV BX,7C00H
MOV AX,0201H
INT 13H
JC .Error
JMP .CheckBootSector
.CheckBootSector:
push DS
MOV AX,0H
MOV DS,AX
; 装载引导扇区成功,检查引导标志
MOV SI,7C00H
ADD SI,510
MOV AX,WORD [SI]
CMP WORD [SI],0xaa55 ; 检查引导标志
JNZ .Error
POP DS
; 准备跳转到激活扇区的引导扇区代码
; DL = 磁盘驱动器号
; DH = 激活分区号
; DI = 激活分区项
MOV DL,BYTE [BOOTDRIVER]
call 0:7C00H
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.Invalid :
MOV SI ,Invalid
call ShowMessage
jmp $
.Error:
MOV SI ,Error
call ShowMessagejmp $
.Missing:
MOV SI ,Missing
call ShowMessagejmp $
ShowMessage:
.Show :
LODSB
CMP AL,0
JZ .SRET
mov ah, 0eh ; AH = 13, AL = 01h
mov bx, 0007h ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
int 10h ; 10h 号中断
JMP .Show
.SRET:
ret
Invalid db "Invalid Partition Table",0 ;无效的分区表
Error db "Error Loading System",0 ;错误加载操作系统
Missing db "Missing Boot Partition",0 ;缺少启动分区Password dq "66681762"
db 0 ;====================================================================
; 支持磁盘扩展标志
;====================================================================
BOOTDRIVER db 0 ;保存得到启动的驱动器号
ActivePartition DB 0 ; 保存激活分区表索引(0-3)
;====================================================================
; 支持磁盘扩展标志
;====================================================================
DiskExtension db 0 ; 设置支持磁盘扩展标志;====================================================================
; 扩展磁盘服务所使用的地址包
;====================================================================
DAP_PACKET_SIZE DB 10H ; 包的大小为16字节
DAP_RESERVED1 DB 00H ; 保留字节
DAP_READ_SECTORS DB 01H ; 要处理的扇区数(1 - 127 )
DAP_RESERVED2 DB 00H ; 保留字节
DAP_BUFFER_OFF DW 7C00H ; 缓冲区偏移
DAP_BUFFER_SEG DW 0000H ; 缓冲区段地址
DAP_SECTOR_LOW DD 0000H ; 起始扇区号的低32位
DAP_SECTOR_HIGH DD 0000H ; 起始扇区号的高32位
;====================================================================
; 扩展磁盘服务所使用的地址包完
;====================================================================times 434-($-$$) db 0
;====================================================================
; 标志字节
;====================================================================
DW 00H
;UniqueMbrSignature DD 0x72b97abc
incbin "Sectors.bin",436,8
UnknownWord DW 00H
;====================================================================
; 分区
;====================================================================
bootid:
incbin "Sectors.bin",446,64 ;Sectors.bin 为要改MBR的硬盘的MBR的备份文件
;%include "boot.inc"
;=============================================================times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
PBuffer:
;MBR 结束
;本人亲试通过 本代码用NASM编译 再用WINPM写入要改MBR的硬盘 不会搞的不乱来 本人概不负责
2011年10月15日 06点10分 2
level 1
mqron 楼主
RG 0600H
XOR AX,AX ; AX = 0
MOV DS,AX ; 设置数据段寄存器 DS:SI
MOV ES,AX ; 设置附加段寄存器 ES:DI
MOV SS,AX ; 设置堆栈段寄存器
MOV SI,7C00H ;源地址 MOV ES,AX ; 设置附加段寄存器 ES:DI
MOV DI,0600h; DI = 0600H 将MBR代码移动到0600H处
MOV CX,512 ; 待移动的字节数
CLD ; 方向为向前递增
REP MOVSB
;call 0:RealStart
JMP 0:RealStart
; 真正开始
RealStart:
MOV BYTE[BOOTDRIVER] , dl ;保存得到启动的驱动器号 CMP BYTE[Password],0
JZ START
.Password:
MOV SI,PBuffer
.KET:
MOV AH,0H
INT 16H ;接收按键
CMP AL,08H
JZ .DEL ; ;删除
CMP AL,0DH
JZ .ENT ;回车
CMP AL,33
JNG .KET
CMP AL,125
JG .KET
CMP SI,PBuffer+8
JNL .KET
MOV BYTE[SI],AL
INC SI
MOV BYTE[SI],0
JMP .KET
.DEL:
CMP SI,PBuffer
JZ .KET
DEC SI
MOV BYTE[SI],0
JMP .KET
.ENT:
PUSHA
MOV SI,Password
MOV DI,PBuffer
.EN1:
MOV AL,BYTE[SI]
CMP AL,0
JZ START
CMP BYTE[DI],AL
JNZ .EN1L
INC SI
INC DI
JMP .EN1
.EN1L:
POPA
JMP .Password
.ERR:
START:
MOV AH,41H ;====================================================================
MOV BX,055AAH ; 检查是否支持磁盘中断INT 13H的扩展
INT 13H ;====================================================================
JC .LookupActive ; 如果失败,进位标志为1
MOV BYTE [DiskExtension],0x1 ; 设置支持磁盘扩展标志.LookupActive: ; 查找激活分区
MOV SI,bootid ; 指向分区表.CheckNext: ;检查激活分区
MOV AL,[SI]
CMP BYTE [SI],0x80 ; 检查该分区是否激活
JZ .LoadBootSector ; 装载激活分区的引导扇区
ADD SI,10H ; 指向下一个分区表项
INC BYTE[ActivePartition]
CMP BYTE[ActivePartition],3
JG .Missing ; 没有找到激活分区
JMP .CheckNext
.LoadBootSector: ; 装载激活分区的引导扇区
MOV BL,BYTE [ActivePartition] ; 载入激活分区表项索引
MOV AH,0
MOV AL,0x10
MUL BL
MOV SI,bootid
ADD SI,AX
MOV DL,BYTE [BOOTDRIVER] ; 设置驱动器号 CMP BYTE [DiskExtension],01H ; 检查是否支持扩展磁盘调用
JNZ .NoDiskExtension
; 使用扩展磁盘调用读取引导扇区
; INT 13H
; AH = 42H
; DL = Drive Number
; DS:SI = 指向磁盘地址包的指针
MOV AX,WORD[SI+8]
MOV WORD[DAP_SECTOR_LOW],AX
MOV AX,WORD[SI+10]
MOV WORD[DAP_SECTOR_LOW+2],AX
MOV SI,DAP_PACKET_SIZE
MOV AH,42H
INT 13H
JC .Error
JMP .CheckBootSector

2011年10月15日 07点10分 3
level 1
mqron 楼主

ORG 0600H
;真正开始
RealStart:
MOV BYTE[BOOTDRIVER] , dl ;保存得到启动的驱动器号
CMP BYTE[Password],0
在百度发的都变形了
2011年10月15日 07点10分 4
1