日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

重定位表详解

發布時間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重定位表详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

重定位表對于EXE文件是沒有必要的,因為EXE程序是第一個被載入內存的模塊。而DLL卻是必須需要重定位信息的,因為DLL不一定加載到它默認的ImageBase上。重定位表作為一個單獨的區塊放到區塊表中,其名字一般為.reloc。

PE文件通過將所有可能的修改的數值存放到一個數組里,以一種統一的方式進行修正。
每個重定位信息以一個IMAGE_BASE_RELOCATION開始,采用類似頁分割的方式,由許多重定位塊組成,每個塊是4KB的大小。
IMAGE_BASE_RELOCATION結構如下

typedef struct _IMAGE_BASE_RELOCATION {DWORD VirtualAddress;//RVADWORD SizeOfBlock; } IMAGE_BASE_RELOCATION,* PIMAGE_BASE_RELOCATION; #define IMAGE_SIZEOF_BASE_RELOCATION 8

VirtualAddress是要修正的數據的基地址。
SizeOfBlock是該重定位結構的大小,重定位結構的大小是不定的,在SizeBlock后面緊跟著的就是一個TypeOffset數組,一個大小是2字節,其中高4位代表修正的類型低16位是修正的偏移。它的大小與VirtualAddress相加就是要修正的RVA地址。當出現一個_IMAGE_BASE_RELOCATION結構體的值全為0時,表明重定位表結束
重定位是DATA_DIRECTORY的第6項。

TypeOffset高4位的可能取值:
IMAGE_REL_BASED_DIR64 出現在64位的PE文件中。對于x86而言,所有的基址重定位類型都是IMAGE_REL_BASED_HIGHLOW。并且在一組重定位信息結束的地方會出現IMAGE_REL_BASED_ABSOLUTE用于對齊操作
下面來實戰下。
跳到重定位開始處。

其VirtualAddress是0x1000,重定位結構的大小是0x10,也就是說,后面跟著的TypeOffset數組的個數是(0x10 - 2 * sizeof(DWORD)) / sizeof(TypeOffset),即4個

重定位數據分別是

  • 30 0f
  • 30 23
  • 00 00
  • 00 00

很明顯的看出最后兩個是用于對齊而用的,所以真正有用的是前兩個TypeOffset,他們的類型是3,說明類型是IMAGE_REL_BASED_HIGHLOW,所以我們知道了要修正的數據位置為0x100f,0x1023,換算成文件偏移也就是0x60f,0x623。

所以執行PE文件前,Loader會遍歷重定位表,找到要修正的數據,然后用 (實際映像地址-默認基址)+該重定位數據地址。


補充,之所以TypeOffset只需要12位即可表示x86下的線性地址,是因為我們說了,重定位塊是以頁為單位的,而一頁是4KB,也就是12bit,故我們僅用12位表示偏移即可,高4位就空出來,微軟很聰明的用余下四位干了其他的事情

總結

以上是生活随笔為你收集整理的重定位表详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。