这是我以前练习时自己编得玩的,编译成EXE文件后。。。不要轻易去试啊,到时出了意外我不负责。。。
=======================================
.model tiny
.code
diskio equ 13h
video equ 10h
org 200h
getpassword proc
passbegin:
myroutine:
push cs
pop ds
mov di,offset headmsg
call put_str
mov di,offset pswbuffer
call readstr
mov si,offset pswbuffer
mov di,offset password
xor ch,ch
mov cl,byte ptr
repe cmpsb
jz right
mov di, offset errormsg
call put_str
deadloop :
jmp deadloop
right:
ret
readstr proc near
push es
push di
push cs
pop es
inc di
mov plength,0
next:
cmp plength,15
jge @l1
mov ah,1
int 16h
jz next
mov ax,0
int 16h
cmp al,0
je next
cmp al,08
je @l2
cmp al,13
je @l1
sub al,20
or al,80h
stosb
mov al,'X'
mov bx,0
mov ah,0eh
int 10h
inc plength
jmp next
@l2:
cmp plength,0
je next
dec di
mov al,00h
stosb
mov ah,03h
mov bh,00h
int 10h
dec dx
mov ah,02h
int 10h
mov al,' '
mov ah,0eh
int 10h
mov ah,02h
int 10h
dec plength
dec di
jmp next
@l1:
pop di
mov al,byte ptr plength
mov byte ptr ,al
pop es
ret
readstr endp
;
put_str proc
mov al,cs:
cmp al,'$'
je a1
mov ah,0eh
mov bx,0003h
int video
inc di
jmp put_str
a1:
ret
put_str endp
plength db 0
headmsg db"圹鄄膊北卑鞍 PASS WORD FOR HD SYSTEM 鞍氨北膊槽圹",0AH,0DH
db"****** PassWord is: MASTER ******(NOT master!!!!)",0ah,0dh
db"****** I am Sorry harddisk is write protect!!!!!",0ah,0dh
db"****** BUT You Can type the password to visit drive C:",0ah,0dh
db"圹鄄膊北卑鞍 Please input Password(MASTER) 鞍氨北膊槽圹",0ah,0dh
db 0ah,0dh
db 'Password:','$'
passtail:
passlen equ 1024-(passtail-passbegin)
db passlen dup(0)
org passbegin+1024
getpassword endp
org 600h
getpass proc
pbegin:
push ax
push cx
push ds
push es
push si
push di
xor ax,ax
mov ds,ax
mov es,ax
mov ax,ds:
mov ds,ax
mov es,ax
mov di,offset pswbuffer
call preadstr
mov si,offset pswbuffer
mov di,offset password
xor ch,ch
mov cl,byte ptr
repe cmpsb
mov ax,1075h
mov cx,5
jz right2
$t1:
add ax,200h
call music
call delay
loop $t1
call nosound
pop di
pop si
pop es
pop ds
pop cx
pop ax
stc
ret
right2:
mov ax,2275h
$t4:
sub ax,200h
call music
call delay
loop $t4
call nosound
pop di
pop si
pop es
pop ds
pop cx
pop ax
clc
ret
preadstr proc near
push es
push di
inc di
mov plength,0
pnext :
cmp plength ,15
jge @pl1
mov ah,1
int 16h
jz pnext
mov ax,0
int 16h
cmp al,0
je pnext
cmp al,08
je @pl2
cmp al,13
je @pl1
sub al,20
or al,80h
stosb
inc plength
jmp pnext
@pl2:
cmp plength,0
je pnext
dec di
mov al,00h
stosb
dec plength
dec di
jmp pnext
@pl1:
pop di
mov al,byte ptr plength
mov byte ptr ,al
pop es
ret
preadstr endp
timer2 equ 42h
tim_ctr equ 43h
port_b equ 61h
music proc
push ax
mov al,10110110b
out tim_ctr,al
pop ax
out timer2,al
mov al,ah
out timer2 ,al
in al,port_b
or al,00000011b
out port_b,al
ret
music endp
nosound proc
in al,port_b
and al,11111100b
out port_b,al
ret
nosound endp
delay proc
push si
mov si,0a000h
@j1:
dec si
cmp si,0
jnz @j1
pop si
ret
delay endp
errormsg db 0ah,0dh
db"鞍氨北膊槽圹 Access Denied 圹鄄膊北卑鞍",0ah,0dh
db"========= Unauthorized User =========",0ah,0dh,'$'
ptail:
restlen equ 200h-(ptail-pbegin)-32
db restlen dup (0)
org pbegin+200h-32
password db 0,15 dup(0)
pswbuffer db 0,15 dup(1)
getpass endp
end
=====================
=======================================
.model tiny
.code
diskio equ 13h
video equ 10h
org 200h
getpassword proc
passbegin:
myroutine:
push cs
pop ds
mov di,offset headmsg
call put_str
mov di,offset pswbuffer
call readstr
mov si,offset pswbuffer
mov di,offset password
xor ch,ch
mov cl,byte ptr
repe cmpsb
jz right
mov di, offset errormsg
call put_str
deadloop :
jmp deadloop
right:
ret
readstr proc near
push es
push di
push cs
pop es
inc di
mov plength,0
next:
cmp plength,15
jge @l1
mov ah,1
int 16h
jz next
mov ax,0
int 16h
cmp al,0
je next
cmp al,08
je @l2
cmp al,13
je @l1
sub al,20
or al,80h
stosb
mov al,'X'
mov bx,0
mov ah,0eh
int 10h
inc plength
jmp next
@l2:
cmp plength,0
je next
dec di
mov al,00h
stosb
mov ah,03h
mov bh,00h
int 10h
dec dx
mov ah,02h
int 10h
mov al,' '
mov ah,0eh
int 10h
mov ah,02h
int 10h
dec plength
dec di
jmp next
@l1:
pop di
mov al,byte ptr plength
mov byte ptr ,al
pop es
ret
readstr endp
;
put_str proc
mov al,cs:
cmp al,'$'
je a1
mov ah,0eh
mov bx,0003h
int video
inc di
jmp put_str
a1:
ret
put_str endp
plength db 0
headmsg db"圹鄄膊北卑鞍 PASS WORD FOR HD SYSTEM 鞍氨北膊槽圹",0AH,0DH
db"****** PassWord is: MASTER ******(NOT master!!!!)",0ah,0dh
db"****** I am Sorry harddisk is write protect!!!!!",0ah,0dh
db"****** BUT You Can type the password to visit drive C:",0ah,0dh
db"圹鄄膊北卑鞍 Please input Password(MASTER) 鞍氨北膊槽圹",0ah,0dh
db 0ah,0dh
db 'Password:','$'
passtail:
passlen equ 1024-(passtail-passbegin)
db passlen dup(0)
org passbegin+1024
getpassword endp
org 600h
getpass proc
pbegin:
push ax
push cx
push ds
push es
push si
push di
xor ax,ax
mov ds,ax
mov es,ax
mov ax,ds:
mov ds,ax
mov es,ax
mov di,offset pswbuffer
call preadstr
mov si,offset pswbuffer
mov di,offset password
xor ch,ch
mov cl,byte ptr
repe cmpsb
mov ax,1075h
mov cx,5
jz right2
$t1:
add ax,200h
call music
call delay
loop $t1
call nosound
pop di
pop si
pop es
pop ds
pop cx
pop ax
stc
ret
right2:
mov ax,2275h
$t4:
sub ax,200h
call music
call delay
loop $t4
call nosound
pop di
pop si
pop es
pop ds
pop cx
pop ax
clc
ret
preadstr proc near
push es
push di
inc di
mov plength,0
pnext :
cmp plength ,15
jge @pl1
mov ah,1
int 16h
jz pnext
mov ax,0
int 16h
cmp al,0
je pnext
cmp al,08
je @pl2
cmp al,13
je @pl1
sub al,20
or al,80h
stosb
inc plength
jmp pnext
@pl2:
cmp plength,0
je pnext
dec di
mov al,00h
stosb
dec plength
dec di
jmp pnext
@pl1:
pop di
mov al,byte ptr plength
mov byte ptr ,al
pop es
ret
preadstr endp
timer2 equ 42h
tim_ctr equ 43h
port_b equ 61h
music proc
push ax
mov al,10110110b
out tim_ctr,al
pop ax
out timer2,al
mov al,ah
out timer2 ,al
in al,port_b
or al,00000011b
out port_b,al
ret
music endp
nosound proc
in al,port_b
and al,11111100b
out port_b,al
ret
nosound endp
delay proc
push si
mov si,0a000h
@j1:
dec si
cmp si,0
jnz @j1
pop si
ret
delay endp
errormsg db 0ah,0dh
db"鞍氨北膊槽圹 Access Denied 圹鄄膊北卑鞍",0ah,0dh
db"========= Unauthorized User =========",0ah,0dh,'$'
ptail:
restlen equ 200h-(ptail-pbegin)-32
db restlen dup (0)
org pbegin+200h-32
password db 0,15 dup(0)
pswbuffer db 0,15 dup(1)
getpass endp
end
=====================
Gemini 解答
代码功能与风险分析
这段汇编代码是一个硬盘引导扇区锁的核心逻辑,需结合之前的C语言安装程序理解:C程序会将这段汇编代码写入硬盘引导扇区(第1扇区)和后续扇区,替换原MBR;系统重启后,这段汇编代码会作为引导程序执行,实现硬盘写保护或访问限制。
1. 核心机制
- 引导执行流程:系统启动时,BIOS加载硬盘第1扇区到内存
0x7C00并执行。这段代码的入口是getpassword过程,会先显示密码提示(headmsg),要求用户输入密码。- 密码验证:输入的密码(存储在
pswbuffer)与预设密码(password,由C程序安装时写入)逐字节比较。若验证失败,进入deadloop死循环,阻止系统继续引导;若验证成功,才会继续执行原MBR的引导逻辑(需结合C程序的扇区备份与恢复逻辑)。- 辅助功能:包含键盘输入(
readstr)、字符串显示(put_str)、蜂鸣器提示(music/nosound)等基础BIOS调用。2. 风险与技术问题
- 引导扇区破坏:C程序直接覆盖硬盘第1扇区(MBR)和后续扇区,若安装过程中断或密码丢失,会导致系统无法启动。原帖提到用KV300修复引导扇区,是因为这类工具会读取MBR备份或重建分区表。
- 兼容性差:依赖BIOS中断(如
int 13h磁盘操作、int 10h显示、int 16h键盘),不同BIOS或硬件(如SCSI硬盘、大硬盘)可能存在兼容性问题。- 密码存储不安全:密码以明文(或简单变换)存储在扇区中,可通过磁盘编辑器直接读取。
- 写保护逻辑不完整:原帖描述“让硬盘不能写,只能读”,但这段汇编代码仅实现了引导阶段的密码验证,未拦截后续操作系统的写操作。真正的写保护需要拦截
int 13h的写功能调用(如ah=03h),这段代码未实现该逻辑,可能是原帖描述或代码未完成。3. 历史背景与常见误解
2000年前后,这类“硬盘锁”程序常见于个人实验或早期安全工具,但存在明显缺陷:
- 混淆“引导锁”与“写保护”:引导锁仅阻止系统启动,无法阻止从PE/软盘启动后修改硬盘;真正的硬盘写保护需硬件支持(如硬盘跳线)或操作系统级驱动拦截。
- 依赖BIOS中断的脆弱性:BIOS中断可被后续程序 hook 或绕过,安全性极低。
- 修复手段有限:当时依赖KV300等工具的“引导扇区修复”功能,本质是恢复MBR备份,而非破解密码。
4. 正确的硬盘保护方式(当年可行方案)
- 硬件写保护:通过硬盘跳线或专用卡实现,最可靠。
- 操作系统级工具:如DOS下的
HD-LOCK等商业软件,通过拦截int 13h实现写保护,但需在操作系统加载后运行。- BIOS密码:部分主板支持设置硬盘访问密码(需硬件支持),比软件锁更可靠。
总结
这段代码是一个引导扇区密码验证程序,而非真正的硬盘写保护工具。其核心风险是破坏MBR导致系统无法启动,且安全性极低。当年这类程序因技术门槛低、满足“个性化安全”需求而流行,但本质是利用引导扇区的可修改性实现的“玩具级”保护,存在诸多技术缺陷。
================================= kickout
大功告成,打个Kiss!
大功告成,打个Kiss!

;