基于MBR的系统登录密码验证程序

qjsbha 2010-05-17 08:15:38
;Author:leehu
;Email:sbha0909@yahoo.com.cn
;QQ:416049355
;copy the NASM assembler, and use the command
;nasm.exe -f bin boot.asm
;Date:2010年05月14日
;安装方法:
;我用的是VC,写一个简单的安装程序;主要工作如下
;将原始MBR拷贝到第二扇区,并将本程序编译生成的二进制代码拷贝到第一扇区,另外请确认第一扇区的分区表信息
;与原始MBR的分区表信息完全相同,不同机器分区表都不尽相同
;密码为:kevin
;注:一扇区512个字节,空间比较小暂时没有添加修改密码功能,一时兴起之作,只为误乐。
;希望能认识高手,能学到真正的技术。
;连接:http://hi.baidu.com/justear

;=================================================================
CPU 486
BITS 16

xor ebx,ebx
mov ds,bx
mov ax,[0x413] ;40:13,BIOS数据区保存常规的内存大小,单位:KBs.
and al,0xfc ;要求分配的物理内存地址,以页作为基地址
sub ax,4
mov [0x413],ax ;开辟一段内存,实现程序的驻留
shl ax,0x6 ;bx *= 1024 / 16 (KBs->线性地址=KBs*1024,段:除以16)
mov es,ax ;存储段地址

mov si,0x7c00 ;拷贝代码到驻留内存中执行
xor di,di ;偏移地址为0
mov cx,0x100 ;拷贝512
rep movsw

mov ax,0x201
mov cl,0x2
cdq ;Convert Double to Quad (386+)把edx扩展为eax的高位,也就是说变为64位。

push es
push word password
retf
;=====================================================================
password: ;校验密码
MOV SI,ShowAuthorMessage
CALL SHOWMESSAGE
mov si,ShowEnterMessage
CALL SHOWMESSAGE
CALL GETKEY
cmp cx,PassWordLength
je bootloader
again: ;第二次校验密码
mov si,ShowError
call SHOWMESSAGE
mov si,ShowEnterMessage
CALL SHOWMESSAGE
CALL GETKEY
cmp cx,PassWordLength
je bootloader
lasttime: ;最后一次校验密码
mov si,ShowLastError
call SHOWMESSAGE
mov si,ShowEnterMessage
CALL SHOWMESSAGE
CALL GETKEY
cmp cx,PassWordLength
je bootloader
wrong: ;登陆失败
mov si,ShowByeBye
CALL SHOWMESSAGE
jmp $

bootloader: ;校验密码成功,开始登陆

mov si,ShowWelcome
call SHOWMESSAGE
CALL GETENTER

mov es,dx
mov eax,0x201
mov ecx,02h ;读第二扇区的原始MBR引导开机
mov edx,0x80
mov ebx,0x7c00
int 0x13

popad
pop ds
pop sp

jmp 0x0:0x7c00 ;jmp to original mbr from hard drive
;======================================================================
SHOWMESSAGE:
mov bx,0007h ; Page Number = 0, Attribute = 07h
mov ah,0Eh ; Function 0Eh: Teletype Output
cs lodsb ; load the first character
Next_Char:
int 10h
cs lodsb ; al = next character
or al,al ; last letter?
jnz Next_Char ; if not print next letter
RETURNBACK:
ret
;===========================================================
GETKEY:
XOR CX,CX
LOOP:
MOV AH,0
INT 16H
mov bl,al
AND BX,0xFF
CMP AL,0DH ;判断是否Enter键
JZ RETURNBACK
ADD CX,bx ;存入CX中
MOV AL,2AH
MOV BX,07H
MOV AH,0EH
INT 10H ;显示*号,继续等待输入
JMP LOOP
;======================================================
GETENTER: ;判断是否Enter键,如果是则返回,若不是继续等待输入
MOV AH,0
INT 16H
AND AX,0xFF
CMP AL,0DH
JNZ GETENTER
RET
;=======================================================
ShowAuthorMessage db 10, 13, "Author:sbha0909@yahoo.com.cn", 0
ShowEnterMessage db 10, 13, "Enter PassWord:", 0
ShowError db 10, 13, "wrong password!...Try again", 0
ShowLastError db 10, 13, "wrong password!...Try Last Time", 0
PassWordLength EQU 021DH ;"lenght of 'kevin'"
ShowByeBye db 10, 13, "Sorry...Please Don't Use My PC!", 0
ShowWelcome db 10, 13, "Welcome kevin...!Press Enter to load Windows", 0
;=================================================================

CodeEnd EQU $

times 510-($-$$) db 0 ;填充00h
Boot_Signature dw 0AA55h
;===============================================================
;程序结束,使用nasm.exe -f bin boot.asm编译生成bin文件就可以在安装程序中使用
;下载可以测试玩一下:http://download.csdn.net/source/2352950
...全文
133 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2010-05-17
  • 打赏
  • 举报
回复
多谢,做过masm的。不过只用了一个扇区。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧