此文档主要讲解导出表,重定位信息:
使用例子为: Windows.UI.Xaml.dll、010editor
1、导出表,重定位表的地址存放在哪里
DOS头-àPE头文件(_IMAGE_NT_HEADERS)-à扩展头(IMAGE_OPTIONAL_HEADER32)-à数据目录表
数据目录表中的内容:
structIMAGE_DATA_DIRECTORY Export (1)
……
StructIMAGE_DATA_DIRECTORY BaseRelocationTable (6)
Typedef struct IMAGE_DATA_DIRECTORY {
DWORDVirtualAddress ; //此处地址为在内存中的地址
DWORD size ;
}
如下图信息:
2、这里是VirtualAddress,如何转变成相对文件地址:
根据pe文件的区段表进行转换:
去段表的结构:
Typedefstruct _IMAGE_SECTION_HEADER{
BYTEName[0x8];
Union{
DWORDPhysicalAddress;
DWORDVirtualSize ;
}
DWORDVirualAddress ;
DWORDSzieOfRawData;
DWORDPointerToRawData;
DWORDPointerToRelocations;
DWORDPointerToLinenumbers;
WORDNumberOfRelocations;
WORDNumberOfLinenumbers;
DWORDCharacteristics;
}
查看需要转换的RVA在哪一个区段中。比如:VirualAddress (比如:此地址为第一个模块地址)<RVA <VirualAddres(第二个模块地址),那么RVA应该依据第一个模块进行转换:RVA-VirualAddress+PointerToRawData=offset(相对文件偏移)