DOS头-PE头-节表属性说明

DOS头

dos头由DOS-MZ文件头和DOS块组成

DOS-MZ文件头

(下图是16位程序的表,现在已经不用这个结构体)

==!!!红色结构体成员仍在使用!!!==

中间黑色成员部分可以随意改动不影响程序的运行

DOS-MZ结构体

最后的结构体是计算机查找pe头所在的地址因此也不能随意更改

DOS块

处于DOS-MZ头与标准PE头的中间,一般由连接器填充,可以干些猥琐事情

这块数据可以随意更改不影响程序运行

PE文件头

下图是pe结构体

pe头结构体

一个程序的主要重要数据全在标准PE头和扩展PE头中

PE标识

占用4字节

PE标识不能更改,程序会检测PE标识是否是正确的值

标准PE头

占用20个字节

标准PE头结构体

Machine标识当前这个程序运行在什么样的cpu型号上

NumberOfSections记录当前的PE文件有多少个节

TImeDataStamp是从1970年0时0分0秒开始到编译器编译当前程序的时候

PointerToSymbolTable,NumberOfSymbols与调试相关

SizeOfOptionalHeader扩展PE头的大小,默认情况32位是0xE0,64位是0xf0

Characteristics表示文件属性,要把该位的16进制转换成2进制,转换成的二进制每一位都有其含义

characteristics含义表

哪位为1,哪位就有相应含义,

位数是从零开始。从右向左位数递增

例如0x0026转换成二进制是0000 0000 0010 0110

其含义是文件是可执行的;不存在行信息;应用程序可处理大于2GB的地址

扩展PE头

占用224个字节

扩展pe头结构体

32位和64位的结构体中最后一个子结构体会不同,

64位会比32位少几个成员,还有部分成员变成85字节

先以32位结构体位基准

扩展PE头-32结构体

扩展PE头结构体-32-02

主要研究红色的部分

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文件的,是描述文件属性

DilCharacteristics

查找方式与上面标准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进制后按照对应的位置来查找相关信息

节表属性表