PE结构

博客提供了pe结构.pdf的下载链接https://download.youkuaiyun.com/download/uvarandmethod/10406805 ,并提及要重温PE结构,与信息技术领域的文件结构相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pe结构.pdf 下载:https://download.youkuaiyun.com/download/uvarandmethod/10406805

重温PE结构:

1、DOS头
struct _IMAGE_DOS_HEADER {
0x00 WORD e_magic;//"MZ标记" 用于判断是否为可执行文件.
0x02 WORD e_cblp;
0x04 WORD e_cp;
0x06 WORD e_crlc;
0x08 WORD e_cparhdr;
0x0a WORD e_minalloc;
0x0c WORD e_maxalloc;
0x0e WORD e_ss;
0x10 WORD e_sp;
0x12 WORD e_csum;
0x14 WORD e_ip;
0x16 WORD e_cs;
0x18 WORD e_lfarlc;
0x1a WORD e_ovno;
0x1c WORD e_res[4];
0x24 WORD e_oemid;
0x26 WORD e_oeminfo;
0x28 WORD e_res2[10];
0x3c DWORD e_lfanew;//PE头相对于文件的偏移,用于定位PE文件
};
2、NT    nt头遍历  https://blog.youkuaiyun.com/uVarAndMethod/article/details/90575526
struct _IMAGE_NT_HEADERS {
0x00 DWORD Signature;               //5045  pe标记
0x04 _IMAGE_FILE_HEADER FileHeader;//标准PE头
0x18 _IMAGE_OPTIONAL_HEADER OptionalHeader;//可选PE头
};

(1)、标准PE头
struct _IMAGE_FILE_HEADER {
0x00 WORD Machine;    //程序运行的CPU型号:0x0 任何处理器/0x14C 386及后续处理器
0x02 WORD NumberOfSections;//文件中存在的节的总数,如果要新增节或者合并节 就要修改这个值
0x04 DWORD TimeDateStamp;//时间戳:文件的创建时间(和操作系统的创建时间无关),编译器填写的
0x08 DWORD PointerToSymbolTable;
0x0c DWORD NumberOfSymbols;
0x10 WORD SizeOfOptionalHeader;//可选PE头的大小,32位PE文件默认E0h 64位PE文件默认为F0h  大小可以自定义.
0x12 WORD Characteristics;//每个位有不同的含义,可执行文件值为10F 即0 1 2 3 8位置1 
};
(2)、
struct _IMAGE_OPTIONAL_HEADER {
0x00 WORD Magic;    //说明文件类型:10B 32位下的PE文件     20B 64位下的PE文件
0x02 BYTE MajorLinkerVersion;
0x03 BYTE MinorLinkerVersion;
0x04 DWORD SizeOfCode;    //所有代码节的和,必须是FileAlignment的整数倍 编译器填的  没用
0x08 DWORD SizeOfInitializedData;//已初始化数据大小的和,必须是FileAlignment的整数倍 编译器填的  没用
0x0c DWORD SizeOfUninitializedData;//未初始化数据大小的和,必须是FileAlignment的整数倍 编译器填的  没用
0x10 DWORD AddressOfEntryPoint;//程序入口
0x14 DWORD BaseOfCode;//代码开始的基址,编译器填的   没用
0x18 DWORD BaseOfData;//数据开始的基址,编译器填的   没用
0x1c DWORD ImageBase; //内存镜像基址
0x20 DWORD SectionAlignment;//内存对齐
0x24 DWORD FileAlignment;//文件对齐
0x28 WORD MajorOperatingSystemVersion;
0x2a WORD MinorOperatingSystemVersion;
0x2c WORD MajorImageVersion;
0x2e WORD MinorImageVersion;
0x30 WORD MajorSubsystemVersion;
0x32 WORD MinorSubsystemVersion;
0x34 DWORD Win32VersionValue;
0x38 DWORD SizeOfImage;//内存中整个PE文件的映射的尺寸,可以比实际的值大,但必须是SectionAlignment的整数倍
0x3c DWORD SizeOfHeaders;//所有头+节表按照文件对齐后的大小,否则加载会出错
0x40 DWORD CheckSum;//校验和,一些系统文件有要求.用来判断文件是否被修改.
0x44 WORD Subsystem;
0x46 WORD DllCharacteristics;
0x48 DWORD SizeOfStackReserve;//初始化时保留的堆栈大小 
0x4c DWORD SizeOfStackCommit;//初始化时实际提交的大小
0x50 DWORD SizeOfHeapReserve;//初始化时保留的堆大小 
0x54 DWORD SizeOfHeapCommit;//初始化时实践提交的大小 
0x58 DWORD LoaderFlags;
0x5c DWORD NumberOfRvaAndSizes;//目录项数目
0x60 _IMAGE_DATA_DIRECTORY DataDirectory[16];
};

3、节表      节的描述信息;
IMAGE_SECTION_HEADER *pISH = (IMAGE_SECTION_HEADER *)((DWORD)pFileBuf + pIDH->e_lfanew + sizeof(IMAGE_NT_HEADERS));
typedef struct _IMAGE_SECTION_HEADER {
0x00 BYTE Name[IMAGE_SIZEOF_SHORT_NAME];//8个字节 一般情况下是以"\0"结尾的ASCII吗字符串来标识的名称,内容可以自定义.注意:该名称并不遵守必须以"\0"结尾的规律,如果不是以"\0"结尾,系统会截取8个字节的长度进行处理.
union {
0x08  DWORD PhysicalAddress;
0x08 DWORD VirtualSize;
} Misc;//双字 是该节在没有对齐前的真实尺寸,该值可以不准确。
0x0c DWORD VirtualAddress;//节区在内存中的偏移地址。加上ImageBase才是在内存中的真正地址.
0x10 DWORD SizeOfRawData; //节在文件中对齐后的尺寸.
0x14 DWORD PointerToRawData; //节区在文件中的偏移.
0x18 DWORD PointerToRelocations;//在obj文件中使用 对exe无意义
0x1c DWORD PointerToLinenumbers;//行号表的位置 调试的时候使用
0x20 WORD NumberOfRelocations;//在obj文件中使用  对exe无意义
0x22 WORD NumberOfLinenumbers;//行号表中行号的数量 调试的时候使用
0x24 DWORD Characteristics;//节的属性
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值