利用中轉輸出表製作HijackDll(附工具原始碼)

2022-08-01 15:33:12 字數 3603 閱讀 5604

標 題:

【原創】利用中轉輸出表製作hijackdll(附工具原始碼)

作 者:

baixinye

時 間: 2012-08-05,16:48:45

鏈 接:

眾所周知,pe檔案中的匯出表指向乙個image_export_directory結構,該結構定義如下:

typedef struct _image_export_directory  image_export_directory, *pimage_export_directory;

其中addressoffunctions指向的是乙個rva陣列,而這些rva在「正常情況」下就是每個匯出函式在記憶體中相對於檔案頭的偏移,在pe載入到記憶體中後,經過簡單的計算就能得到每個匯出函式的實際位址!

上面說了在「正常情況」下,那麼在某些特殊情況下,這些rva指向的就不是函式位址偏移了,如果乙個匯出函式的rva在匯出表位址範圍內,那麼它就是乙個中轉輸出。

比如說,匯出表的virtualaddress等於0x3000,size等於0x200,如果匯出函式的rva落在0x3000到0x3200之間,這個匯出函式就是乙個中轉輸出。

如果匯出函式是乙個中轉輸出,那麼此時的rva指向乙個以零結尾的字串組成的dll的名稱和乙個用點分開的輸出函式的名稱,象「otherdll.exportname」這樣,或者是dll的名稱和匯出序號,象「otherdll.#19」這樣。

舉個實際的例子,kernel32.dll中的heapalloc函式就是乙個中轉輸出,該函式的rva指向的是乙個零結尾的字串「ntdll.rtlallocateheap」,這表明了該函式被呼叫或者被其它模組引用時被重定位到ntdll的rtlallocateheap函式中

,而kernel32.dll中不存在該函式的任何**,見下圖所示:

ok,有了這些基礎,我們試想以下,如果把乙個目標dll的匯出函式名稱以及以序號匯出的函式序號獲取到,然後在自己寫的某個dll中將這些資訊「複製」過來,那麼我們自己的dll檔案就有了目標dll的所有匯出函式,如果有應用程式呼叫我們的dll的匯出函式那麼都會重定向到目標dll中!

目標dll(被劫持的dll)和我們自己的dll可以在同乙個資料夾下,這樣中轉輸出的dll名要和修改後的被劫持的dll名一致!後面會舉例介紹。

(也可以劫持不在同乙個資料夾下的dll,這種情況下中轉dll名需要填寫為被劫持dll的絕對路徑,比如 c:\windows\system32\lpk),

為此,我寫了乙個小工具來輔助我們生成這樣的dll,如圖:

使用方法如下:

1、提供匯出表的dll後面我們選擇需要hijack的dll路徑

2、修改匯出表的dll後面選擇我們自己寫的dll檔案,一般來說我們製作的惡意dll只關注dllmain部分,所以我們只需要將功能**寫在dllmain處

3、中轉dll名字後面填寫需要hijack的dll名,這個地方不要加dll字尾(也可以填寫dll的絕對路徑,比如 c:\windows\system32\lpk)

4、選擇以新增節還是擴大最後乙個節的方式插入我們的中轉函式資訊

5、點選生成後寫入需要生成的dll名

這樣乙個包含中轉輸出的dll就生成了,我們將它放在需要劫持的dll的同乙個目錄下,然後將被劫持的dll改名為填寫的中轉dll名,將生成的中轉dll名改為被劫持的dll的原來的名字,這樣在應用程式顯式或者隱式呼叫被劫持dll的時候就會載入我們的dll!

我們使用兩種方法來演示如何使用該方法劫持dll!

第一種方法,劫持相同目錄下的dll檔案:

我們用qq目錄下的common.dll來做這個試驗,test.dll是我寫的乙個很簡單的dll,dllmain中建立了乙個執行緒,執行緒中彈出乙個messagebox以表示dll被劫持!

首先選擇qq\bin\common.dll和我們的test.dll,中轉輸出名填寫「bommon」

然後生成乙個common.dll的中轉dll,注意不要覆蓋了qq的原始common.dll,儲存到另外乙個地方

最後我們將qq目錄下的原始common.dll改名為何中轉輸出名一致的bommon,最後將我們生成的common.dll複製到qq\bin目錄中

可以看到,我們的hijackdll具備了和目標dll完全一樣的匯出資訊:

啟動qq,完美劫持了common.dll

第二種方法,劫持系統目錄下的dll檔案(或者說在dll搜尋路徑中的某個dll檔案):

該方法就是將中轉dll名填寫為絕對路徑,比如我們劫持msimg32.dll,提供匯出表我們選擇系統目錄下的msimg32.dll,需要修改匯出表的dll我們選擇測試的test.dll,最重要的中轉dll名字我們填寫為:c:\windows\system32\msimg32

如圖:

然後將生成的msimg32.dll放到qq\bin下,照樣完美劫持!

使用中轉函式名進行dll劫持方法的優點:

1、大家可以專心於劫持dll的功能開發,而不用去費力寫匯出函式的中轉跳轉,寫好我們的劫持dll後只需用工具就能把匯出資訊複製過來

2、對於某些被劫持的dll的匯出函式位址是乙個資料段位址的情況,該方法就不會出錯,因為我們只是將位址中轉,如果使用以前的dll劫持方法,必須要將匯出函式位址中的這個資料段內容複製過來,而複製多大的資料是乙個難點,因為我們不知道被劫持dll的這個資料段匯出位址匯出的是一系列資料(結構)還是乙個變數!稍有不慎就會出錯!

3、同目錄下的dll劫持只需要將被劫持的dll檔案改個名字,而其它目錄下的dll劫持只需要知道被劫持dll的路徑

4、如果將程式中的**用在病毒技術中,則可以實現隨機、任意、動態的dll劫持,比如惡意**可以在qq\bin目錄下隨機選擇某個dll來進行dll劫持,只需要動態將dll輸出資訊「複製」到惡意的dll中,然後將被劫持的dll改個名字即可,或者隨機從系統目錄中選擇需要劫持的dll複製到目標程式的目錄下進行劫持(也可以直接將中轉dll名設定為被劫持dll所在的路徑)!

該方法的缺點:

1、劫持其它目錄下的dll檔案需要預先知道該dll檔案的絕對路徑

附件為addexport.exe原始碼以及用於測試的test.dll檔案,addexport.rar中的**有個小bug,修改後的**上傳為:addexport_fix.rar

PE檔案結構(四) 輸出表

pe檔案結構 四 參考書 加密與解密 一般來說輸出表存在於dll中。輸出表提供了 檔案裡函式的名字跟這些函式的位址,pe裝載器通過輸出表來改動iat。image optional header中的 datadirectory 0 提供了輸出表的rva。輸出表是以乙個image export dire...

與資料庫連線,並用GridView輸出表中內容

using system using system.data using system.configuration using system.web using system.web.security using system.web.ui using system.web.ui.webcontro...

用SQLPLUS以指定格式輸出表中的資料到文字檔案

用sqlplus以指定格式輸出表中的資料到文字檔案 set term off 去掉螢幕顯示 set feed off 去掉顯示輸出的行數 set pagesize 0 不換頁 set linesize 2000 設定行的長度,保證能夠顯示輸出的所有的字段長度的和 set space off 設定輸出...