Ⅰ 怎樣編寫病毒
1.1病毒程序VIRUS.C
這是一個用C語言寫的病毒程序,當激發病毒程序時顯示時間,然後返回。病毒程序VIRUS.C可將病毒傳染給一個C語言程序。當被病毒感染的程序經編譯、連接和執行後,又可以將病毒部分傳染給其他的C語言源程序。每執行一次帶有病毒的C語言程序,就向C語言源程序傳播一次病毒。此程序的設計思路如下:
當含有病毒部分的程序被執行時,首先進入病毒程序。它在磁碟上找擴展名為C的匹配文件,如果找到,查找是否有被傳染過的標志「INFECTED」。如果有此標志,繼續找其它的C文件,直至全部檢查一遍。若沒有這個標志,則
(1)在未被感染的C程序頭部加入「INFECTED」已被傳染標志。
(2)讀取病毒文件的頭文件,將其插入到即將被感染的文件頭部。如果發現有重復則不插入。
(3)在主程序中插入「VIRUSES();」調用VIRUSES函數。尋找printf、for、while、break語句,如果找到就在之前插入。
(4)在文件尾部插入VIRUSES_SUB子程序。
(5)在插入到將感染文件裡面的VIRUSES_SUB子程序裡面,必須把文件名改為當前自身的文件名,否則被傳染後的文件經過編譯、連接和運行後不能再繼續傳染。
(6)最後插入VIRUSES子程序。這個子程序裡面調用了VIRUSES_SUB,執行到這里返回執行結果信息。
其中用到4個出錯的返回值,分別是:
1:用戶文件太大,不傳染;
2:帶病毒文件打不開,不傳染;
3:帶病毒文件讀取不成功,不傳染;
4:查找第一個匹配文件不成功。
如果返回值是0代表文件傳染成功。
具體實現過程如下:
其中用到的函數和結構體用法參考3.3節。
首先導入病毒子程序要用到的三個庫文件,分別是dir.h,stido.h,dos.h.在主函數裡面只調用VIRUSES函數。緊跟定義VIRUSES函數裡面要調用的VIURS_SUB函數。裡面定義了若干個變數。ffblk用來保存查找到的匹配文件的信息,用到裡面的ff_name變數來保存匹配文件名。
然後定義保存未感染的文件和病毒文件的文件型指針變數,分別用是*virus_r和*virus_v.讀取文件的緩沖區,放到二維數組a[500][80]裡面臨時存放。因為此程序對大於500行的C文件不進行傳染,所以完全可以放到裡面。首先用getdate函數獲取系統當前日期並輸出。接著用findfirst函數查找擴展名為C的文件,將其信息保存到ffblk裡面。用fgets函數讀文件的第一行,長度是80-1個字元。然後用strstr函數檢測病毒的標志,看文件是否有INFECT這個標志。
如果有,表示文件已經被傳染,關閉文件,不進行傳染。當含有病毒部分的程序被執行時,首先進入病毒程序。它在磁碟上查找*.C的匹配文件,一旦找到,查找「已被傳染過」的標志INFECTED。若有此標志,繼續找其它*.C文件,直至全部檢查一遍。
如果沒有這個標志,將文件全部讀入a[500][80],如果發現文件超過500行,不傳染,返回。將文件指針指向文件頭,打開帶病毒的文件。如果打不開,返回。
然後讀取帶病毒文件的前4行,也就是病毒子程序要用到的頭文件,寫入將被傳染的文件。若不能讀取帶病毒文件,返回。用n_line變數控制行數,把將被傳染文件的源程序寫回原文件。其中要進行處理不寫入病毒文件已有的包含語句,也就是說使#Include語句不重復。
這點是這樣實現的:定義一個字元數組charinclude_h[]=;strstr函數查看將被傳染文件的頭文件是否和*include_h[]相同,如果相同,......