1. 程式人生 > >PE檔案學習(四)基址重定位

PE檔案學習(四)基址重定位

       資料目錄的IMAGE_DIRECTORY_ENTRY_BASERELOC項指向此結構,由於在Windows系統中DLL(動態連結庫)檔案並不是每次都能載入到預設的基址(ImageBase)上,因此基址重定位主要應用於DLL檔案中。

      一般情況下重定位表位於一個名為.reloc的區塊內,PE檔案中的重定位結構是由多個IMAGE_BASE_RELOCATION子結構組成的,每個子結構只負責描述一個4KB大小的分頁內重定位資訊,也就是PE檔案中需要重定位的部分每隔0x1000位元組大小的區域就要有一個。

      基址重定位表的結構:

typedef  struct  _IMAGE_BASE_RELOCATION{
 DWORD  VirtualAddress;    //需重定位資料的其實RAV
DWORD  SizeOfBloce;   //本結構與TypeOffset總大小
}IMAGE_BASE_RELOCATION;
typedef  IMAGE_BASE_RELOCATION  UNALIGNED  * PIMAGE_BASE_RELOCATION;
VirtualAddress:指向PE檔案中需要重定位資料的RAV,由於每個重定位結構體只負責描述0x1000位元組大小區域的重定位資訊,因此這個欄位的值總是0x1000的倍數。
SizeOfBlock:描述IMAGE_BASE_RELOCATION結構體與重定位陣列TypeOffset的體積總大小(IMAGE_SIZEOF_BASE_RELOCATION+2*n)。

資料目錄表之除錯:

資料目錄的IMAGE_DIRECTORY_ENTRY_DEBUG指向此結構,往往保證在一個名為.debug的區段裡,主要負責協助第三方程式除錯本程式,併為其提供除錯資料塊的位置與大小。除錯目錄使用一個名為IMAGE_DEBUG_DIRECTORY的結構作為索引,用資料目錄表中的Size欄位與IMAGE_DEBUG_DIRECTORY的結構的大小可以計算出除錯目錄中的元素個數

_IMAGE_DEBUG_DIRECTORY結構如下:

typedef struct _IMAGE_DEBUG_DIRECTORY
{
	DWORD Characteristics;   //保留
	DWORD TimeDateStamp;     //日期與時間
	WORD  MajorVersion;      //主版本號
	WORD  MinorVersion;      //子版本號
	DWORD Type;              //除錯資訊格式
	DWORD SizeOfData;        //除錯資料的大小
	DWORD AddressOfRawData;  //載入到記憶體時的除錯資料RAV
	DWORD PointerToRawData;  //除錯資料的檔案偏移
}IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;