• 标 题:KV300 (4千字)
  • 作 者:stuman
  • 时 间:2003-2-25 16:07:15
  • 链 接:http://bbs.pediy.com

下面是我翻出来的东西,没什么水平,不过还是有趣。
第一篇是文物级的文章了:KV300的破解。当时破解kv300用了两种方法,一种是写“unkv”程序用来做key盘,步骤繁琐,没写文章。另一种是直接破程序,写出了步骤,当时放在自己主页上,后来主页没了,也就放一边了。现在一读真是晕倒,写这么详细……

KV300解密一法探讨
KV300分两个版本:KV300+和KV300++版本,加密方式不同,这里以KV300++版为例。目前国产杀毒软件中,除了KILL认证版、瑞星,KV300算比较大众化一点。KV300的加密比较狠,做一张完善的KEY盘比较困难,用双星磁盘分析工具扫描一下正版磁盘就知道最后约有10多个磁道是非正常磁道,即加密磁道,上面记录的检测数据(密钥)要复制出来也比较困难。但解密某一个升级版本很容易,只是解密限于一个版本。许多流传的解密版本就这样做的。我用目前最新的Z12版进行解密。解密版您可以在资源共享里下载(使用时需要在A驱里插入一张软磁盘。运行时可能提示软盘有引导区病毒,不必理睬,因为不是KEY盘),这里特别声明:您自由下载解密版,我不收取任何费用,没有商业性的赢利性质,所以不存在盗版问题。官司我可吃不起哦!我只是纯技术性的探讨。如果您觉得有问题,请给我留言或是写信。以下是解密过程:

运行softice 3.23,载入Windows 98,然后开一个DOS窗口。按Ctril-D切入softice,键入如下指令:

wl
wr
wd
bpint 13

然后按Ctrl-D切换到DOS窗口,运行KV300:

D:\kv300\>kv300

当KV300调用中断13H时被softice截住并自动切换到softice调试界面。查看被截住的这段KV300代码,只是读引导区、检查引导区有无病毒。按Ctrl-↓往下找,发现这段代码:

1EE8:C1C0 CALL 2E6A:52D2
1EE8:C1C5 JMP BYTE PTR [D76C],70
1EE8:C1CA JA C1DC
1EE8:C1CC CMP BYTE PTR [D76C],30
1EE8:C1D1 JB C1DC
1EE8:C1D3 MOV AX,33FF
1EE8:C1D6 CALL 2E6A:2563
1EE8:C1DB RET
1EE8:C1DC MOV AX,F000
……

它先调2E6A:52D2子程序,然后检查[D76C]处的一个字节是否在30H与70H之间,否则跳转1EE8:C1DC执行。经过简单的试验就知道2E6A:2563是正常的杀毒界面入口,而1EE8:C1DC则是进一步检查加密磁道的代码入口(分析这段代码有助于制作KEY盘,不过比较烦琐,它要读大约6个左右加密磁道上的密钥来验证是否为原盘,甚至有一段代码绕过了BIOS调用而直接用原始的IN、OUT指令来读盘,我们寂然不做KEY盘,完全可以不理睬这段代码)。关键的跳转分支已经找到了,现在需要修改程序屏蔽读比较密钥一节。最简单的改法是将1EE8:C1D1的JB C1DC改为JB C1D3,直接跳入正常的杀毒入口代码。好,来个code on显示机器码:

code on
……
1EE8:C1CC 803E6CD730 CMP BYTE PTR [D76C],30
1EE8:C1D1 7209 JB C1DC
……

输入汇编指令JB C1D3,看机器码是什么:

A C1D1
JB C1D3

得到:

1EE8:C1D1 7200 JB C1D3

这样,将机器码7209改为7200即可。那是否立马取KV300.EXE中找代码“803E6CD7307209”呢?我找过,找不到的!因为还有暗桩,这段代码本身被加了密存放的,运行时这段代码在内存中被解密。我们再用逆推法找解密这段代码的程序段。继续在softice中下指令:

bc *
bpmb 1EE8:C1D1
bd *

然后Ctrl-D退到DOS窗口后再Ctrl-D切换到softice,将断点许可:be *,而后切换到DOS窗口中运行KV300。

D:\kv300\>kv300

运行中会被softice截住几次,每次截住时用 d ES:EDI 指令查看数据区,如找不到JB C1DC的机器码(“7209”)就继续,直到找到为止。大约截住3次后,可以看到这段代码:

……
6803:0069
SHR BP,1
DEC DX
JNZ 73
LODSW
MOV DL,10
JAE 78
MOVSB
JMP 69
6803:0078
……

现在用 d ES:EDI 指令可以看到“7209”了。不过看这段代码只是数据转移,没有实质性的解密工作。用 d DS:ESI 显示“7209”机器码位于地址DS:5098,softice中下指令:

bc *
bpmb DS:5098
exit

在DOS窗口中再次运行KV300。这次在6803:0050处:

……
MOV SI,AX
MOV DI,AX
REPZ MOVSW
……

还是只是转移数据。用d DS:ESI 显示出“7209”地址位于1700:2558处。下指令:

bc *
bpmb 1700:2558
exit

在DOS窗口下再次运行KV300,这次softice在3867:3136处截住这段代码:

LODSW
XOR AX,BX
ADD AX,DX
SUB DX,5B
STOSW
LOOP 3136

呵呵,一段很典型的解码程序啊。注意到解码时DS=ES,ESI=EDI,所以数据在原位地址变换。截住在LODSW代码之后,此时AX中已装入内存中的一个字,即将要解码的字。AX=930A,按F8单步执行,具体数值是这样的:

XOR AX,434
ADD AS,7034

此时AX=0972,倒过来不就是我们要找的“7209”吗?显然,解码公式是:(930A 异或 0434) + 7234 = 0972。我们要得到“0072”的结果,可设未解码前的数为X,则有:( X 异或 0434) + 7234 = 0072,故 X = (0072 - 7234) 异或 0434,计算(Windows提供的计算器派上用场)得到X=8A0A,即将原码的“0A93”改为“0A8A”就大功告成,实际上只改动一个字节。用d DS:ESI命令显示内存中未解码前的数据:“0A931F8644BA”,记下来。现在可以改KV300.EXE文件了!我没有uedit,没关系,用DOS的pctools也行,pctools不认识C:盘的32位FAT,将它拷贝到软磁盘,同时将KV300.EXE也拷贝到软磁盘,软磁盘是16位FAT,所以pctools可以运行,用find功能找出“0A931F8644BA”串的位置,将“93”改为“8A”存盘。运行修改后的KV300.EXE,只要在A:驱里任意插一张软磁盘,它都当是KEY盘而顺利进入杀毒界面。