这是杀木马蠕虫的方法,给你一个杀文件型病毒的例子
N年前写的垃圾
#include <stdio.h>
#include <windows.h>
void usage(void);
int EnumDisk(void);
int EnumAllFile(char *lpDir);
int AniVirus(char *lpFileName);
int main(void)
{
usage();
printf("Start scan disk ....\n");
EnumDisk();
return 1;
}
int EnumDisk(void)
{
int i;
char AllDisk[3][3]={"c:","d:","e:"};
for(i=0;i<3;i++)
{
EnumAllFile(AllDisk);
}
return 1;
}
int EnumAllFile(char *lpDir)
{
WIN32_FIND_DATA Finddata;
HANDLE hFindFile=INVALID_HANDLE_VALUE;
char lpBuf[MAX_PATH],lpTmp[MAX_PATH];
char lpFileName[MAX_PATH];
int IntSize=0;
ZeroMemory(lpBuf,MAX_PATH);
ZeroMemory(lpTmp,MAX_PATH);
ZeroMemory(lpFileName,MAX_PATH);
strcpy(lpBuf,lpDir);
strcat(lpBuf,"\\*.*");
hFindFile = FindFirstFile(lpBuf,&Finddata);
if(hFindFile == INVALID_HANDLE_VALUE)
{
printf("FindFirstFile Error,Code:%d\n",GetLastError());
return 0;
}
while(FindNextFile(hFindFile,&Finddata)!=0)
{
if(Finddata.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
{
if(strncmp(Finddata.cFileName,"..",2)==0)
{
continue;
}
strcpy(lpTmp,lpDir);
strcat(lpTmp,"\\");
strcat(lpTmp,Finddata.cFileName);
EnumAllFile(lpTmp);
}
IntSize = strlen(Finddata.cFileName);
if(strcmp(Finddata.cFileName+IntSize-4,".exe")==0||strcmp(Finddata.cFileName+IntSize-4,".EXE")==0)
{
printf("Find a Exe File FileName:%s\n",Finddata.cFileName);
strcpy(lpFileName,lpDir);
strcat(lpFileName,"\\");
strcat(lpFileName,Finddata.cFileName);
AniVirus(lpFileName);
}
}
return 1;
}
void usage(void)
{
printf("Kill my virus,I don't like it\nready go!\n");
return;
}
int AniVirus(char *lpFileName)
{
HANDLE hFile = INVALID_HANDLE_VALUE;
HANDLE hMap = NULL;
LPVOID pFile = NULL;
PIMAGE_DOS_HEADER dosheader;
PIMAGE_NT_HEADERS peheader;
PIMAGE_SECTION_HEADER sectionheader;
char *SectionName = NULL;
DWORD *VirusEntry = NULL;
BYTE *btTmp = NULL;
DWORD dwCount = 0;
DWORD dwEntry = 0;
int ECode;
hFile = CreateFile(lpFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0);
if(hFile==INVALID_HANDLE_VALUE)
{
printf("OpenFile Error,Code:%d\n",GetLastError());
return 0;
}
hMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL);
if(hMap == NULL)
{
printf("CreateFileMapping Error,Code:%d\n",GetLastError());
CloseHandle(hFile);
return 0;
}
pFile = MapViewOfFile(hMap,FILE_MAP_READ|FILE_MAP_WRITE,NULL,NULL,NULL);
if(pFile == NULL)
{
printf("MapViewOfFile Error,Code:%d\n",GetLastError());
CloseHandle(hMap);
CloseHandle(hFile);
return 0;
}
dosheader = (PIMAGE_DOS_HEADER)pFile;
__try
{
if(IMAGE_DOS_SIGNATURE != dosheader->e_magic)
{
UnmapViewOfFile(pFile);
CloseHandle(hMap);
__leave;
}
peheader = PIMAGE_NT_HEADERS((DWORD)pFile+dosheader->e_lfanew);
__try
{
if(IMAGE_NT_SIGNATURE != peheader->Signature)
{
UnmapViewOfFile(pFile);
CloseHandle(hMap);
__leave;
}
sectionheader = (PIMAGE_SECTION_HEADER)((DWORD)peheader + ((peheader->FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER)) + sizeof(IMAGE_NT_HEADERS));
SectionName = (char *)&(sectionheader->Name);
if(strncmp(SectionName,".chi",4)!=0)
{
UnmapViewOfFile(pFile);
CloseHandle(hMap);
__leave;
}
printf("发现病毒,准备清除病毒\n");
VirusEntry = (DWORD *)((DWORD)pFile + sectionheader->PointerToRawData);
for(dwCount = 0;dwCount<sectionheader->SizeOfRawData/4;dwCount++,VirusEntry++)
{
if(*VirusEntry==0x00401375)
{
//printf("找到源程序入口代码特征\n");
VirusEntry = VirusEntry + 6;
btTmp = (BYTE *)VirusEntry;
btTmp++;
VirusEntry = (DWORD *)btTmp;
dwEntry = *VirusEntry - peheader->OptionalHeader.ImageBase;
//printf("Entry:0x%x\n",dwEntry);
peheader->OptionalHeader.AddressOfEntryPoint = dwEntry;
peheader->FileHeader.NumberOfSections--;
peheader->OptionalHeader.SizeOfImage = peheader->OptionalHeader.SizeOfImage - (sectionheader->Misc.VirtualSize/peheader->OptionalHeader.SectionAlignment+1) * peheader->OptionalHeader.SectionAlignment;
ZeroMemory(sectionheader->Name,8);
ECode = SetFilePointer(hFile,sectionheader->PointerToRawData,0,FILE_BEGIN);
UnmapViewOfFile(pFile);
CloseHandle(hMap);
ECode = SetEndOfFile(hFile);
if(ECode!=0)
{
printf("病毒清除成功\n");
}
else
{
printf("病毒清除失败,但是病毒已被屏蔽\n");
}
__leave;
}
}
}
__except(1)
{
__leave;
}
}
__finally
{
CloseHandle(hFile);
}
return 0;
}