前言
通过分析和解析Windows PE格式,并使用qt进行图形化显示
一、什么是Windows PE格式中的数据目录?
PE(Portable Executable)文件格式中的数据目录是一个表,它提供了关于PE文件中各种数据结构和资源的位置信息。数据目录位于PE文件头的可选头(Optional Header)部分,紧跟在标准PE头之后。
PE文件格式中的数据目录总共有16个
1、导出目录(Export Directory):包含有关从PE文件导出的函数和数据的信息。
2、导入目录(Import Directory):包含有关PE文件依赖的其他模块和函数库的信息。
3、资源目录(Resource Directory):包含有关PE文件中嵌入的资源(如图标、字符串、位图等)的信息。
4、异常目录(Exception Directory):包含有关PE文件中定义的异常处理信息。
5、安全目录(Security Directory):包含有关PE文件的安全证书和权限集的信息。
6、重定位目录(Relocation Directory):包含有关PE文件可能需要进行的重定位操作的信息。
7、调试目录(Debug Directory):包含有关PE文件的调试信息。
8、版权目录(Architecture Directory):包含有关PE文件特定于处理器体系结构的信息。
9、全局指针目录(Global Ptr Directory):包含有关PE文件使用的全局指针的信息。
10、TLS目录(TLS Directory):包含有关PE文件使用的线程局部存储(Thread Local Storage)的信息。
11、负载配置目录(Load Configuration Directory):包含有关PE文件的安全性和稳定性配置的信息。
12、绑定导入目录(Bound Import Directory):包含有关PE文件绑定的导入信息。
13、IAT目录(Import Address Table Directory):包含有关PE文件中导入函数的地址表的信息。
14、延迟加载导入目录(Delay Import Directory):包含有关PE文件中延迟加载的导入信息。
15、COM表(COM Descriptor Directory):包含有关PE文件作为COM组件的信息。
16、预留类型表(Reserved):一个预留的条目,通常未使用。
二、解析数据目录并显示
1.数据目录结构体
数据目录表由一个或多个目录条目组成,每个条目描述了一个特定的数据结构或资源的位置。每个目录条目包含以下两个字段:
VirtualAddress(虚拟地址):该字段给出了数据结构或资源在PE文件虚拟地址空间中的起始地址。这个地址是一个RVA(相对虚拟地址)。
Size(大小):该字段给出了数据结构或资源的字节大小。
struct IMAGE_DATA_DIRECTORY
{
DWORD VirtualAddress;
DWORD Size;
};
2.解析数据目录表
bool PEParser::parserFileData(const QByteArray &fileData)
{
//判断是否是MZ开头的文件
if (fileData.left(2) != "MZ")
{
return false;
}
//解析DOS头
parserDOSHeader(fileData.left(sizeof(IMAGE_DOS_HEADER)));
//DOSStub数据
m_dosStubData = fileData.mid(sizeof(IMAGE_DOS_HEADER)