逆向-PE重定位表

重定位表

​ 當連接器生成一個PE文件時,會假設這個文件在執行時被裝載到默認的基地址處(基地址+RVA就是VA)。並把code和data的相關地址寫入PE文件。若是像EXE同樣首先加載就是它imageBase沒問題能算出真正的VA,可是要有多個DLL文件,就會出現基址不對的問題,經過基址+RVA算出來的數據地址和函數地址就會出問題(連接器算的)須要重定位表來調整。在PE文件中重定位表每每單獨做爲一個節用「.reloc」表示。數組

#define IMAGE_DIRECTORY_ENTRY_BASERELOC //重定位表地址
重定位表位於.reloc節內經過_IMAGE_BASE_RELOCATION來組織
typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;
  1. VirtualAddress:指的是下面這組數據(4KB頁內須要重定位的數據個數)的開始RVA地址也就是說這個內存頁基址。下面的是RVA的RVA大小爲2個字節(後面12個位)。
  2. SizeOfBlock:當前重定位結構的大小,這個值減去2個DWORD(VirtualAddress和SizeOfBlock)就是下面須要重定位的地址數組大小。

重定位表只是讓本PE可以正確運行的東西。修正本PE的值。函數

相關文章
相關標籤/搜索