使用SDK或Visual C++創(chuàng)建PE文件時鹿霸,EXE默認的ImageBase為00400000,DLL默認10000000秆乳。使用DDK創(chuàng)建的SYS文件默認的ImageBase為10000懦鼠。
Windows Vista之后的版本引入了ASLR安全機制,每次運行EXE文件都會被加載到隨機地址屹堰,增強了系統(tǒng)安全性肛冶。
VC++中生成的PE文件的重定位節(jié)區(qū)名為.reloc,刪除該節(jié)區(qū)后文件照常運行扯键。
.reloc刪除:
首先在 IMAGE_SECTION_HEADER .reloc 處查看該節(jié)區(qū)頭的長度和 .reloc 節(jié)區(qū)的偏移地址睦袖,以及 Virtual Size
然后將 .reloc 的節(jié)區(qū)頭中的值替換為0, .reloc 節(jié)區(qū)整個刪除
刪除節(jié)區(qū)后荣刑,修改 IMAGE_FILE_HEADER 中的 Number of Sections 項馅笙。
通過 IMAGE_OPTIONAL_HEADER - size of Image 修改映像值大小伦乔。
需要減去的值根據(jù)之前記錄的 Virtual Size 和 IMAGE_OPTIONAL_HEADER - Section Alignment 值擴展后所得。
根據(jù)PE文件格式規(guī)范延蟹,IMAGE_NT_HEADERS的起始位置是“可變的”评矩,由IMAGE_DOS_HEADER中的e_lfanew的值決定。一般擁有如下值(不同構(gòu)建環(huán)境會有不同):
e_lfanew = MZ文件頭大小(40) + DOS存根大小(可變:VC++下為A0) = E0
IMAGE_FILE_HEADER中的SizeOfOptionalHeader表示IMAGE_OPTIONAL_HEADER結(jié)構(gòu)體的長度阱飘。另一層含義是確定節(jié)區(qū)頭(IMAGE_SECTION_HEADER)的起始偏移斥杜。
從IMAGE_OPTIONAL_HEADER的起始偏移加上SizeOfOptionalHeader的值的位置開始才是IMAGE_SECTION_HEADER
IMAGE_OPTIONAL_HEADER在32位PE32中大小為E0,64位PE32+中的大小為F0
Data_Directories中Import_Table為八個字節(jié)沥匈。前四個字節(jié)為導入表的地址(RVA)蔗喂,后四個字節(jié)為導入表的大小(SIZE)。如下圖:導入表的RVA為271EE