这个问题比较老了,而且试验起来有一定的危险性,你学习的重点也不应该是这方面了,国内这方面有两本经典图书,一本是Dos大全,介绍了所有的中断,一本是将磁盘加密技术的书。
我原来为研究磁盘加密写过类似的程序,但很简单,全部是C的,是直接调中断进行操作。原代码很长,是一个类似PC Tools的工具。我找出一部分给你。
void Format(void)
{
union REGS reg1,reg2,reg3;
struct SREGS sr1;
char ccc;
char trktbl[76];
int i,j,k,F_Error=0,W0_sec,n;
int Disk,Trk=80,Sect,F_Disk,key;
char Er_account=0;
char *string[4]={"360Kb Floppy Disk",
"1.2M Floppy Disk",
"720Kb Floppy Disk",
"1.44M Floppy Disk",
};
Message("Format A or B driver(A/B)?");
Sign_on();
ccc=getche();
delay(300);
Sign_off();
..... ........
textcolor(LIGHTGREEN);
for(i=0;i<4;i++)
{
gotoxy(25,8+i);
cprintf("%s",string[i]);
}
textcolor(WHITE);
textbackground(RED);
gotoxy(25,7+Disk);
cprintf("%s",string[Disk-1]);
key=1;
if(Disk==2 || Disk==4)
{while(key!=7181 && key!=283)
{key=specialkey();
if(key==18432 || key==20480)
{textcolor(LIGHTGREEN);
textbackground(11);
gotoxy(25,7+Disk);
cprintf("%s",string[Disk-1]);
if(Disk==2||Disk==4) Disk--;
else if(Disk==1||Disk==3) Disk++;
textcolor(WHITE);
textbackground(RED);
gotoxy(25,7+Disk);
cprintf("%s",string[Disk-1]);
}
}
}
//根据用户选择的磁盘,确定在磁盘的0道0扇写的数据
if(key==7181)
{
switch(Disk)
{case 1:Trk=40;
Sect=9;
Boot_Sec[0xd]=2;
Boot_Sec[0x18]=9;
Boot_Sec[0x11]=112;
Boot_Sec[0x13]=0xd0;
Boot_Sec[0x14]=0x02;
Boot_Sec[0x16]=0x2;
W0_sec=11;
break;
case 2:Trk=80;
Sect=15;
Boot_Sec[0xd]=1;
Boot_Sec[0x18]=15;
Boot_Sec[0x11]=224;
Boot_Sec[0x13]=0x60;
Boot_Sec[0x14]=0x09;
Boot_Sec[0x16]=0x7;
W0_sec=28;
break;
case 3:Trk=80;
Sect=9;
Boot_Sec[0xd]=2;
Boot_Sec[0x18]=9;
Boot_Sec[0x11]=112;
Boot_Sec[0x13]=0x90;
Boot_Sec[0x14]=0x05;
Boot_Sec[0x16]=0x7;
W0_sec=17;
break;
case 4:Trk=80;
Sect=18;
Boot_Sec[0xd]=1;
Boot_Sec[0x18]=18;
Boot_Sec[0x11]=112;
Boot_Sec[0x13]=0x40;
Boot_Sec[0x14]=0x0b;
Boot_Sec[0x16]=0x9;
W0_sec=32;
}
textcolor(RED);
textbackground(11);
gotoxy(15,12);
cprintf("This floppy disk have %3d Track and %3d Sector",Trk,Sect);
pokeb(0,0x525,2);
pokeb(0,0x526,Sect);
pokeb(0,0x529,0x54);
pokeb(0,0x528,2);
pokeb(0,0x52A,0xf6);
if(Trk==40) pokeb(0,0x529,0x50);
reg1.x.bx=FP_OFF(trktbl);
sr1.es=FP_SEG(trktbl);
reg1.h.ah=0x05;
reg1.h.dl=F_Disk;
for(i=0;i<Trk;i++)
{for(j=0;j<2;j++)
{
for(k=0;k<Sect;k++)
{
trktbl[k*4]=i;
trktbl[k*4+1]=j;
trktbl[k*4+2]=k+1;
trktbl[k*4+3]=2;
}
gotoxy(30,13);
cprintf("Trk=%-5d Head=%-5d/n",i,j);
for(Er_account=0;Er_account<3;Er_account++)
{
reg1.h.ch=i;
reg1.h.dh=j;
//格式化各个磁道
int86x(0x13,®1,®2,&sr1);
if(reg2.h.ah!=0)
{
Er_account++;
cprintf("Error11111=%d/n",reg2.h.ah);
F_Error=reg2.h.ah;
}
else break;
}
if(F_Error!=0) break;
}
if(F_Error!=0) break;
}
if(F_Error==0)
{reg1.h.ah=3;
reg1.h.al=1;
reg1.h.ch=0;
reg1.h.cl=1;
reg1.h.dh=F_Disk;
reg1.h.dl=0;
reg1.x.bx=FP_OFF(Boot_Sec);
sr1.es=FP_SEG(Boot_Sec);
int86x(0x13,®1,®2,&sr1);
if(reg2.h.ah!=0)
F_Error=reg2.h.ah;
else
for(i=0;i<512;i++) Disk_trk[i]=0;
//写入0道0扇
if(F_Error==0)
for(n=2;n<=Sect;n++)
{reg1.h.ah=3;
reg1.h.al=1;
reg1.h.ch=0;
reg1.h.cl=n;
reg1.h.dh=0;
reg1.h.dl=F_Disk;
reg1.x.bx=FP_OFF(Disk_trk);
sr1.es=FP_SEG(Disk_trk);
int86x(0x13,®1,®2,&sr1);
if(reg2.h.ah!=0)
{
printf("Error=%d/n",reg2.h.ah);
F_Error=88;
break;
}
}
W0_sec=W0_sec-Sect+1;
//写如FAT表
if(F_Error==0)
for(n=1;n<W0_sec;n++)
{reg1.h.ah=3;
reg1.h.al=1;
reg1.h.ch=0;
reg1.h.cl=n;
reg1.h.dh=1;
reg1.h.dl=F_Disk;
reg1.x.bx=FP_OFF(Disk_trk);
sr1.es=FP_SEG(Disk_trk);
int86x(0x13,®1,®2,&sr1);
if(reg2.h.ah!=0)
{
F_Error=88;
break;
}
}
}
if(F_Error!=0) Disk_er(F_Error);
}
}
else if(ccc!=65&&ccc!=97&&ccc!=66&&ccc!=98)
Alarm();
List_dir(B_List[1],B_List[0]);
}
Top
21 楼fullsail(远航)回复于 2003-01-17 00:57:36 得分 0
我当年就是在这种没前途的东西上花费了太多的时间,但磁盘加密技术没有继续使用下去我的确比较奇怪,因为从技术上将,他不比软件狗好破解。代码中有很多都是界面上的显示部分,你可以不在意。主要看中断部分,你同时还要熟悉磁盘结构。
下面是0道0扇磁盘扇区部分。
unsigned char Boot_Sec[512]={
0xeb,0x3c,0x90,0x4d,0x59,0x20,0x54,0x4f,0x4f,0x4c,0x53,0x00,0x02,0x01,0x01,
0x00,0x02,0xe0,0x00,0x40,0x0b,0xf0,0x09,0x00,0x12,0x00,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x3a,0x0a,0x7f,0x98,0x36,0x33,
0x30,0x41,0x31,0x37,0x31,0x33,0x30,0x32,0x31,0x46,0x41,0x54,0x31,0x32,0x20,
0x20,0x20,0xfa,0x33,0xc0,0x8e,0xd0,0xbc,0x00,0x7c,0x16,0x07,0xbb,0x78,0x00,
0x36,0xc5,0x37,0x1e,0x56,0x16,0x53,0xbf,0x3e,0x7c,0xb9,0x0b,0x00,0xfc,0xf3,
0xa4,0x06,0x1f,0xc6,0x45,0xfe,0x0f,0x8b,0x0e,0x18,0x7c,0x88,0x4d,0xf9,0x89,
0x47,0x02,0xc7,0x07,0x3e,0x7c,0xfb,0xcd,0x13,0x72,0x79,0x33,0xc0,0x39,0x06,
0x13,0x7c,0x74,0x08,0x8b,0x0e,0x13,0x7c,0x89,0x0e,0x20,0x7c,0xa0,0x10,0x7c,
0xf7,0x26,0x16,0x7c,0x03,0x06,0x1c,0x7c,0x13,0x16,0x1e,0x7c,0x03,0x06,0x0e,
0x7c,0x83,0xd2,0x00,0xa3,0x50,0x7c,0x89,0x16,0x52,0x7c,0xa3,0x49,0x7c,0x89,
0x16,0x4b,0x7c,0xb8,0x20,0x00,0xf7,0x26,0x11,0x7c,0x8b,0x1e,0x0b,0x7c,0x03,
0xc3,0x48,0xf7,0xf3,0x01,0x06,0x49,0x7c,0x83,0x16,0x4b,0x7c,0x00,0xbb,0x00,
0x05,0x8b,0x16,0x52,0x7c,0xa1,0x50,0x7c,0xe8,0x92,0x00,0x72,0x1d,0xb0,0x01,
0xe8,0xac,0x00,0x72,0x16,0x8b,0xfb,0xb9,0x0b,0x00,0xbe,0xdf,0x7d,0xf3,0xa6,
0x75,0x0a,0x8d,0x7f,0x20,0xb9,0x0b,0x00,0xf3,0xa6,0x74,0x18,0xbe,0x9e,0x7d,
0xe8,0x5f,0x00,0x33,0xc0,0xcd,0x16,0x5e,0x1f,0x8f,0x04,0x8f,0x44,0x02,0xcd,
0x19,0x58,0x58,0x58,0xeb,0xe8,0x8b,0x47,0x1a,0x48,0x48,0x8a,0x1e,0x0d,0x7c,
0x32,0xff,0xf7,0xe3,0x03,0x06,0x49,0x7c,0x13,0x16,0x4b,0x7c,0xbb,0x00,0x07,
0xb9,0x03,0x00,0x50,0x52,0x51,0xe8,0x3a,0x00,0x72,0xd8,0xb0,0x01,0xe8,0x54,
0x00,0x59,0x5a,0x58,0x72,0xbb,0x05,0x01,0x00,0x83,0xd2,0x00,0x03,0x1e,0x0b,
0x7c,0xe2,0xe2,0x8a,0x2e,0x15,0x7c,0x8a,0x16,0x24,0x7c,0x8b,0x1e,0x49,0x7c,
0xa1,0x4b,0x7c,0xea,0x00,0x00,0x70,0x00,0xac,0x0a,0xc0,0x74,0x29,0xb4,0x0e,
0xbb,0x07,0x00,0xcd,0x10,0xeb,0xf2,0x3b,0x16,0x18,0x7c,0x73,0x19,0xf7,0x36,
0x18,0x7c,0xfe,0xc2,0x88,0x16,0x4f,0x7c,0x33,0xd2,0xf7,0x36,0x1a,0x7c,0x88,
0x16,0x25,0x7c,0xa3,0x4d,0x7c,0xf8,0xc3,0xf9,0xc3,0xb4,0x02,0x8b,0x16,0x4d,
0x7c,0xb1,0x06,0xd2,0xe6,0x0a,0x36,0x4f,0x7c,0x8b,0xca,0x86,0xe9,0x8a,0x16,
0x24,0x7c,0x8a,0x36,0x25,0x7c,0xcd,0x13,0xc3,0x0d,0x0a,0x4b,0x65,0x69,0x6e,
0x20,0x53,0x79,0x73,0x74,0x65,0x6d,0x20,0x6f,0x64,0x65,0x72,0x20,0x4c,0x61,
0x75,0x66,0x77,0x65,0x72,0x6b,0x73,0x66,0x65,0x68,0x6c,0x65,0x72,0x0d,0x0a,
0x57,0x65,0x63,0x68,0x73,0x65,0x6c,0x6e,0x20,0x75,0x6e,0x64,0x20,0x54,0x61,
0x73,0x74,0x65,0x20,0x64,0x72,0x81,0x63,0x6b,0x65,0x6e,0x0d,0x0a,0x00,0x49,
0x4f,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x59,0x53,0x4d,0x53,0x44,0x4f,0x53,
0x20,0x20,0x20,0x53,0x59,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x55,0xaa};