www.pudn.com > MessageAdder.rar > Pe.h


// Pe.h: interface for the CPe class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_PE_H__21346F8C_4391_4415_9D60_1382045CAD96__INCLUDED_) 
#define AFX_PE_H__21346F8C_4391_4415_9D60_1382045CAD96__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
#include "io.h" 
#include "fcntl.h" 
#include "sys/stat.h" 
 
typedef struct PE_HEADER_MAP { 
	DWORD signature; 
	IMAGE_FILE_HEADER _head; 
	IMAGE_OPTIONAL_HEADER opt_head; 
	IMAGE_SECTION_HEADER section_header[6]; 
} peHeader; 
 
class CPe   
{ 
public: 
	CPe(); 
	virtual ~CPe(); 
public: 
	//计算PE header的开始偏移,保存旧的程序入口地址,计算新的入口地址和计算PE文件的空隙空间 
	void CalcAddress(const void *base); 
	 
	//对一个PE文件进行MessageBoxA代码的注入 
	void ModifyPe(CString strFileName, CString strTitle, CString strMsg); 
	void WriteFile(CString strFileName, CString strTitle, CString strMsg); 
 
	//把新的入口地址写入PE程序原来的入口地址处,使PE加载器载入程序时先跳到MessageBoxA处 
	BOOL WriteNewEntry(int ret, long offset, DWORD dwAddress); 
	/*把MessageBoxA的机器代码写入到PE文件中。这个函数现实的对话框的标题和现实内容长度不固定。 
	先计算MessageBoxA函数的地址和函数的返回值,把新生成的的代码写入PE程序*/ 
	BOOL WriteMessageBox(int ret, long offset, CString strCap, CString strTxt); 
 
	//把一个DWORD变量值转换成一个字符串,同时颠倒顺序,按照Little-endian方式 
	CString StrOfWord(DWORD dwAddress); 
public: 
	DWORD dwSpace; 
	DWORD dwEntryAddress; 
	DWORD dwEntryWrite; 
	DWORD dwProvRAV; 
	DWORD dwOldEntryAddress; 
	DWORD dwNewEntryAddress; 
	DWORD dwCodeOffset; 
	DWORD dwPeAddress; 
	DWORD dwFlagAddress; 
	DWORD dwVirtSize; 
	DWORD dwPhysAddress; 
	DWORD dwPhysSize; 
	DWORD dwMessageBoxAadaddress; 
 
}; 
 
#endif // !defined(AFX_PE_H__21346F8C_4391_4415_9D60_1382045CAD96__INCLUDED_)