这是一个长长的故事,这是一篇迟到了20多年的文章,这篇文章涉及到的技术已然是昨日黄花,然而这确可以说是70后一代人的回忆,记录下来回忆一下青春的时光,也给年轻时没有完成完美破解的自己一个交代。
20多年前的江湖,主流软件通常选用磁盘加密,那是一个能人辈出的年代,各种软件层出不穷,但是有一个软件被公认加密强大,其加密磁盘极难复制,这就是KV300+。李峰、蚂蚁、艾琳、新月等均写过复制程序,网上也流传着双星软件工作室King-Copy的大量镜像以及FDC的大量镜像,网友飞雪曾用钟世通老师的SCS软件做出“伤心”版,“乱真”版等工程文件,但经测试,确实没有一个能完美的运行所有版本。机缘巧合,最近网友西点肥牛将其倾力搜集的所有版本给了我,恰好混吃等死的我想试试还能不能提动SOFT-ICE和TR这两把大刀,于是先后淘了数台中古笔记本反复调试,终于成功完美复制出加密磁盘,完美运行所有目前能搜集到的存世版本。
为了更好的理解KV300+的加密磁盘,我们要先把时光调回到1994年,那一年诸多病毒爆发,那一年,王江民的杀毒程序晋升为KV100,意味着可以杀死100种病毒。随即KV200开始商业化并以加密磁盘为载体出售。在那个时候KV200的加密相对还是比较简单的。简单的说就是在软盘中格式化出了5对N值为6的扇区,每一对为一个CRC的扇区加上一个加密数据扇区。启动时两个扇区数据互相校验。其实后期KV300和KV300+延续了这个加密思路。CRC的扇区是不能写的,一旦写成功CRC标志就没有了,当然,KC和SCS能部分复制CRC扇区,但是,这种复制是有代价的,其复制方法是在写完扇区数据后主动复位FDC人为制造CRC,但这个方法会破坏后继扇区,所以要完美复制一定是找出加密算法,写入加密扇区。
下面进入正题,如何复制KV200的加密盘。我们以KV200(K)为例,其他版本完全雷同。
TR载入
下断BPINT 13
快速跟踪到读第一个加密扇区73道的0面4988扇区
AH返回10,这是一个CRC的扇区。
D ES:BX观察一下数据缓冲区
读第二个加密扇区74道0面的4A88扇区
返回00,这是一个“正常”的N=6的扇区
观察数据缓冲区
将4988扇区数据偏移DB0h保存100h与4A88数据比较,数据比对相同进入软件界面。这个加密方式其实非常简单,以后的KV300及KV300+均沿袭了这一思路,只是逐渐复杂。
我们来看看KV200的磁盘数据。
这是一个正常的1.44软盘的磁道,18个512字节的扇区
73道的ID,用到了4988这个扇区73(C)0(H)136(R)6(N)
我们读一下4988这个扇区
扇区填充值F6,这是以N=4格式化的,但是扇区ID中N=6,所以800H后将读出扇区接缝数据及后继扇区数据,后继扇区数据这时可能存在错位。
800H处即是扇区CRC
偏移0DB0处数据
下面我们来看74道4A88扇区数据
是不是和4988偏移0DB0处完全一样?这个时期的加密还是非常耿直的。所以复制磁盘只需要按ID格式化,再将4988数据偏移0DB0写入4A88扇区就完成了复制。其他版本完全一样,共计5对这样的加密磁道。
1996年9月,北京江民科技有限公司成立,KV300面世。KV300更换了加密磁盘,但其延续了KV200的加密思路,只是加了一点点变化。在加密数据中埋了几颗地雷,这几颗雷在不久之后引爆。
KV300(G)版中,江民老师得到成都双星工作室技术加持,获得自编程扇区读取能力,我们以H版为例,在Soft-ice中下断BPIO 3F2,到程序领空可见采用自编程技术读出了磁道ID,并校验首扇区ID:
数据区为读出的扇区ID,代码区比较首扇区CHRN值
1997年, “中国毒岛论坛”开放KV300密匙盘制作工具 MK300V4下载,大量盗版充斥市场,王江民奋力一搏,把新制造出的“主动逻辑锁”埋入KV300L++网上升级版中。大量盗版使用者机器被锁死,软硬盘均无法启动。史称“逻辑锁事件”。最终该起事件(L++事件)以罚款收场,未追究江民公司的司法责任。回头来看,就是对KV300磁盘分析不够彻底,没有找到隐藏的数据。从此以后,KV系列识别盗版后,软件表现不再激烈,而是温和的以病毒演示等方式委婉提醒。如新月所作KV300+最后一个版本Z6KEY,其实数据并不完整,软件同样以貌似正常的方式运行,但ESC后,新月所作的盘将出现病毒演示。
我们以74道为例读出成对的磁道数据并比较可以发现:
Comparing files 74-0-168 and 74-1-137:
0000070B: 58 F6
0000070C: 58 F6
0000080B: 58 D9
0000080C: 58 AE
00000DB9: 58 4E
00000DBA: 58 4E
这就是KV300与KV200的不同之处,在700h 800h DBAh处写入的数据将来会用于校验。80道的数据引发了后来著名的L++事件。毒岛论坛更新MK300V5后便沉寂消失于江湖了。MK系列最终也未能实现完美复制KV300,其中有两个问题:1、70道数据缺失。2、兼容性、只有部分机器能做出复制盘。第一个很好解决,第二个我测试了大量软驱后发先原来是扇区间隙长度引发的,正版磁盘扇区间隙是54h,84个4E,在88E 88F 890处正好是索引标记,KV验证了这三个字节,在不同软驱中由于马达转速等原因,我们需要调整扇区间隙并反复写扇区(写扇区数据会引起错位,反复写可以让错位也正好适配验证需求)以适配这三个字节正好位于该位置。
复制KV300磁盘只需找到正确的扇区间隙,按ID格式化,再将数据偏移0DB0写入验证扇区,再把其他验证字节写完就完成了复制。其他磁道完全一样。
1997年11月,江民再次更换了加密磁盘,正式推出KV300+,成为国内首家可以彻底解除“宏病毒”的杀毒软件,至此KV步入其加密最强的时代,扇区数据不再是明码方式,而是密文方式存储了。我们以Z.8为例来彻底分析一下其加密方法:
正常进入界面,下面让我们迈步从头越,以下均带正版磁盘
TR载入KV300,并下断点BP INT 13
AX=201 CX=0001读引导扇区,继续G下去
断在读1面的5037扇区,在BX+402写入1234,读盘后再判断此数据有无被覆盖。
D BX将数据区显示为数据缓冲区ES:BX
数据读取成功,AH返回10代表此扇区有CRC错
扇区以N=04格式化,长度为800h,BX+802为CRC位置,显然不是4E4E
比较BX+884是否为FFFF,这是验证数据是否错位
BX+898处50h字节拷贝到[733A]备检,这正好是磁盘接缝,这就是典型的无缝锁加密。
Rep movsb传送完毕。
BX+900处开始7D0H数据转存到CS:DI+998F
当前CS保存到[DC84],敲黑板,这个地址非常重要,将会反复用到。
下面开始读加密扇区0面的5061扇区
AH返回0,读扇区数据成功。数据区已经可以看到扇区数据。
BX+814传给DI就是6936,待会要校验。
D BX+814看看确实是6936
8B0和8B2不相等
刚才说了要比较BX+814是不是6939,不是就跳转到5174
5174再次读5061扇区
BX+900处开始7D0H数据转存到CS:DI+A961
开始对数据区解码,第一遍解码63c个word
解码完成
还记得刚刚传送到[733a]的50h字节吗?71e6+898与其比较30h
比较完成,正常情况下30h字节完全一样,BX将会加上30h
[d8df]也会加上30h
[D8DF]从5050h变成5080h,[71dc]仍然为0 。至此80道校验完毕。其实当时跟踪到这里我心里已经隐隐不安,因为没有见到第二段和第三段解码程序(参见72道解码部分),很快,我的预感证实了,进入界面后迅速死机。我在此被困数周后才耐心找到了验证算法。
下面进入72道的验证,这对扇区比较有代表性
72道的4829扇区是一个CRC错的扇区,返回值AH=10h
看看扇区数据保存去了哪里
BX+FA0处开始7D0长word保存到了CS:DI+B933
比较BX+820,这是扇区间隙,当然是4E4E
BX+1F50开始50h字节备检
备检数据传送到[733A]
开始读487c扇区
扇区数据读取成功
BX+FA0处开始7D0长word保存到了CS:DI+C905
第一段解码,解码830个WORD
第一段解码完成
第一次解码后50h字节到[3AAE]
第二段解码,830+7D0=1000,正好是2000h(8192)字节,王老师的算数还是很NICE的
第三遍解码,至此72道解码完成,这次解码完扇区数据就非常明朗了。
这段太长了,一张图放不下
71E6+200h是数据缓冲区,所以这里SI加上的是2150h,其实校验的也是BX+1F50处。至此进界面之前的校验全部完成。我的方法是这样的,我在解码完成的时候将解码完成的数据存盘,然后将我自己格式化出的扇区数据需要校验的部分替换解码数据,再写出解码的逆运算,将解码数据重新加密再回写回加密扇区。这样所有的校验都顺利通过了,这个方法在Z.8之前无往不利,但是Z.8开始,一进界面就死机,原来从Z.8开始,加密再次升级,开始了在查毒过程中的内存校验。因为飞雪用SCS做的盘会出现病毒演示,在跟踪Z.7版时,关于80道的解码,在Z.7中发现了一点端倪。
这就是进入界面后ESC出现的病毒演示
这是F7的演示界面
这是第一段解码
这里意外发现了第三段解码。现在还缺80道第二段解码算法。
Z.8进入界面后死机了!这不禁让我想起费了老鼻子劲保存在CS:DI+998F、CS:DI+A961
CS:DI+B933、CS:DI+C905这里的数据还一个没用呢。还记得刚才敲黑板那个CS吗?BPM dc84,慢慢跟踪。998F+37c传递给了[88e6]然后ADD了1357
A961+37C传递给了[8AAF]
[8AAF]传递给了[8917]
8917开始解码,得来全不费功夫,哈哈,80道第二段解码藏在这里!
开始比较,如果[88E6][8917]不等,就把739c改成nop,把71f7改成JMP,走上死机不归路,我修正好这个字节,再次进入杀毒,TNND又死机了!!!没关系,这次有经验了,继续
还是那个套路,BPM DC84,很快,72道的内存校验浮出水面。这里又耍了一个小花枪,C905挪动了32h,再取DI+954到[D87e]
6829:9989就是取回[DC84]中存的CS
[D87e]传递给[D858]
72道的第四段解码
这段解码比较复杂,逆运算写的我头昏眼花。
观察几个核心变量,[D858]处理完毕
[B933+986] add 7531传递到[D70A]
[D70A]和[D858]不一致,把程序流程改的他MAMA都不认识他!当我搞完这个字节的验证,以为大功告成的时候,再次进入杀毒,稍微多查了一会后,又双叒叕死机了!!!!!!!!!!!!我仿佛感受到江民老师当年设置这一个一个的陷阱时希望后辈能找到这里又希望这个秘密永远存留的心情。收拾好心情再战!
继续我们的套路,BX+12F4给了[D881]
[D881] 传递到了[D8CE]
[D8CE]减去98
[D8CE]求补
[D8CE]循环右移一位
[DA6a]是35h,继续解码
[B933+154]传递给[D878]
[D8CE]传递给[D856]
[D856]与[D878比较],不等的话,把ES那几处改的面目全非,死机、花屏、内存溢出各种各样的死法都让我见识到了。经处理完此字节,补完了最后一块拼图。至此KV加密盘完美制作成功。
复制KV300+磁盘需要找到正确扇区间隙,按ID格式化,将解码完成的时候的扇区数据需要校验的部分替换解码数据,再按逆运算加密后写回加密扇区。
当敲完最后一个代码,编译通过并验证完手头所有版本后,不知不觉已是数月时光,斯人已逝,却仿佛于时空完成了一次对话,再次见识了当年顶级程序员的各种技巧,技术更迭,有些东西注定会消失于我们的生活,但是精巧的设计,完美的思路,精确的实现却会一直闪耀光芒,值得动辄堆砌垃圾代码的后辈学习。
合上笔记本,再见,我的90年代。
后记:软件版本收集计划:希望尽力收集所有版本原始文件。
这是目前我所有的版本,KV300A即是kv300+,如果你有我没有的版本,烦请Email:[email protected],如核实确系缺失的版本,我将赠送当前版本的钥匙盘。
双星工作室,一直执着于研究加解密,我们一直都在。
看雪·2023 KCTF年度赛即将来袭! [防守方]规则发布,征题截止08月25日
最后于 3天前 被yaoyuan[CCG]编辑 ,原因: