十六、2008年04月10日
作者:青青子衿
email:[email protected]
1、CPolymorph 類
//推測該類的目標是實現bot對正常可執行程序的感染
class CPolymorph
{
public:
CPolymorph();
CPolymorph(const char *szFile);
~CPolymorph();
bool MapFile(const char *szFile, char **szBuffer);
void UnmapFile(char **szBuffer);
bool DoPolymorph(const char *szFile);
};
2、CPolymorph() 構造函數
//////////////////////////////////////////////////////
//
//函數功能:構造函數
//參數: 無
//
//////////////////////////////////////////////////////
CPolymorph::CPolymorph()
{
DoPolymorph("c://winnt//system32//notepad.exe");
}
3、CPolymorph::CPolymorph(const char *szFile) 構造函數
/////////////////////////////////////////////////////
//
//函數功能:構造函數
//參數: const char *szFile 文件路徑
//
//////////////////////////////////////////////////////
CPolymorph::CPolymorph(const char *szFile)
{
DoPolymorph(szFile);
}
4、CPolymorph::~CPolymorph() 析構函數,無任何操作
/////////////////////////////////////////////////////
//
//函數功能:析構函數
//
/////////////////////////////////////////////////////
CPolymorph::~CPolymorph()
{
}
5、:MapFile(const char *szFile, char **szBuffer) 函數
//////////////////////////////////////////////////////////////////
//
//函數功能:根據文件的路徑,讀取文件的內容
//參數: const char *szFile 文件的路徑
// char **szBuffer 保存文件內容的指針,注意該變量的類型
//返回值: 如果調用成功返回true,否則返回false
//
//////////////////////////////////////////////////////////////////
bool CPolymorph::MapFile(const char *szFile, char **szBuffer)
{
FILE *fp=fopen(szFile, "rb");
if(!fp)
{
return false;
}
//獲得文件長度
fseek(fp, 0, SEEK_END);
int iFileSize=(int)ftell(fp);
fseek(fp, 0, SEEK_SET);
*szBuffer=(char*)malloc(iFileSize); //根據文件的長度,申請相應長度的空間
if(!*szBuffer)
{
fclose(fp); return false;
}
if(fread(*szBuffer, sizeof(char), iFileSize, fp)<iFileSize) //讀取文件內容,如果實際讀取長度小於真實長度,函數返回
{
fclose(fp);
return false;
}
fclose(fp);
return true;
}
6、:UnmapFile(char **szBuffer) 函數
///////////////////////////////////////////////////////////////////////////
//
//函數功能:釋放保存文件內容的空間
//參數: char **szBuffer 保存文件內容buffer的指針變量
//
//
///////////////////////////////////////////////////////////////////////////////
void CPolymorph::UnmapFile(char **szBuffer)
{
free(*szBuffer);
}
7、DoPolymorph(const char *szFile) 函數
/////////////////////////////////////////////////////////////
//
//函數功能:從代碼上推測,應該是實現Bot感染正常文件的功能,
// 但並沒有完全實現,只是對目標可執行文件的PE結構
// 進行了解析。
//參數: const char *szFile 被感染的目標可執行程序的路徑
//返回值: 調用正確返回true,否則返回false
//
////////////////////////////////////////////////////////////
bool CPolymorph::DoPolymorph(const char *szFile)
{
char *szBuffer;
if(!MapFile(szFile, &szBuffer)) //打開文件
{
return false;
}
//對可執行文件中的PE結構進行解析
IMAGE_DOS_HEADER *iDosHeader=(IMAGE_DOS_HEADER*)szBuffer;
if(iDosHeader->e_magic!=IMAGE_DOS_SIGNATURE) //判斷是否有MZ標識,判斷是否是可執行文件
{
UnmapFile(&szBuffer); return false;
}
char *pTemp=(char*)iDosHeader+iDosHeader->e_lfanew;
DWORD *dwSignature=(DWORD*)pTemp;
pTemp+=sizeof(DWORD);
IMAGE_FILE_HEADER *iFileHead=(IMAGE_FILE_HEADER*)pTemp;
pTemp+=sizeof(IMAGE_FILE_HEADER);
IMAGE_OPTIONAL_HEADER *iOptHead=(IMAGE_OPTIONAL_HEADER*)pTemp;
pTemp+=sizeof(IMAGE_OPTIONAL_HEADER);
IMAGE_SECTION_HEADER *iSectHead=(IMAGE_SECTION_HEADER*)pTemp;
if(*dwSignature!=IMAGE_NT_SIGNATURE) //判斷是否有PE標識符
{
UnmapFile(&szBuffer);
return false;
}
int iSection;
IMAGE_SECTION_HEADER *iSectPtr; //對PE頭的各段的信息進行解析
for(iSection=0, iSectPtr=iSectHead; iSection<iFileHead->NumberOfSections; iSection++, iSectPtr++)
{
if(iSectPtr->Characteristics&IMAGE_SCN_CNT_CODE) //尋找代碼段
{
// Code section :P
char *szBuf=(char*)malloc(iSectPtr->SizeOfRawData);
memcpy(szBuf, (char*)szBuffer+iSectPtr->PointerToRawData, iSectPtr->SizeOfRawData);
MessageBox(NULL, "Bla", "Debug", MB_OK);//從這裏開始,真正的功能似乎還沒有實現
free(szBuf);
}
}
UnmapFile(&szBuffer); return true;
}