资源简介
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内存清理工具实现含源码及程序
相关资源
- 使用败者树实现外排序vc++
- C++版任意角度透视变换
- 达内科技 c++ 课件与笔记
- SDNU 面向对象程序设计及C++ MFC 期中作
- C++ Primer Plus第6版_中文版_带书签_超清
- C++标准库第2版_带书签_高清完整版
- 串口通信C++源代码
- LIBCID.LIB
- C++大作业_学生管理系统(含源代码实
- 局部线性回归c++实现
- 朴素贝叶斯算法 c++
- C++全套21天视频教程
- 大恒相机动态库文件和头文件
- c++/MFC CSocket仿QQ聊天软件,实现1对1聊
- C++ QT SMTP 发送邮件(最新,成功的)
- 类C语言的脚本解析执行(使用C++语言
- 五子棋小游戏含注释
- c++服务器 拆包粘包 过程
- C++PCM音频格式录音双缓存MFC版本
- C++播放音频
- 步态识别C++实现
- C++排课系统
- CYK算法的C++实现
- VC++编写的音频播放器代码
- c++小球反弹运动
- 多边形耳切法三角化C++实现
- 服务端Node.js和VC++程序间通过SOCKET通信
- C++ 趣步辅助工具 一键刷步.zip
- 粒子群算法 C#版本 由C++改编
- VC6 编写的类似CPU使用曲线的类,自动
评论
共有 条评论