在上一張我們學到了遠程 DLL注入,簡單說就是利用一個程序來注入另外一個程序 DLL檔案。在前幾篇也學過用 Hook 的方法來注入 。那我們今天的這個技術是直接透過修改引入的函式庫來強制程序執行要用的 DLL ,而且每次執行時都可以應用到改變。
檔案 ( 我會用
x32
來演示 ) :
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx21
首先看到 TextView ,他就是一個很簡單的文字閱讀器。
而 hackFile.dll
可以使 TextView 下載 google.com 並顯示在畫面上。
利用 PE-BEAR 來觀察他的引入表
( IDT
),可以看到他執行時會引入那些 DLL 檔案。
那如果想讓程式引入我們想要的 DLL,就勢必要改變 IDT
來使程式獲得 DLL 檔案的位置與空間資訊。
IDT
是否有足夠空間,用查看 Option_Header
的位置與空間。可以看到在 1D2C8
的位置有空間為 8C
的區塊。1D2C8 ~ 1D353
。經過偏移計算後他在檔案上的位置式在 96C8 ~ 9753
。IDT
中的資料 ( IMAGE_IMPORT_DESCRIPTOR
) 都是 14 個 byte,所以要觀察有沒有辦法塞進去。看到裡面有引入 6 個 DLL,再加上結尾的 NULL IDD 結構共需要 20 * 7= 140 = 0x8C 個位置,代表沒辦法塞到現有的 IDT
裡面。既然不能塞到現有的 IDT 中,那得轉移到更開闊的空間。有幾種方法 :
section
的空間section
在觀察文件後發現有很多大於 0xA0 ( 20 * 8 = 160 = 0xA0 )的空白空間,故使用第一種方法。
查找後,我認為 .rdata
是最適合放入表的地方,因為他尾端有沒有資料的區塊,最方便改了。
找尋合適位置,具下圖可以看到 .rdata
的位置與載入資訊。
雖然他的檔案空間有 2800,但實際載入的空間卻只有 26BC ( 到 8EBC ),這點要注意。
我選擇了 8DD0
來放入資料。
如果發現位置似乎不夠了,可以試著把區塊延長個 100 變成 27BC 吧 ( 但是不能超過 RawSize 2800,否則會與下個區塊重疊導致資料覆蓋 )。
IDT
放到新位置上Option_header
的引入表指定位置改成新的 RVA
位置與大小 :RVA : 8DD0 - 6800 + 18000 = 0x1A5D0 → 0x D0 A5 01
Size : 20*8 → A0
到這邊先試試看能不能正常執行,如果沒辦法就代表可能占用到原本要使用的區塊,得換地方。
IDT
。IDT
表上增加一個與 hackFile.dll 對應的 IID
,並在後面填充 NULL IID
。整理成下圖反白資料 :
而 INT
就放在 IDT
得下面方便直接取用,不過 IDD
中的數值是 RVA
,須記得轉換。
把這些資訊填到下方的位置上方便引用 ( dummy
是 hackFile.dll
的函數名稱 )。
結果會像是這樣 :
Section Header
: 寫入權限。使用的時候 PE loader
會改寫 IAT
,所以必須讓區塊有寫入權限,看一下現在 .rdata
的權限長甚麼樣 :看起來得加上寫入權限上去,寫入的值是 0x80000000
,改變後變成 0xC0000040
。
試著執行程式,可以看到成功執行了 !
如果到這邊出現了問題,可以使用 PE-BEAR 來查看導出函式的地方是否有問題。
通常顯示出來的會如下,如果有名稱或數字沒顯示那很有可能再植入的時候位置搞錯。