资源简介
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
- 上一篇:使用败者树实现外排序vc++
- 下一篇:Windows内存清理工具实现含源码及程序
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- PE文件操作代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
评论
共有 条评论