本文整理自《加密与解密》第10章
一、基本概念
基地址:映射文件的起始地址被称为模块句柄,可以通过模块句柄访问内存中其他的数据结构。这个初始内存地址被称为基地址
GetModuleHandle函数返回可执行文件的基地址。
相对虚拟地址(RVA):RVA只是内存中的一个简单的相对于PE文件装入地址的偏移位置。
实际的内存地址被称作虚拟地址(VA)
VA=ImageBase+RVA
文件偏移地址:PE文件存储在磁盘上时,某个数据的位置相对于文件头的偏移量,称为文件偏移地址(File Offset)或物理地址(RAWOffset)。用WinHex打开文件所显示的地址就是文件偏移地址。
二、PE文件头
PNTHeader=ImageBase+dosHeader->e_lfanew
IMAGE_NT_HEADERS
{
+0h DWORD Signature; PE00
+4h IMAGE_FILE_HEADER FileHeader;
+18h IMAGE_OPTIONAL_HEADER32 OptionalHeader;
}
Signature4个字节
IMAGE_FILE_HEADER
{
WORD Machine;
WORDNumberOfSections;区块数目
DWORDTimeDateStamp;时间戳
DWORDPointerToSymbols;
DWORDNumberOfSymbols;
WORDSizeOfOptionalHeader;指出了OptionalHeader的大小,32位PE一般是00E0h,64位是00F0h
WORDCharacteristics;
}
IMAGE_FILE_HEADER结构体一共20个字节
IMAGE_OPTIONAL_HEADER32
{
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUnInitializedData;
DWORD AddressOfEntryPoint; 程序执行入口RVA
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImgaeBase; 程序默认装入基地址
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingsystemversion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsybtemVersion;
WORD MinorSubsybtemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage; 映像.
装入内存后的总尺寸,一直是16
DWORD SizeoOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlages;
DWORD NumberOfRvaAndSizes; 数据目录