【声明:转载此信息在于传递更多信息,其内容表达的观点并不代表本站立场,由这些信息所产生的一切后果本站不负任何责任。如果您对本信息有什么意见,欢迎和本站联系,谢谢!】http://CiDu.Net
看到一位朋友寻找软磁盘的加密资料,这个我也很感兴趣,所以就把以前从书本和网上的资料整理了一下,希望对正在寻找和学习此方面技术的朋友有所帮助^_^
软磁盘反拷贝加密技术
软磁盘反拷贝实质上就是在磁盘中制作一些特殊的标记,这种标记不能被轻易复制,可以由被加密程序识别,由此来达到软件加密的目的。 软磁盘反拷贝技术在多年来的发展过程中不断成熟,涌现出多种方法,但由于拷贝工具也在发展,有些反拷贝技术已不能抵御功能强大的拷贝工具的进攻而逐渐被淘汰。但也有一些经典的加密技术,至尽仍被广泛运用。 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 4、伪扇区法 该方法在一磁道上按扇区的标准格式顺序存放若干扇区头标志,后边不跟数据。当拷贝软件复制这一磁道时,要在其缓冲区内分配足够的内存来存放这些伪扇区的数据值,于是很快就会使缓冲区溢出,从而保护了伪扇区后面真正有用的关键数据。
5、扇区对齐法
绝大多数PC机及其兼容机使用的磁盘都是软分段的。所谓软分段,就是在整张磁盘上只有一个索引孔,通过磁盘的旋转以及磁头的步进来存取信息。磁盘每转一周,磁盘驱动器将自动产生一个索引脉冲信号,以次标记磁道的开始。在索引脉冲信号之后,依次为每个扇区写上扇区识别标志(ID),这些标志能标志磁道的开始。传统的磁盘复制实际上就是一个读写交错的过程,它将读到的磁盘的信息全部写到目标盘的对应磁道上,而全然不顾扇段与扇段是否对期。这里的扇段对齐是指每个磁道的磁偏角相等。因而,如果有了对齐的扇段,便可以通过一些检测手段达到加密的目的。 有了这种想法,如何制作一张扇段对齐的磁盘呢?这可以通过精确磁道位置(即按相同的磁偏角)将相应的扇段写到每个相应的磁道中,来完成扇段的对齐操作。由于传统的复制程序的“非智能性”(即全然不管扇段是否对齐),以及磁盘机的转速存在着误差,因而利用传统的自复制程序复制的磁盘必然导致扇段的磁偏角不再相等,即扇段不再对齐。可以在被加密程序中安排一段代码,用它来读一个磁道上的某个扇段,步入下一个磁道,等待确定的时间,读它找到的下一个扇段的号码来检查扇段是否对齐,从而可以判断是否为原盘,达到加密的目的。可以通过精确控制磁盘驱动器的磁头,将相应的扇区以相对于索引孔的精确偏移写到每个对应的磁道来实现扇区对齐。 扇段对齐技术是一种十分有效的磁盘软加密方法。但是由于要精密依靠磁盘的转动速度来判断扇段对齐,而磁盘的转动速度实际上时时刻刻都不相同,因而这种加密技术实施难度大,也较难得到高可靠性。因此在实际应用中,扇区对齐技术的使用并不多见。
6、未格式化扇区法
众所周知,微机上使用的软盘必须经过格式化处理后才能存储信息,未格式化的磁盘是无法使用的。未格式化扇区的加密原理就是利用这个特点,该方法在制作原盘时对某一磁道的部分扇区不作格式化处理,这部分扇区无法存储信息,一般的拷贝软件无法拷贝,这样,在被加密程序中对某一特定的磁道进行检查,看其是否为正常磁道,即不含未格式化的扇区,若是正常磁道,则必定为复制盘。下面提供一段制作含未格式化扇区原盘的程序:
GSH_BUF DB 27H, 00, 01, 02 ;格式化时所需的标识字段集合 DB 27H, 00, 02, 02 DB 27H, 00, 03, 02 DB 27H, 00, 04, 02 DB 27H, 00, 05, 02 DB 27H, 00, 06, 02 DB 27H, 00, 07, 02 DB 27H, 00, 04, 02 ... ... PUSH ES MOV AH,35H INT 21H MOV AL,07H ADD BX,04H MOV ES:[BX],AL POP ES MOV DL,0 MOV DH,0 MOV CH,27H MOV BX,OFFSET GSH_BUF MOV AH,05 INT 13H PUSH ES MOV AH,35H MOV AL,1EH INT 21H MOV AL,09H MOV BX,04H MOV ES:[BX],AL POP ES ... ...
在被加密程序中可以安排一段专门程序,用来检查磁盘是否为原盘。具体做法是:检查磁盘上的39道上扇区数是否大于7。若大于7,则此盘为拷贝盘;否则为原盘。下面给出检查程序:
MOV AX, SEG MY_BUF MOV ES, AX MOV BX,OFFSET MY_BUF MOV AL,01H MOV DL,00H MOV DH,00H MOV CH,27H MOV CL,08H MOV AH,02H INT 13H CMP AX,0400 JNZ ILLEGL_DISKETTE
应当注意,上面这段程序很容易受到攻击。首先,程序是透明的,攻击者用调试程序可将其轻易抹掉;其次,由于某些高级拷贝工具软件功能强大,能完全复制一张磁盘,从而使这段程序失去作用。因而,这段程序还有待于进一步改进,如在应用程序中增加回写操作、明文变密文等。这里就不再一一说明。
7、螺线型磁道法
磁盘上的磁道是一个个同心圆,当磁头从一个磁道移到另一个磁道进行读写时,必须由FDC控制磁头步进,并等待一段时间,待其稳定后,再进行正常的读写操作。通常,这一等待时间称为安顿时间。 螺线型磁道法就是在磁盘上生成一些螺线型磁道,使磁头步进和读写操作同时进行,从而彻底扰乱一般拷贝软件的复制。 螺线型磁道加密技术是将信息写入非标准格式的磁盘,使得普通的拷贝工具无法复制,因而这种方法是一种十分有效的加密方法,但要成功地读写螺线型磁道,必须掌握步进速率和转动速率之间的精确的比率,这是很难做到的,故这种方法可靠性不是很高。
8、磁道间距不规则变化法
在一般的磁道密度为48TPI的软盘驱动器中,磁道间距为529μm,其读写磁道宽度为330μ没,抹去宽度为150μm。磁道间距通常是相同的,一般的拷贝软件就是直接控制磁道驱动器的步进电机,使读写磁头在磁道间距相等的磁道上来回移动进行拷贝的。磁道间距不规则变化方法就是抓住拷贝软件这一漏洞。利用软件控制步进电机,使磁头在磁盘上产生不规则的磁道间距,使拷贝软件无法正常拷贝。 该方法是一种很有效的加密方法,但其制作涉及到的驱动器硬件结构,所需专门编制软件来控制步进电机的动作,因而在实际中应用不广。
9、宽磁道法
有些磁盘复制机构中配有宽磁头,这种磁头可以在多个磁道上同时写入数据,也可以在相邻的两个磁道及其间隙写入相同内容,从而产生一个相当宽的磁道。在被加密程序读磁盘的代码中,让磁盘驱动器的读写磁头在这个“宽磁道”的两个写有相同数据的磁道之间来回步进,数据流是不会中断的,但如果是复制的磁盘,读/写磁头外侧的消磁磁头的抹除作用会使这个宽磁道在物理上分开,成为两个普通磁道,两个之间的间隙中充满了噪音信号,会导致数据流中断。利用这一点即可判断所读取的磁盘是否是原盘。
10、磁道接缝软指纹技术
所谓磁道接缝,指的就是每个磁道中位于索引孔两边的前置区和后置区。前置区和各个扇区的长度不变,后置区(GAP4)的长度是随机变化的,从200字节到300字节不等,其中包含的信息也是随机的,不同磁道后置区的长度和内容不同,即使是同一软盘的同一磁道,每格式化一次,其后置区的长度和内容就变化一次。后置区的这一特性就保证了其不可复制性,其内容就像人的指纹一样具有唯一性,完全可以用来加密。 如何将不定长度的后置区取出以作为鉴别的依据,是利用磁道接缝软指纹加密技术进行加密的关键。一般来说,对于标准的磁道要读取后置区是比较困难的,除非用端口读磁道命令来实现,而端口读磁道命令又是十分烦琐的。 读取磁道接缝中的“指纹”有一种巧妙的方法,因为GAP4的长度不超过300字节,又紧跟在第9扇区之后,所以只需在格式化时对第9扇区ID标志中的N改为3(磁盘基数表中的N不变),这样格式化出的第9扇区实际数据长度仍为512字节,但在读第9扇区时,将磁盘基数表中的N改为3,就可读出1024字节的内容,其中就有GAP4的信息。 这种方法目前是较强的一种反拷贝方法,可以防止任何拷贝工具的复制,读者可以从此为基础,结合其他方法,设计出更强的反拷贝技术。
11、扇区软指纹法
通常所讲的每扇区512字节指的只是扇区中数据区的长度,但除数据区之外,每个扇区还有其他区域。正常格式化的磁盘,扇区的各个扇区都是可以复制的,但经过特殊格式化的扇区,其某些域上的值就不能被一般的拷贝软件复制,通过检验这些域上数据的正确性就可以判断是否原盘。 一种制作读取这种扇区指纹的方法如下(假定在30道0面1扇区上制作): 制作:对30道0面进行特殊格式化,取第1扇区ID字段的N为4(其余扇区的均为2),格式化时不修改磁盘基数表,使每个扇区的数据仍为512字节。 读取:先修改磁盘技术表中的N值为4,而后读30道0面1扇区,同时也就把第2扇区的内容全部读出。对原盘和复制盘上读出的内容加以比较就可发现其中有些内容不同,因此来判断是否原盘。
12、弱位方法
磁盘是用不同的磁化单位来记录信息的。磁盘机读取磁盘时,将磁盘上不同的介质磁场转换成磁头读/写线圈中强度不同的电流,而后由电流信号判断读取的信息是0还是1,电平幅度高于某阀值电平时为1,远低于阀值电平时为0;磁盘机写数据到磁盘时,则是将电流信号转化为磁介质记录的磁场强度,与读过程相反。 弱位方法就是在写盘时,采用特殊的技术使磁介质记录的磁场强度变小,使磁盘机在读数据时产生的读出电平恰在阀值电平附近,即比1信号弱,又比0信号强(这一位就叫弱位),再加上鉴别电路的稳定性与精确性有限,使之对读出值产生误判有时判0,有时判1。这样的弱位可作为软指纹来防止拷贝。一般的拷贝软件在复制带有弱位的磁盘时,读出的弱位非0即1,写在复制盘上的就是0或1(而不是弱位),在被加密程序中对这些位进行是否弱位的判断就可得知该盘是否是原盘。判断方法很简单,只需对这些位多读几次,看每次读出的结果是否一致,若每次相同,则是非弱位,否则是弱位。
13、错误CRC法
每个扇区的标识区和数据区的后面都有两个字节的循环冗余码校验码CRC。CRC是FDC在写完最后一个数据字节时自动产生并写入的,用来校验扇区记录信息是否出错。正常情况下,FDC产生的CRC都是绝对正确的,除非软盘有物理性的损坏。如果人为地在某一个扇区产生错误的CRC,那么一般拷贝软件按通常的拷贝方法所制出的复制盘中肯定不会无法复制的。于是在被加密程序中判断某一特定的扇区是否有错误的CRC就可以知道该盘是否原盘。 有一个简单的方法可用来生成错误的CRC,即当FDC正在写某一扇区时,人为地打断FDC的写入过程(如复位FDC),这个时刻可由修改后的时钟中断程序不断检测FDC的主状态寄存器得到。这样就会打乱正常数据的写入,从而在该扇区得到一错误的CRC码。检测这一特定扇区的CRC是否正确的方法也很简单,用INT 13H的1号读扇区功能读该扇区,而后判断AH的值,若是10H,则CRC错,否则CRC正确。
14、磁道噪音法
磁盘上的信息通常采用FM或MFM格式进行编码,这种编码实际上就是在0,1序列中按一定格式插入一定的同步脉冲,从而形成一个新的脉冲序列,所插入的同步脉冲对所存的信息本身来说并无什么重要意义,只是为了读出时提取同步信息。同步脉冲改善了全0或全1脉冲的频率特性,使读出信息时不易出错。磁道噪声法就是采用一种特殊的手段在磁盘上写入一种特殊的编码(即噪声),使系统在对其读写时产生同步混乱,使读出的信息出错,阻止拷贝软件的复制。
15、FDC移花接木法
FDC是CPU与软盘驱动器之间的接口,种类很多,采用的记录方式和功能都不完全相同,而且用一种FDC在磁盘上制作的标记,可用另一种FDC读出,但却不能被复制,这就给加密者一个可乘之机,可以利用两种不同的FDC在同一原盘上制作两个不同的标记,这两个标记可用其中任一种读出并检测,但却不能只用一种FDC来制作,于是可防止拷贝。
16、扇区交错保密法
在一个磁道内,不将扇区按$0—$F编号存放,而是按任意顺序存放,这叫做扇区交错法,采用此方法,提高了DOS向磁盘存取文件时的速度。 APPLE的DOS3.3操作系统中,扇区交错是由软件来完成的,用DOS3.3格式化的磁盘上,16个扇区完全按$0—$F顺序排列,并无交错,但在内存$BFB8—$BFC7处存放着另一个转换表,此表将磁盘上的实际扇区编号一一对应到另一组假的扇区编号来供给DOS3.3使用,见下表:
真实编号 0 1 2 3 4 5 6 7 8 9 A B C D E F 对应编号 0 D B 9 7 5 3 1 E C A 8 6 4 2 F
假设修改了$BFB8—$BFC7转换表后,再用修改过的DOS3.3来INIT新盘,可以想象,如果在这个盘上存入程序,用标准的DOS3.3将无法正常存取这些程序,因为它们之间扇区转换表不相同。 “扇区交错”程序保密法可以利用上述办法来制作出能保密程序的保密磁盘。 制作保密磁盘对硬件的要求是:APPLE机的内存为48K,6号槽口接上磁盘机,磁盘机的编号为1。制作方法如下: (1)制作一个不同于DOS3.3的扇区转换表。将16进制数字0至F间除去0剩余的15个数随意添入下表横线上(尽量不与标准DOS3.3的转换表一致): 00__________________ 假设你添入的是: 00 07 0D 04 05 09 0E 01 06 0A 02 0C 08 0F 03 在纸上记下这组数字,然后根据APPLE机的显示ASCⅡ码表,把每个数字加上C0后所得的值转化成字母,本例应为: @ G M K D E I N A F J B L H O C 这就是以后使用保密盘时所必须给出的通行口令。有了这个口令,才能往保密盘上存入或取出程序。记住这个密码。 (2)将标准DOS3.3引入内存,用CALL-151进入监控后,把刚才记在纸上的16个数输入从$BFB8开始的单元中。
*BFB8: 00 07 0D 0B 04 05 09 0E 01 06 0A 02 0C 08 0F 03 *(敲入CTRL—C) I NEW ] 再将一个空盘插入接在6号槽口的1号驱动器中。 ]I NI T HELLO ]CALL—151 *6000: 01 60 01 00 00 11 60 00 40 00 00 01 00 00 60 01 00 01 EF D8 *7000: A0 00 A9 60 4C D9 03 N 7 0 0 0 G *404E: <4 04 D 4 05 B M *404E8: A2 01 20 1B FD 29 0F 9D 4C 08 E8 E0 11 D0 F3 A5 2B 4A 60 *4007: 20 E8 08 N 4 0 4 A :4C 69 BA N 60 0 C :02 N 7 0 0 0 G *600C: 01 N 60 05: 09 N 7 0 0 0 G 40B9 <40B8 40 C 6 M N 600C: 02 N 7000G *600C: 01 N 6005: 04 N 7 0 0 0 G *4069: 84 FF A0 10 B9 4C 08 99 B7 88 D0 F7 A4 FF 6C FD 6C FD 08 N 60 0C: 02 N 7 0 0 0 G 至此,加密盘已制作好。
上面所说的是软磁盘的一些加密资料,关于解密方面的资料 软蛀 和 俞煌男 的解密教程中有很多,我就不累述了,希望朋友们有好的经验或资料时不惜赐教,我对这个也很感兴趣(正如 看雪 所说:“在DOS时代之前就有些比较好的软件保护技术,而在DOS中使用得最多的恐怕要算软盘指纹防拷贝技术了。由于DOS操作系统的脆弱性,在其中运行的普通应用程序几乎可以访问系统中的任何资源,如直接访问任何物理内存、直接读写任何磁盘扇区、直接读写任何I/O端口等,这给软件保护者提供了极大的自由度,使其可以设计出一些至今仍为人称道的保护技术;”),欢迎来信交流,谢谢。
(出处:嬴政天下整理收藏)
声明:以上信息资料大都是网上搜集而来,版权归作者,如有版权问题请留言告知我将马上改正。 文中所提到的各种观点只是原文观点,各种说法未经一一确认。并不代表本站认可此观点!!
|