AgoBot 殭屍網絡研究筆記(十六)

十六、2008年04月10日

作者:青青子衿

email:[email protected]

1CPolymorph 

//推測該類的目標是實現bot對正常可執行程序的感染

class CPolymorph

{

public:

CPolymorph();

CPolymorph(const char *szFile);

~CPolymorph();

bool MapFile(const char *szFilechar **szBuffer);

void UnmapFile(char **szBuffer);

bool DoPolymorph(const char *szFile);

};

2CPolymorph() 構造函數

//////////////////////////////////////////////////////

//

//函數功能:構造函數

//參數:

//

//////////////////////////////////////////////////////

CPolymorph::CPolymorph() 

DoPolymorph("c://winnt//system32//notepad.exe"); 

}

3CPolymorph::CPolymorph(const char *szFile構造函數

/////////////////////////////////////////////////////

//

//函數功能:構造函數

//參數: const char *szFile 文件路徑

//

//////////////////////////////////////////////////////

CPolymorph::CPolymorph(const char *szFile

DoPolymorph(szFile); 

}

4CPolymorph::~CPolymorph()  析構函數,無任何操作

/////////////////////////////////////////////////////

//

//函數功能:析構函數

//

/////////////////////////////////////////////////////

CPolymorph::~CPolymorph() 

}

5:MapFile(const char *szFilechar **szBuffer) 函數

//////////////////////////////////////////////////////////////////

//

//函數功能:根據文件的路徑,讀取文件的內容

//參數: const char *szFile 文件的路徑

// char **szBuffer 保存文件內容的指針,注意該變量的類型

//返回值: 如果調用成功返回true,否則返回false

//

//////////////////////////////////////////////////////////////////

bool CPolymorph::MapFile(const char *szFilechar **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(*szBuffersizeof(char), iFileSizefp)<iFileSize)  //讀取文件內容,如果實際讀取長度小於真實長度,函數返回

{

fclose(fp); 

return false;

}

fclose(fp);

return true

}

6:UnmapFile(char **szBuffer 函數

///////////////////////////////////////////////////////////////////////////

//

//函數功能:釋放保存文件內容的空間

//參數: char **szBuffer  保存文件內容buffer的指針變量

//

//

///////////////////////////////////////////////////////////////////////////////

void CPolymorph::UnmapFile(char **szBuffer

free(*szBuffer);

}

7DoPolymorph(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=iSectHeadiSection<iFileHead->NumberOfSectionsiSection++, iSectPtr++)

{

if(iSectPtr->Characteristics&IMAGE_SCN_CNT_CODE//尋找代碼段

{

// Code section :P

char *szBuf=(char*)malloc(iSectPtr->SizeOfRawData);

memcpy(szBuf, (char*)szBuffer+iSectPtr->PointerToRawDataiSectPtr->SizeOfRawData);

MessageBox(NULL"Bla""Debug"MB_OK);//從這裏開始,真正的功能似乎還沒有實現

free(szBuf);

}

}

UnmapFile(&szBuffer); return true

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章