【PE】DOS头-PE头-节表属性说明
DOS头-PE头-节表属性说明
DOS头
dos头由DOS-MZ文件头和DOS块组成
DOS-MZ文件头
(下图是16位程序的表,现在已经不用这个结构体)
==!!!红色结构体成员仍在使用!!!==
中间黑色成员部分可以随意改动不影响程序的运行
最后的结构体是计算机查找pe头所在的地址因此也不能随意更改
DOS块
处于DOS-MZ头与标准PE头的中间,一般由连接器填充,可以干些猥琐事情
这块数据可以随意更改不影响程序运行
PE文件头
下图是pe结构体
一个程序的主要重要数据全在标准PE头和扩展PE头中
PE标识
占用4字节
PE标识不能更改,程序会检测PE标识是否是正确的值
标准PE头
占用20个字节
Machine标识当前这个程序运行在什么样的cpu型号上
NumberOfSections记录当前的PE文件有多少个节
TImeDataStamp是从1970年0时0分0秒开始到编译器编译当前程序的时候
PointerToSymbolTable,NumberOfSymbols与调试相关
SizeOfOptionalHeader扩展PE头的大小,默认情况32位是0xE0,64位是0xf0
Characteristics表示文件属性,要把该位的16进制转换成2进制,转换成的二进制每一位都有其含义
哪位为1,哪位就有相应含义,
位数是从零开始。从右向左位数递增
例如0x0026转换成二进制是0000 0000 0010 0110
其含义是文件是可执行的;不存在行信息;应用程序可处理大于2GB的地址
扩展PE头
占用224个字节
32位和64位的结构体中最后一个子结构体会不同,
64位会比32位少几个成员,还有部分成员变成85字节
先以32位结构体位基准
主要研究红色的部分
Magic是用来标识当前程序是32/64位,转换成两字节后 10B是标识32位,20B是标识64位
BYTE MajorLinkerVersion,BYTE MinorLinkerVersion,存储链接器的版本,由链接器填写,不影响程序运行
DWORD SizeOfCode,DWORDSizeOfnitializedData,DWORDSizeO fUninitialize dData由编译器填写,不影响程序运行
==Addre ssOEntrvPoint==是程序入口,是**==当前这个程序在哪里开始执行的==**,要配合lmageBase(内存镜像基址)来看
==lmageBase==是内存镜像基址,由它决定==程序在内存执行的时候在哪个地址展开==
==(!!!展开不是执行!!!)==
实际的程序在内存的入口是==lmageBase== + ==Addre ssOEntrvPoint==
SectionAlignment. 内存对齐(看上个笔记把)
FileAlignment文件对齐(看上个笔记把)
MajorOperatingSystemVersion:标识损作系统版本号 主版本号
MinorOperatingSyste mVersion;标识损作系统版本号 次版本号
MajorlmageVersion.PE文件自身的版本号
MinorlmageVersionPE文件自身的质本号
MajorSubsystemVersion运行所需子系统版本号
MinorSubsystemVersion:运行所需子系统版本号
Win32VersionValue;子系统质本的值,必须为0
SizeOfimage.内存中整个PE文件展开的尺寸,可比实际的值大,必须是SectionAlignment整数倍
SizeOfHeaders所有头+节表按照文件对齐后的大小,否则加载会出错必须是FileAlignment整数倍
CheckSum(校验盒)校验和一些系统文件有要求,用来 判断文件是否被修改,两个字节两个字节相加,溢出不用在意,最后加上文件长度
Subsystem 子系统驱动程序(1) 图形界面(2) 控制台、DLL(3)
DllCharacteristics 文件特性 不是针对DLL文件的,是描述文件属性
查找方式与上面标准PE头的一样 将16进制转换成2进制,2进制的每一位都有各自的含义
SizeOfStackReserve 初始化时保留的栈大小
SizeOfStackCommit 初始化时实际提交的大小
SizeOHeapReserve 始化时保留的雄大小
SizeOfHeapCommit 初始化时实践提交的大小
LoaderFlags 调试相关
NumberOfRvaAndSizes 目录项数目
IMAGE DATA DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTERIES]
这是个结构体数组,长度是16个字节,有4个DWORD的成员
节表
每个节有40个字节
BYTE NamelIMAGE SIZEOF SHORT_NAME] 8字节,当前节的名字,可更改,不影响程序的运行
VrtualSize 当前这个节中没有对齐后的值,也可以说是当前节真实的值是多少
VirtualAddress 在内存中的偏移地址,加上ImageBase才是在内存中的真正地址
SizeOfRawData 节在文件中对齐后的尺寸
PointerToRawData 节区在文件中的偏移
当有很大一部分初始化了的全局变量, ==VrtualSize值一定小于SizeOfRawData==
当有很大一部分未初始化的全局变量,在文件中不给变量分配空间,但是展开到内存中时要给未初始化的变量初始化,==VrtualSize会比SizeOfRawData大==
这样会让内存很难办,于是内存想**==谁大按照谁展开==**
Characteristics 节的属性
把4字节的16进制转换成2进制后按照对应的位置来查找相关信息