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文件欢迎分享,转载请注明来源:内存溢出
评论列表(0条)