PE文件学习记录
大三下的选修课程《恶意代码分析》中需要学习PE文件的相关知识,以此为契机,记录一下自己的学习过程并对知识加以整理和理解
PE文件相关基本概念
1.基地址(ImageBase):
PE文件被加载到内存后,内存中的版本被称为模块(Module),映射文件的起始地址被称为模块句柄(hModule)。这个初始内存地址也被称为基地址(ImageBase)。
2虚拟地址(VA):
在PE用语中,PE文件实际的内存地址被称为虚拟地址(VA,Virtual Address)。
3.相对虚拟地址(RVA):
为了避免PE文件中有确定的内存地址,出现了相对虚拟地址(Relative Virtual Addres,即RVA)。RVA是内存中的一个简单的相对于PE文件装入地址的偏移位置,他是一个相对的位置,或者称为偏移量。
假如一个PE文件从地址400000h装入,并且他的代码区块去从440000h开始,那么代码区块的RVA 则为
440000h-400000h=40000h。
VA(虚拟地址) - ImageBase(基址) = RVA(相对虚拟地址)
4.文件偏移地址:
当PE文件存储在磁盘上时,某个数据相对于文件头的偏移量,称为文件偏移地址(File Offset)或物理地址(Raw Offset)。文件偏移地址从PE文件的第一个字节开始计数,起始值为0。用十六进制工具(Winhex等)打开文件显示的就是文件偏移地址。
PE文件格式
1.MS-DOS头部
每个PE文件都是由一个DOS程序开始的,有了它,程序在DOS环境下运行性时,DOS就能识别出这是一个有效的执行体,随后运行的是DOS stub(DOS块)。DOS块是一个有效的EXE文件,在不支持PE文件的操作系统中,它将简单的显示一条错误提示。
DOS头部:
typedef struct IMAGE_DOS_HEADER{
WORD e_magic; //DOS头的标识,为4Dh和5Ah,为字母MZ
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
DWORD e_lfanew; //指向IMAGE_NT_HEADERS的所在
}IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
e_magic字段为DOS头标识,需要被设置为5A4DH,ASCLL码值为MZ,是MS-DOS的最初创建者之一的名字缩写。
e_lfanew字段为真正PE文件头的相对偏移地址(RVA),指出真正PE头的文件偏移位置。
在winhex中查看exe文件:
2.PE文件头
紧跟着DOS stub的是PE文件头(PE Header)。PE Header是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从DOS头中的e_lfanew字段中找到PE Header的起始偏移量,加上基址得到PE文件头的基址。
PNTHeader = ImageBase + dosHeader->e_lfanew
IMAGE_NT_HEADER是由三个字段组成
typedef struct IMAGE_NT_HEADERS{
DWORD Signature; ?;PE文件标识
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
}IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS;
1. Signature字段
在一个有效PE文件中,Signature字段被设置为00004550h,ASCLL码为’PE\0\0’,#define IMAGE_NT_SIGNNATURE定义了这个值。
#define IMAGE_NT_SIGNNATURE 0x00004550
2. IMAGE_FILE_HEADER
IMAGE_FILE_HEADER(映像文件头)结构包含了一些关于PE文件的基本信息。
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; //运行平台
WORD NumberOfSections; //文件的区块数目
DWORD TimeDateStamp; //文件创建日期和时间
DWORD PointerToSymbolTable; //指向符号表(用于调试)
DWORD NumberOfSymbols; //符号表中符号个数(用于调试)
WORD SizeOfOptionalHeader; //IMAGE_OPTIONAL_HEADER32结构大小
WORD Characteristics; //文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
其中较为重要的是
1.SizeOfOptionalHeader:
指出了IMAGE_OPTION_HEADER结构的大小。
2.NumberOfSections:
指出了文件的区块数目。
3.IMAGE_OPTIONAL_HEADER
###待续