文章目录
PE 结构基础与图解
虚拟地址(VA): 在一个程序运行起来的时候,会被加载到内存中,并且每个进程都有自己的4GB,这个4GB当中的某个位置叫做虚拟地址,也就是内存中的地址,由物理地址映射过来的,4GB的空间,并没有全部被用到。
基地址( Imagebase ): 磁盘中的文件加载到内存当中的时候可以加载到任意位置,而这个位置就是程序的基址。EXE默认的加载基址是400000h,DLL文件默认基址是10000000h。需要注意的是基地址不是程序的入口点。
相对虚拟地址(RVA):。RVA是在内存中相对与载入地址(基地址)
的偏移量,所以你可以发现前三个概念的关系 : 虚拟地址(VA)= 基地址+ 相对虚拟地址(RVA)
文件偏移地址(FOA):当PE文件储存在某个磁盘当中的时候,某个数据的位置相对于文件头的偏移量。
入口点(OEP):首先明确一个概念就是OEP是一个RVA,,然后使用 OEP + Imagebase == 入口点的VA,通常情况下,OEP指向的不是main函数。
VOffset:节起始地址对于ImageBase的偏移量
ROffset:该节起始地址对于文件的偏移量
现在让你求某个虚拟地址VA,对应的文件偏移地址 fRVA
fRVA-ROffset=RVA-VOffset
fRVA=RVA-VOffset+ROffset
(RVA=VA-ImageBase)
RVA 和文件偏移的转换
PE 指纹
文件开头DOS标志“MZ” -> 在0x3c(e_lfanew)处可找到“PE”头地址
由此可确定该文件为PE文件
DOS MZ文件头
IMAGE_DOS_HEADER STRUCT
{
WORD e_magic // MZ(4Dh 5Ah) DOS可执行文件标记
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[