软磁盘反拷贝加密技术 [1] (4千字)
看到一位朋友寻找软磁盘的加密资料,这个我也很感兴趣,所以就把以前从书本和网上的资料整理了一下,希望对正在寻找和学习此方面技术的朋友有所帮助^_^软磁盘反拷贝加密技术
软磁盘反拷贝实质上就是在磁盘中制作一些特殊的标记,这种标记不能被轻易复制,可以由被加密程序识别,由此来达到软件加密的目的。
软磁盘反拷贝技术在多年来的发展过程中不断成熟,涌现出多种方法,但由于拷贝工具也在发展,有些反拷贝技术已不能抵御功能强大的拷贝工具的进攻而逐渐被淘汰。但也有一些经典的加密技术,至尽仍被广泛运用。
1、超级扇区法
这种方法利用专用设备在软盘上写上一些超长(往往接近一个磁道)扇区,正常情况下这种长扇区磁盘控制器无法在磁盘上写出,但可以在程序的控制下在其中读出信息。将密钥存放在正常情况下扇区间隙的位置处,这样,一般的复制程序就无法将其复制,而在被加密程序中却可以将间隙处的密钥作为超级扇区的一部分读出,判断读出信息的正确性就可以确定该盘是否是原盘,从而获得加密效果。
设超级扇区字节长度为4096,所在磁道为0面0道。读出的信息放在DS段偏移1000H开始的区域中。
C:\DEBUG
-E 0:0525 ;修改磁盘技术表
0000:0525 02.05 09.01
-A 100
1180:0100 MOV AX,0201 ;读一个扇区
1180:0103 MOV BX,1000 ;读出数据缓冲区指针
1180:0106 MOV CX,0 ;0道0扇
1180:0109 MOV DX,0 ;A道0扇
1180:010C INT 13
1180:010E INT 3
1180:010F
-G=100
2、异常ID法
扇区中的ID字段由柱面号(C)、磁头号(H)、扇区号(R)和扇区字节长度(N)四个参数组成。对于5.25in双面低密度软盘来讲,这四个参数的正常取值的范围是:C(0~39),H(0,1),R(1~8或9),N=2。异常ID的扇区是不能正确读写的,而ID在格式化写入时不作正确性检查,于是就可以用这一点来人为地制造异常ID扇区,阻止一般拷贝软件的复制。
有很多种方法来产生异常ID扇区,如:使扇区长度不等于512字节(即使N≠2);将扇区号取大雨9的值;打乱磁道上扇区的排列顺序;使磁头的逻辑号与物理号不相符,等等。
对于打乱磁道上扇区的排列顺序的方法可以采取以下步骤来实现,这段程序在A盘第20道0面进行格式话时,把9个扇区的顺序完全颠倒了。
C:\DEBUG
-E 1000
2884:1000 00.14 00.00 00.09 00.02 00.14 00.00 00.08 00.02
2884:1008 00.14 00.00 00.07 00.02 00.14 00.00 00.06 00.02
2884:1010 00.14 00.00 00.05 00.02 00.14 00.00 00.04 00.02
2884:1018 00.14 00.00 00.03 00.02 00.14 00.00 00.02 00.02
2884:1020 00.14 00.00 00.01 00.02
-A 100 格式化A盘0面20道
2884:0100 MOV AX, 0509
2884:0103 MOV BX, 1000
2884:0106 MOV CX, 1401
2884:0109 MOV DX, 0
2884:010C INT 13
2884:010E INT 3
2884:010F
-G=100
3、额外扇区法
一个扇区由标识区(长度为22字节,对5.25in双面低密软盘而言)和数据区(长度为512+16+2=530字节)以及两个间隙(GAP2和GAP3,长度分别为22和84字节)组成,其实际长度为22+22+530+84=658字节,9个扇区在加上前置区和后置区的长度,一个磁道的容量大约有6224字节,而其中的GAP3和后置区的长度都是可改变的,尤其是GAP的调整可以在格式化时通过修改磁盘基数表位移07处的值来设定,所以完全可以通过减小GAP3 长度来减少一个扇区所占的字节数,从而在一个磁道内多装入一个扇区。例如取GAP3的长度为10(不能小于5,否则有可能出现磁盘故障)时,每扇区长度为625-(84-10)=584,10×584+32=5872,所以一个磁道内足以装下10个扇区。
如此格式化出的第10个扇区,常规拷贝软件无法访问,如果把密钥放在这一额外扇区中,就可以防止磁盘被复制。
C:\DEBUG
-E 0:526 ;修改磁道基数表
0000:0526 09.0A 2A ;每道扇区数改为10~~~~~~~~~~~~~~~~
0000:0528 FF 54.0A ;GAP3长度改为10
-E 10000 ;格式化所需的扇区ID参数
5068:1000 00.14 00.00 00.01 00.02 00.14 00.00 00.02 00.02
5068:1008 00.14 00.00 00.03 00.02 00.14 00.00 00.04 00.02
5068:1010 00.14 00.00 00.05 00.02 00.14 00.00 00.06 00.02
5068:1018 00.14 00.00 00.07 00.02 00.14 00.00 00.08 00.02
5068:1020 00.14 00.00 00.09 00.02 00.14 00.00 00.0A 00.02
-A 100: ;格式化A盘0面20道
5068:0100 MOV AX,050A
5068:0103 MOV BX,1000
5068:0106 MOV CX,1401
5068:0109 MOV DX,0
5068:010C INT 13
5068:010E INT 3
5068:010F
-G 100
格式化额外扇区
C:\DEBUG
-E 0:526 ;修改磁道基数表
0000:0526 09.0A 2A ;每道扇区数改为10
0000:0528 FF 54.0A ;GAP3长度改为10
-A 100 ;读A盘0面20道第10扇区
5068:0100 MOV AX,0201
5068:0103 MOV BX,1000
5068:0106 MOV CX,140A
5068:0109 MOV DX,0
5068:010C INT 13
5068:010E INT 3
5068:010F
-G=100
