1. 程式人生 > >Dll注入--修改PE檔案頭

Dll注入--修改PE檔案頭

DLL注入,除了常見的遠執行緒注入,掛鉤和修改登錄檔以外還可以通過修改PE檔案頭來達到注入目的,廢話少說先上菜。

1. 思路

PE檔案經常會呼叫外部DLL檔案,而需要呼叫的DLL檔案都會在PE檔案說明,通過 NT頭->可選頭->匯入表 可以找到匯入表,而匯入表就是對需要匯入的每個DLL的說明,它實際上是一個20個位元組組成的IID結構體陣列,每個結構體就是一個DLL資訊說明,我們只需要向PE檔案中準確新增這樣的一個IID結構體,並且修改好相應指標就能利用作業系統載入PE檔案的時候自動載入DLL檔案了。

2.步驟

以下通過一個例項說明,例子來源於《逆向工程核心原理》25章,其中包括一個test.exe檔案和一個myhack3.dll檔案,目的是要通過手動修改test.exe檔案的內容來注入myhack3.dll檔案。
(1)首先用PEview檢視test.exe檔案已包含的DLL檔案,並分析IID的插入方法


這裡寫圖片描述
從上圖發現test.exe已經載入了4個dll檔案每個dll檔案都是一個IID結構體,佔20個位元組,而且最後一個結構體為空,即全0結構。

《Windows PE權威指南》113頁上面提到最後一個結構體實際不必要為全空,只要其中的Name[1]是0就能滿足結束條件
IID結構說明:
STRUCT IAMGE_IMPORT_DESCRIPTOR
{
union
{
DWORD Characteristics;
DWORD OriginalFirstThunk; // INT的RVA
}
DWORD TimeDateStamp; //一個32位的時間標誌
DWORD ForwarderChain;//這是一個被轉向API的索引,一般為0
DWORD Name;//DLL名字,是個以00結尾的ASCII字元的RVA地址
DWORD FirstThunk; // 指向輸入表的RVA
} ;

我們要插入一個IID結構在現有結構體陣列的最後面(實際不一定非要插在這裡),就要檢視此處是否有可利用空間(可利用空間的意思就是一定要被載入到記憶體,且不影響到其他資料完整性還要有可寫入許可權,為什麼要有可寫入許可權,是因為系統載入時需要用INT的指標寫入IAT),於是我們需要檢視上圖中的76CC-772F這段內容,看它尾部是否有可利用空間
這裡寫圖片描述
我們發現772F後面有資料F6 87…,因此不能把IID插入到這裡,需要另尋它處,於是我們在來檢視.rdata節區後面的空間,看是否有剩餘空間(由於檔案對齊的原因一般都有剩餘空間,但其實我們還可以加入一個新節來存放IID,不過相對麻煩一點)
這裡寫圖片描述
從上圖發現該節去尾部還有大段空白,於是我們可以吧IID結構體陣列移動到這裡,並新增上自己的IID,然後吧相關標頭檔案指標修改指向這裡,但是這裡還需要注意一個問題:此處是否是上文提到過的可利用區域,即是否會被載入到記憶體以及是否有可寫許可權?
這裡寫圖片描述


我們檢視該節頭部發現載入到記憶體的檔案部分應該是長度是2C56 而實際存在與磁碟的內容為2E00比記憶體中的內容要大,那麼磁碟檔案中多出的2E00-2C56去哪裡了?(實際上這是磁碟檔案對了保證檔案對齊而填充的0,如上上個圖所示),所以我們在這裡新增其它資料不會影響到PE檔案的其它資料,同時還要修改上圖中的記憶體許可權標記新增rdata節區可讀屬性0x80000000

可寫屬性的巨集是(IMAGE_SCN_MEM_WRITE)

自此,我們已經找到了IID結構所在地址76CC-772F和要把它複製到的地方7E60-7FFF,還有需要新增的許可權0x80000000,下面開始修改。

(2)移動IID陣列,並在尾部新增一個IID結構,新增可寫許可權
先複製76CC-772F到7E60-7FFF這片區域
這裡寫圖片描述
移動的具體地址可在這片區域隨意選擇,這裡選擇了7E80,其次是新增自己IID結構,這裡自己新增的IID結構地址為7ED0,它實際上是覆蓋了之前原有IID結構陣列的最後一個全0結構,至於新增的內容
STRUCT IAMGE_IMPORT_DESCRIPTOR
{
union
{
DWORD Characteristics;
DWORD OriginalFirstThunk; // INT的RVA =8D00
}
DWORD TimeDateStamp; //一個32位的時間標誌 =0
DWORD ForwarderChain;//被轉向API的索引 =0
DWORD Name;//DLL名字 =8D10
DWORD FirstThunk; // 指向輸入表的RVA IAT=8D20
} ;
而上述地址都是RVA,要把它們轉變為RAW(檔案偏移),如下表所示

這裡寫圖片描述

上圖來自書中,而填好地址之後還得在相應的地址填上實際的內容
這裡寫圖片描述
圖中的8D00、8D10、8D20、8D30都是之RVA轉化為RAW之後分別是 7F00、7F10、 7F20、 7F30,地址轉換可一手動計算也可以利用PEview等工具計算,移動IID陣列和新增IID都已完成,現在要新增可寫許可權即與之前的40000040 or一下,於是
80000000 OR 40000040=C0000040
這裡寫圖片描述
(3)修改可選頭(IMAGE_OPTIONAL_HEADER)頭部指標,刪除繫結匯入表

繫結匯入表:IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT用於加快修正匯入表,不是必要PE檔案必要內容,當我們自己添加了DLL又不修改它的話就會出錯,為了省去麻煩這裡就直接刪除它

可選頭(IMAGE_OPTIONAL_HEADER)中有個指標指向了IID結構陣列的起始位置,我們移動了IID結構,所以要修改此處
這裡寫圖片描述
RVA 84CC改為我們修改的地址RVA 8C80也就是RAW 7E80,檔案大小0X64改為0X78也就是增加0X78-0X64=0X14=20個位元組,
自此,大功告成,只差驗證!!!我的天,寫了半天、、、
(4)驗收
這裡寫圖片描述
從圖中可以看出myhack3.dll已經載入成功,任務COPY!沒有表情圖片,暈死|||