1.原理
给硬盘加锁的方法很多,但最简单的方法是改变主引导记录或者改变分区表中某些关键字,达到不能使用硬盘的目的。硬盘主引导扇区内容如下:
000H 主引导记录(240字节)
0F0H 全0(206字节)
1BEH 第一分区表(16字节)
1CEH 第二分区表(16字节)
1DEH 第三分区表(16字节)
1EEH 第四分区表(16字节)
55H AAH
主引导扇区最后两个字节55H和AAH是硬盘自举记录的有效标志。每个分区表为16个字节,内容如下:
0 Boot ind
1 H
2 S
3 CYL
4 SYS ind
5 H
6 S
7 CYL
8-11 Rel seet
12-15 # of sects
其中Boot ind是自举标志字节,其值为80H时,表示可自举分区;其值为00H时,表示不可自举分区。SYS ind 是DOS系统标志字节,其值为01时,表示DOS分区;为00H时,表示未知。H.S.CYL表示分区的起止地址:H是磁头号;S是扇区号;CYL指柱面号的低8位;高2位在S字节的高2位;Rel seet表示该分区的相对扇区号,# of sects表示该分区实用的扇区。例如,某硬盘的一个分区表为 80 00 02 00 01 03 51 30 01 00 00 00 03 51 00 00,第一个字节80H是自举分标志,第五个字节01是DOS分区标志,若改变01H为00H,可达到加密硬盘效果。下面的程序仅仅修改主引导扇区是最后两个字节55H和AAH,修改后若启用硬盘启动,则系统提示:Disk Boot Failure. Insert system Disk AND Press Enter.
使用的主要函数如下:
char biosdisk(int cmd, int drive, int head, int track, int sector, int nsects,void*buffer);
该函数使用中断0x13,把磁盘操作直接转给BIOS。Cmd指示待执行的操作。其中cmd为2时是读盘操作;为3时是写盘操作。drive为0时代表第一个软驱;为1表示第二个软驱,0x80表示第一个硬驱,返回值00时,表示操作成功。
2.程序清单
#include <bios.h>
#include <stdio.h>
#include <conio.h>
int main()
{
int result;
char buffer[512];
result = biosdisk(2,0x80,0,0,1,1,buffer);
if(!result)
{
buffer[510] = 0x0;
buffer[511] = 0x0;
printf("读主引导扇区失败!\n");
}
if(!result)
{
result = biosdisk(3,0x80,0,0,1,1,buffer);
}
(!result)?(printf("写主引导扇区成功!\n")):(printf("写主引导扇区失败!\n"));
return 0;
}