pe文件头位置?

pe文件头位置?,第1张

PE文件的DOS头:

typedef struct _IMAGE_DOS_HEADER {// DOS .EXE 头

WORD e_magic// DOS .EXE头的标志”MZ”

WORD e_cblp

WORD e_cp

WORD e_crlc

WORD e_cparhdr

WORD e_minalloc

WORD e_maxalloc

WORD e_ss//初始化堆栈指针SS

WORD e_sp// 初始化堆栈指针

WORD e_csum

WORD e_ip// 初始化IP就是DOS代码入口IP

WORD e_cs// 初始化CS就是DOS代码入口CS

WORD e_lfarlc

WORD e_ovno

WORD e_res[4]

WORD e_oemid

WORD e_oeminfo

WORD e_res2[10]

LONG e_lfanew// PE头的文件偏移

} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER

typedef struct _IMAGE_NT_HEADERS {

DWORD Signature//PE文件的标志”PE”

IMAGE_FILE_HEADER FileHeader

IMAGE_OPTIONAL_HEADER32 OptionalHeader

} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32

IMAGE_FILE_HEADER结构:

typedef struct _IMAGE_FILE_HEADER {

WORDMachine//PE文件运行平台,如果系统检测到和当前平台不相同就拒绝装入

WORDNumberOfSections//文件的节数目,这个值是包含最后的空节的

DWORD TimeDateStamp//文件的创建时间这个是从1969.12.31 16时开始的总秒数

DWORD PointerToSymbolTable

DWORD NumberOfSymbols

WORDSizeOfOptionalHeader//IMAGE_OPTIONAL_HEADER32结构的长度

WORDCharacteristics//文件的属性说明这个文件时EXE,DLL,驱动程序……

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER

IMAGE_OPTIONAL_HEADER32结构:

typedef struct _IMAGE_OPTIONAL_HEADER {

WORDMagic//ROM Image=0x0018 0x0107exe Image=0x010B

BYTEMajorLinkerVersion//连接器版本号

BYTEMinorLinkerVersion

DWORD SizeOfCode//所有代码的总大小

DWORD SizeOfInitializedData//所有含已初始化数据的节的总大小

DWORD SizeOfUninitializedData//所有含未初始化数据节的总大小

DWORD AddressOfEntryPoint//程序入口RVA

DWORD BaseOfCode//代码起始RVA

DWORD BaseOfData//数据起始RVA

DWORD ImageBase//建议装载的地址

DWORD SectionAlignment//装入内存后的对齐粒度

DWORD FileAlignment//在在文件中的对齐粒度

WORDMajorOperatingSystemVersion// *** 作系统版本号

WORDMinorOperatingSystemVersion

WORDMajorImageVersion//可运行于 *** 作系统的最小版本号

WORDMinorImageVersion

WORDMajorSubsystemVersion//可运行的子系统版本号

WORDMinorSubsystemVersion

DWORD Win32VersionValue//未用

DWORD SizeOfImage内存中整个PE映像的尺寸

DWORD SizeOfHeaders//所有头和节表的尺寸

DWORD CheckSum

WORDSubsystem//文件的子系统

WORDDllCharacteristics

DWORD SizeOfStackReserve//初始化时堆栈的大小

DWORD SizeOfStackCommit//初始化时实际提交的堆栈大小

DWORD SizeOfHeapReserve//初始化时保留的堆大小

DWORD SizeOfHeapCommit//初始化时实际提交的堆大小

DWORD LoaderFlags//未用

DWORD NumberOfRvaAndSizes下面的数据目录结构的数量

IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]//16个//IMAGE_DATA_DIRECTORY结构体数组

} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32

typedef struct _IMAGE_DATA_DIRECTORY {

DWORD VirtualAddress//数据块的起始RVA

DWORD Size//数据块的大小

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY

IMAGE_OPTIONAL_HEADER32中的DataDirectory结构数组各个表项的含义如下:

索引 对应数据块的作用

0 导入表

1 导出表

2 资源

3 异常

4 安全

5 重定位表

6 调试信息

7 版权信息

8 不详

9 Thread Local Storage

10 不详

11 不详

12 导入函数地址表

13 不详

14 不详

15 未使用

这就是Pe文件头...

要到达IMAGE_FILE_HEADER(

文件头

)结构,请先确认DOS-头“MZ”(起始的2个字节),然后找出DOS-根的头部的成员“e_lfanew”,并从文件开始处跳过那么多的字节。在核实你在那里找到的签名后,IMAGE_FILE_HEADER(文件头)结构的文件头就紧跟其后开始了

&ltdiv class=&quotcnt&quot&gt1、首先检验文件头部第一个字的值是否等于 IMAGE_DOS_SIGNATURE,是则 DOS MZ header 有效。上面的是百度的结果翻译通俗点1、查找MZ头是否为0X4D5A2、如果上面条件符合 则用e_lfanew指针定位pe头,e_lfanew一般位于0X3C3、如果上面条件符合 则判断pe头是否为0x4550都符合 则是有效PE文件


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7992408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存