资源简介

PE是Portable Executable File Format(可移植的执行体)简写,它是目前Windows平台上的主流可执行文件格式。 PE文件中包含的内容很多,具体我就不在这解释了,有兴趣的可以参看之后列出的参考资料及其他相关内容。 最近我也在学习PE文件格式,参考了许多资料,用C++封装了一个高效方便的PE文件格式解析的类。 该类对想学PE文件结构的朋友可算一份可贵的资料,代码均很易懂,考虑较全面,具有一定的通用性。 同时该类也可以让想创建自己的PE文件解析软件的朋可以轻松在此基础上实现。 最后,错误在所难免,如果大家发现有错误,欢迎大家指正。 具体参看: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


评论

共有 条评论