第16章 基址重定位 2

2022-03-09 03:37:45 字數 1983 閱讀 7318

pe重定位

使得硬編碼在程式中的記憶體位址隨當前載入位址的變化而變化就是pe重定位.

若不新增重定位,而載入時記憶體位址被占用,則會出現"記憶體位址引用錯誤",使得程式異常終止.

pe重定位的操作原理:

查詢硬編碼位址需要用到重定位表(relocation table),它是記錄硬編碼位址偏移的列表.是pe檔案構建過程中(編譯/鏈結的時候提供的).

重定位表在 image_optional_header/datadirectory[5] 中可找到位址,轉化為 fileoffset 即可.

檢視各個節區頭的資訊,發現在reloc節區中,直接查該節區頭的pointertorawdata欄位中的位址.即紅色框起來的四位元組.

sizeofblock 後面跟著的元素是很多兩位元組的 typeoffset.末端以0結尾.所有重定位塊以乙個 virtualaddress 欄位為 0 的 image_base_relocation 結構結束

第乙個為例:3424. 高四位(此處是3)是重定位型別,低12位(此處是424)是偏移.

在網上搜尋可知,在 windows 中大部分只採用的 image_rel_based_highlow(3) 這種型別.

硬編碼位址的計算為:1000(virtual address)+424(offset) = 1424(rva).

轉到位址 824 處,佔 4 位元組,此處為 010010c8:

在可選頭中查詢到 imagebase 值,一般來說是 1000000.

偏移位址為 010010c8-1000000 = 10c8.從系統獲取程式實際載入的基位址,二者相加即可得到重定位位址.

此處就是10c8+210000 = 2110c8即可看到匯入的 dll 的函式位址.

增加乙個空節區:

第一:修改 sizeofimage 大小,需要約進到 sectionalignment.

第二:修改 fileheader 中的 numberofsections.

第三:新增節區頭,根據前面的節區,計算得到後面的值,其中 virtualsize 可以為0,但是 sizeofrawdata 不能為0.dll屬性可以不填.

需要注意的一點是,如果pe檔案中末位址沒有包含到自己新增的節區,那麼需要自己新增0填充,直到自己新增節區的末位址.

基址重定位表

向程序的虛擬記憶體載入pe檔案 exe dll sys 時,問價會被載入到pe頭的imagebase所指的位址處,若載入的時dll sys 檔案,且在imagebase位置處已經載入了其他dll檔案,那麼pe裝載器就會將其載入到其他未被占用的空間,這就是pe檔案的重定位。ex a.dll被載入到te...

第16章 網路程式設計 2

16.3 python中的網路程式設計 16.3.1 socket 模組函式 使用socket.socket 函式來建立套接字。socket socket family,socket type,protocol 0 import socket tcpsock socket.socket socket...

第16章 Debug Shell指令碼

本章主要介紹一些方便的 有效的 更好的輸出除錯資訊的方法。本章要學習的知識點 1 看懂指令碼輸出的錯誤資訊,並逐步定位到真正的錯誤 2 如何堅持shell指令碼的語法是否有錯誤 3 如何通過track模式找到程式的錯誤 4 分析指令碼錯誤的一般步驟 5 如何在指令碼程式中新增debug支援。當我們執...