【2021.01.13】扩展PE头属性说明

标准PE头

32位和64位PE头结构体有点差异,但是差异不是很大。

typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

typedef struct _IMAGE_NT_HEADERS64 {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER64 OptionalHeader;
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;

扩展PE头

typedef struct _IMAGE_OPTIONAL_HEADER {
    WORD    Magic;
    BYTE    MajorLinkerVersion;
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;
    DWORD   SizeOfInitializedData;
    DWORD   SizeOfUninitializedData;
    DWORD   AddressOfEntryPoint;
    DWORD   BaseOfCode;
    DWORD   BaseOfData;
    DWORD   ImageBase;
    DWORD   SectionAlignment;
    DWORD   FileAlignment;
    WORD    MajorOperatingSystemVersion;
    WORD    MinorOperatingSystemVersion;
    WORD    MajorImageVersion;
    WORD    MinorImageVersion;
    WORD    MajorSubsystemVersion;
    WORD    MinorSubsystemVersion;
    DWORD   Win32VersionValue;
    DWORD   SizeOfImage;
    DWORD   SizeOfHeaders;
    DWORD   CheckSum;
    WORD    Subsystem;
    WORD    DllCharacteristics;
    DWORD   SizeOfStackReserve;
    DWORD   SizeOfStackCommit;
    DWORD   SizeOfHeapReserve;
    DWORD   SizeOfHeapCommit;
    DWORD   LoaderFlags;
    DWORD   NumberOfRvaAndSizes;
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
成员大小(十进制)说明
Magic2字节PE32:10B、PE32+(64):20B,可以用来确认是32位还是64位程序
MajorLinkerVersion1字节链接器版本号
MinorLinkerVersion1字节链接器版本号
SizeOfCode4字节所有代码节的总和,文件对齐后的大小,由编译器填写
SizeOfInitializedData4字节包含所有已经初始化数据的节的总大小,文件对齐后的大小,由编译器填写
SizeOfUninitializedData4字节包含未初始化数据的节的总大小,文件对齐后的大小,由编译器填写
AddressOfEntryPoint4字节程序入口,当前PE文件从哪个位置开始执行,配合ImageBase(内存镜像基址)来看
BaseOfCode4字节代码开始的基址,由编译器填写
BaseOfData4字节数据开始的基址,由编译器填写
ImageBase4字节内存镜像基址,当前PE文件执行时从哪个内存位置展开
SectionAlignment4字节内存对齐
FileAlignment4字节文件对齐
MajorOperatingSystemVersion2字节标识操作系统版本号,主版本号
MinorOperatingSystemVersion2字节标识操作系统版本号,次版本号
MajorImageVersion2字节PE文件自身的版本号
MinorImageVersion2字节PE文件自身的版本号
MajorSubsystemVersion2字节运行所需子系统版本号
MinorSubsystemVersion2字节运行所需子系统版本号
Win32VersionValue4字节子系统版本的值,必须为0
SizeOfImage4字节内存中整个PE文件的映射尺寸,可以比实际的值大,必须是SectionAlignMent(内存对齐)的整数倍
SizeOfHeaders4字节所有头+节表按照文件对齐后的大小,否则加载会出错
CheckSum4字节

校验和,一些系统文件由要求用来判断文件是否被修改,不是所有程序都有。

整个PE文件以2个字节相加,加完以后如果溢出不管,得到的结果+文件长度=校验和

Subsystem2字节子系统,驱动程序:1、图形界面:2、控制台或者DLL:3
DllCharacteristics2字节文件特征,不是针对DLL文件的
SizeOfStackReserve4字节初始化时保留的栈大小
SizeOfStackCommit4字节初始化时实际提交的栈的大小(初始化时真正使用的栈的大小)
SizeOfHeapReserve4字节初始化时保留的堆大小
SizeOfHeapCommit4字节初始化时实践提交的堆的大小(初始化时真正使用的堆的大小)
LoaderFlags4字节调试相关
NumberOfRvaAndSizes4字节目录项目数量,当前程序会用到各种表,如导入表导出表等,描述有多少个这种表
DataDirector不确定结构体数组,NumberOfRvaAndSizes的长度是多少它的长度就是多少

注意:

AddressOfEntryPoint(程序入口)是相对的地址,也就是ImageBase(内存镜像基址) + AddressOfEntryPoint(程序入口)。

IMAGE_OPTIONAL_HEADER->DllCharacteristics

数据位常量符号为1时的含义
0 保留,必须为0
1 保留,必须为0
2 保留,必须为0
3 保留,必须为0
6IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASEDLL可以在加载时被重定位
7IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY强制代码实施完整性验证
8IMAGE_DLLCHARACTERISTICS_NX_COMPAT该映像兼容DEP(Intel的硬件层面修复漏洞的东西)
9IMAGE_DLLCHARACTERISTICS_NO_ISOLATION可以隔离,但并不隔离此映像
10IMAGE_DLLCHARACTERISTICS_NO_SEH映像不适用SEH
11IMAGE_DLLCHARACTERISTICS_NO_BIND不绑定映像
12 保留,必须为0
13IMAGE_DLLCHARACTERISTICS_WDM_DRIVER该映像为一个WDM driver
14 保留,必须为0
15IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWAR可用于终端服务器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值