資源簡介
PE是Portable Executable File Format(可移植的執(zhí)行體)簡寫,它是目前Windows平臺上的主流可執(zhí)行文件格式。
PE文件中包含的內(nèi)容很多,具體我就不在這解釋了,有興趣的可以參看之后列出的參考資料及其他相關(guān)內(nèi)容。
最近我也在學(xué)習(xí)PE文件格式,參考了許多資料,用C++封裝了一個高效方便的PE文件格式解析的類。
該類對想學(xué)PE文件結(jié)構(gòu)的朋友可算一份可貴的資料,代碼均很易懂,考慮較全面,具有一定的通用性。
同時該類也可以讓想創(chuàng)建自己的PE文件解析軟件的朋可以輕松在此基礎(chǔ)上實現(xiàn)。
最后,錯誤在所難免,如果大家發(fā)現(xiàn)有錯誤,歡迎大家指正。
具體參看:http://blog.csdn.net/paschen/article/details/50640421

代碼片段和文件信息
#include?“stdafx.h“
#include?“CPeFile.h“
#include?
#include?
//讀取標志m_dwReadFlag取值(僅在類中使用)
#define?PE_READ_FLAG_EXPORT 0x00000001UL
#define?PE_READ_FLAG_IMPORT 0x00000002UL
#define?PE_READ_FLAG_RESOURCE 0x00000004UL
#define?PE_READ_FLAG_EXCEPTION 0x00000008UL
#define?PE_READ_FLAG_SECURITY 0x00000010UL
#define?PE_READ_FLAG_baseRELOCATION 0x00000020UL
#define?PE_READ_FLAG_DEBUG 0x00000040UL
#define?PE_READ_FLAG_TLS 0x00000080UL
#define?PE_READ_FLAG_LOADCONFIG 0x00000100UL
#define?PE_READ_FLAG_BOUNDIMPORT 0x00000200UL
#define?PE_READ_FLAG_DELAYIMPORT 0x00000400UL
#define?PE_READ_FLAG_ALL (PE_READ_FLAG_EXPORT?|?PE_READ_FLAG_IMPORT?|?PE_READ_FLAG_RESOURCE?|?PE_READ_FLAG_EXCEPTION?|?\
PE_READ_FLAG_SECURITY?|?PE_READ_FLAG_baseRELOCATION?|?PE_READ_FLAG_DEBUG?|?PE_READ_FLAG_TLS?|?\
PE_READ_FLAG_LOADCONFIG?|?PE_READ_FLAG_BOUNDIMPORT?|?PE_READ_FLAG_DELAYIMPORT)
CPeFile::CPeFile()
:?m_dwType(0UL)
?m_dwReadFlag(0UL)
?m_lpExportManager(NULL)
?m_lpImportManager(NULL)
?m_lpResourceManager(NULL)
?m_lpExceptionManager(NULL)
?m_lpSecurityManager(NULL)
?m_lpbaseRelocationManager(NULL)
?m_lpDebugManager(NULL)
?m_lpTLSManager(NULL)
?m_lpLoadConfigManager(NULL)
?m_lpBoundImportManager(NULL)
?m_lpDelayImportManager(NULL)
{
}
CPeFile::~CPeFile()
{
Detach();
}
DWORD?CPeFile::Attach(LPCTSTR?lpszFilePath)
{
assert(!m_dwType);
assert(lpszFilePath);
int?ret?=?OpenPeFile(lpszFilePath);
if?(ret?==?-1)
return?0UL;
else?if?(ret?==?0)
return?1UL;
__try
{
m_dwType?=?CheckHeaders();
}
__except?(EXCEPTION_EXECUTE_HANDLER)
{
CloseFile();
return?2UL;
}
if?(!m_dwType)
CloseFile();
return?m_dwType;
}
void?CPeFile::Detach()
{
if?(m_dwType?==?IMAGE_NT_SIGNATURE)
ClearAll();
if?(m_dwType)
{
CloseFile();
m_dwType?=?0UL;
}
}
DWORD?CPeFile::GetAttachInfo()?const
{
return?m_dwType;
}
HANDLE?CPeFile::GetFileHandle()?const
{
assert(m_dwType);
return?m_hFile;
}
DWORD_PTR?CPeFile::GetMappedFileStart()?const
{
assert(m_dwType);
return?(DWORD_PTR)m_lpMemory;
}
DWORD_PTR?CPeFile::GetMappedFileOffset(DWORD?dwFoa)?const
{
assert(m_dwType);
return?MakePtr(DWORD_PTR?m_lpMemory?dwFoa);
}
const?IMAGE_DOS_HEADER*?CPeFile::GetDosHeader()?const
{
assert(m_dwType);
return?m_lpDosHeader;
}
DWORD?CPeFile::GetDosEntryPoint()?const
{
assert(m_dwType);
return?((DWORD)m_lpDosHeader->e_cs?+?(DWORD)m_lpDosHeader->e_cparhdr)?*?0x10UL?+?(DWORD)m_lpDosHeader->e_ip;
}
const?IMAGE_NT_HEADERS32*?CPeFile::GetNtHeader()?const
{
assert(m_dwType?==?IMAGE_NT_SIGNATURE?||?m_dwType?==?IMAGE_OS2_SIGNATURE?||?m_dwType?==?IMAGE_OS2_SIGNATURE_LE);
return?m_lpNtHeader;
}
BOOL?CPeFile::Is64Bit()?const
{
assert(m_dwType?==?IMAGE_NT_SIGNATURE);
return?m_b64Bit;
}
ULONGLONG?CPeFile::GetImagebase()?const
{
assert(m_dwType?==?IMAGE_NT_SIGNATURE);
if?(m_b64Bit)
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????14555??2016-02-06?16:15??PE文件解析類\CPeFile.h
?????文件??????41111??2016-02-06?16:43??PE文件解析類\CPeFile.cpp
?????文件??????15530??2016-02-06?17:34??PE文件解析類\Demo.rar
?????文件?????215059??2016-02-06?17:56??PE文件解析類\ReadPeFile?v1.0.rar
?????目錄??????????0??2016-02-06?17:57??PE文件解析類
-----------?---------??----------?-----??----
???????????????286255????????????????????5
評論
共有 條評論