本文最后更新于 344 天前,其中的信息可能已经有所发展或是发生改变。
内容目录
PE历史简介:
portable excute 可移植的,可执行的文件(exe、dll)
Microsoft最开始做的Dos系统,开头是MZ标识,又叫MZ系统(这tm是个人名,碉堡了),是16位操作体统。
Microsoft后开开发了Windows NT系统,最大的特点是桌面,是32位操作系统。
那么文件格式需要重新设计,出现了PE,希望一统江湖,考虑了所有的操作系统厂家,但是Apple和Linux没有使用PE,而是用ELF(unix、Linux)格式。
因此PE的文件格式里面有很多字段是 windows 系统用不到的,有些是给已经被淘汰的dos系统用的,还有一些是给其他系统用的,所以不是每个字段都非常有用,只需要关注在 windows 上用的,即windows会检查的一些字段
畸形PE:做过手脚的PE,用于对抗
msdn:
代码解释结构
#include <stdio.h>
#include <Windows.h>
//#include <winnt.h> // 定义了pe结构体的所有成员
int main()
{
/******************************* Dos header ************************************/
IMAGE_DOS_HEADER Header; // Dos头
/******************************* PE header ************************************/
//IMAGE_FILE_HEADER peHeader; // 新的文件格式从这里开始,并开始区分32和64位程序,但是文件头被NT头包含
IMAGE_NT_HEADERS32 NTHeader; // IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS64 NT头(PE)
// NT头包含:
{
IMAGE_FILE_HEADER FileHeader; // 文件头,保存文件信息
IMAGE_OPTIONAL_HEADER32 OptionalHeader; // 选项头,存放程序信息
// 选项头包含:
{
IMAGE_DATA_DIRECTORY DataDirectory[1]; // 数据目录,存放各种表,放1个表就增加1项
}
}
/******************************* Section header ************************************/
IMAGE_SECTION_HEADER SectionHeader[1]; //节表,存放段信息,描述映射信息,描述可执行文件在内存中怎么放
// 节数据 ... // 节表和节数据 描述文件中的所有数据如何映射到内存
/******************************* Debug information and certificates ************************************/
// ....
return 0;
}