PE文件重定位概念学习
PE文件基址重定位,Base Relocation。
程序編譯時每個模塊有一個優先加載地址ImageBase,這個值是連接器給出的;因此連接器生成的指令中的地址是在假設模塊被 加載到ImageBase前提之下生成的;
那么一旦程序沒有將模塊加載到ImageBase時,那么程序中 的指令地址就需要重新定位。
這是重定位的基本概念。
基址重定位項,加載器就是利用它來知道模塊是否按預期的 位置加載,哪些指令是需要修改的。
加載器也是通過數據目錄來定位【基址重定位項】,【基址重定位項】被包裝 為一系列連續區段,每一個區段來描述一個4K PAGE(也就是一頁)的重定位信息,它們以一個IMAGE_BASE_RELOCATION結構作為 開始。
在PE文件中,基址重定位表一般放在一個單獨的 ".reloc" 區,可以通過IMAGE_OPTIONAL_HEADER 中 的DataDirectory[5] 查看 基址重定位表 的RVA。
也就是,可選頭中包含數據目錄表,數據目錄表的第6項,是重定位表的偏移;
數據目錄表的說明見,
https://blog.csdn.net/bcbobo21cn/article/details/115035483
IMAGE_BASE_RELOCATION 結構:
??? typedef struct _IMAGE_BASE_RELOCATION {
??????? DWORD?? VirtualAddress;
??????? DWORD?? SizeOfBlock;
??? //? WORD??? TypeOffset[];
??? } IMAGE_BASE_RELOCATION;
??? typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
下面先用010 Editor來了解一下;打開的exe是記事本,notepad.exe;
看數據目錄表的第6項,是重定位表的偏移;
如下圖,NT頭之后是節頭,節頭之后是節數據; 節數據中包含.reloc節;
在工具的最后,又列出重定位表,其中包含數個IMAGE_BASE_RELOCATION結構;? 這個 BASE_RELOCATION_TABLE應該是包含在.reloc節中的;
?
總結
以上是生活随笔為你收集整理的PE文件重定位概念学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超图 iServer服务体系学习
- 下一篇: VC++读写INI文件示例