1. 程式人生 > >更改PE檔案載入動態庫

更改PE檔案載入動態庫

最近看了《逆向工程核心原理》,其中第25.4節講了更改PE檔案讓目標檔案載入我們的動態庫。現在做一下完整介紹。

PE檔案的匯入DLL資訊儲存在IDT中,於是我們只需將DLL加到目標PE檔案的IDT中,這時我們得先看一下IDT的空間大小。 1.檢視IDT: 首先用PEView檢視目標程式,看IMPORT Directory Table內容

可見地址範圍從76CC---772F,用HxD觀察該範圍內存空間


我們可以看到IDT由一個個結構體構成,每個結構體大小為0x14(20)位元組 觀察該地址範圍,發現無法寫下一個IMAGE_IMPORT_DIRECTORY結構體,於是我們需要尋找一個更大的空間去儲存IDT 2.移動IDT 移動IDT我們有三種方法: 1.查詢檔案中的空閒區域 2.增加最後一個節區的大小 3.增加一個新節區  首先我們嘗試第一種方法。 我們可以看到在節區的.rdata最後部分存在大量空白區域,PE檔案稱這種空白區域稱為Null-Padding

這時我們還要確認這個部分是否可用,我們觀察.rdata大小為2E00,但是實際使用大小為2C56於是,我們可以用剩下的1AA位元組地址


我們在RAW:7E80(RVA:8C80)處建立IDT 資料的檔案偏移=(資料RVA - RVA) + 節的檔案偏移 RVAtoRAW   RAW -PorinterToRawData = RVA- VirtualAddress RAW = RVA -VirtualAddress+PointerToRawData(Address of Entry Point) 所以RVA=7E80(當前RAW)-5200(.rdata節起始RAW)+6000(.rdata節RVA) 現在新加入一個匯入函式,導致IDT增大0x14位元組,所以在更改檔案160處的IDT的RVA為8C80,Size為78


3.刪除繫結匯入表 若要正常匯入DLL,需要向繫結匯入表新增資訊。但是繫結匯入表是個可選項,所以為了方便可刪除。如果繫結匯入表資訊錯誤,則執行失敗,但是沒有繫結匯入表反而沒有問題。本例的繫結匯入表資訊為0,所以不用刪除,但是其他檔案需注意。
4.建立新的IDT 完全複製原IDT內容(76CC---772F ),然後覆蓋到新的IDT地址處
5。設定NAME,INT,IAT INT       RVA=7F00-5200+6000=8D00 NAME   RVA=7F10-5200+6000=8D10 IAT        RVA=7F20-5200+6000=8D20
6.修改.rdata的屬性 向IAT節區頭新增IMAGE_SEC_MEM_WRITE(80000000)屬性



至此,我們任務完成。 我們發現原檔案的IAT也位於.rdata節區,且原.rdata節區並沒有可寫屬性,為什麼也可以正常執行呢?這是因為在PE頭中的IMAGE_OPTIONAL_HEADER結構的DataDirectory陣列中存在IAT,若IAT存在於該區域,即使相應的節區沒有可寫屬性也沒事。