在对硬盘主引导记录熟悉之后,就可以编出很多种硬盘加密程序(完全取决于你自已的需要),随着硬盘容量越来越大,其实我们可以将硬盘分为两个盘,一个是C盘,一个是D盘,平时将C盘重要的文件拷贝至D盘,并将D盘加锁,这样当C盘受到破坏时,就可以解锁D盘,将D盘上存储的文件恢复过来,我下面的程序就是以这一原理来编写的,请看代码:
Announcement:You can use any editor to edit source codes,such as Notepad,QE,Edit and so on.
Source Codes:
data segment
FQB DB 512 dup(0);To define a buffer,which will be used to store harddisk's MBR
MESSAGE1 DB 0DH,0AH,"C------------LOCK C"
DB 0DH,0AH,"D------------LOCK D"
DB 0DH,0AH,"E------------Exit"
DB 0DH,0AH,"Enter your selection!$"
MESSAGE2 DB 0DH,0AH,"OK!$"
MESSAGE3 DB "NOT FOUND DRIVE D!$"
ERROR DB "ENTER ERROR!$"
IOERROR DB "HARDDISK I/O ERROR!$"
CXD DW 0
data ends
stack segment
DB 512 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
START:
mov AX,0201
mov BX,OFFSET FQB
mov CX,0001
mov CXD,CX
mov DX,0080
INT 13;Read Main Boot Record,which is in 0 Header,0 Cylinder,1 Sector
JB ERR
MOV DX,OFFSET MESS1
MOV AH,9
INT 21
AA0: ;Accept user's enter
MOV AH,1
INT 21
CMP AL,'E';Exit
JZ EXIT
CMP AL,'e';Exit
JZ EXIT
CMP AL,'C';Lock Drive C
JZ LockC
CMP AL,'c';Lock Drive C
JZ LockC
CMP AL,'D'
JZ LockD;//Lock Drive D
CMP AL,'d'
JZ LockD;//Lock Drive D
LEA DX,ERROR;Enter Error
MOV AH,9
INT 21
JMP EXIT
LockC:
MOV AH,55H
CLD
MOV SI,OFFSET FQB
MOV DI,SI
MOV CX,01FE
AA1:
LOADSB
XOR AL,AH
ROL AH,1
STOSB;//Encrypt Partition-Table
LOOP AA1
AA3:
MOV AX,0301
MOV BX,OFFSET BUF
MOV CX,CXD
MOV DX,0080
INT 13
JB ERR
LEA DX,MESSAGE2
MOV AH,9
INT 21
MOV AX,0040;Reset
MOV DS,AX
MOV AX,1234
MOV SI,0072
MOV [SI],AX
JMP FFFF:0000
INT 20
LockD:
CMP BYTE PTR [BUF+1D0],0
JNZ AA2
MOV DX,MESSAGE3;No Drive D
MOV AH,9
INT 21
JMP EXIT
AA2:
MOV AX,0201
MOV BX,OFFSET BUF
MOV CX,WORD PTR [BUF+1D0];Read Logic Drive D Partition-Table
MOV DX,0080
INT 13
JB ERR
JMP LockC
ERR:
MOV DX,OFFSET IOERROR
MOV AH,9
INT 21
EXIT:
MOV AH,4CH
INT 21
code ends
end start
上面的程序适合于只有两个分区的硬盘,不过程序也可以改进成多个分区的硬盘。在注释RESET处是热启动的代码,即交1234送至偏移地址0040:0072处,然后再跳转到FFFF:0处,即可以进行热启动。