1. 程式人生 > >脫殼系列(三) - 輸入表

脫殼系列(三) - 輸入表

前言:

輸入表又稱匯入地址表(Import Address Table),簡稱 IAT

API 函式被程式呼叫但執行程式碼又不在程式中,而是位於一個或者多個 DLL 中

當 PE 檔案被裝入記憶體的時候,Windows 裝載器才將 DLL 裝入,並將呼叫匯入函式的指令和函式實際所處的地址聯絡起來(動態連線),這操作就需要匯入表完成,其中匯入地址表就指示函式實際地址

程式:

執行

點選“確定”

點選“關閉”

點選“確定”,關閉程式

逆向:

用 OD 載入程式

載入後按 Alt+M,顯示記憶體視窗

雙擊“PE 檔案頭”這行

往下拉

基址為 400000,基址是可以被人為修改的

這個是輸入表的地址,相對於基址的,即為 402050

按 Alt+C 回到 CPU 視窗

按 Ctrl+G 跟隨表示式

輸入 402050,點選“OK”

這裡不能直接進行分析的,需要用到外掛 Analyze This

選擇

第三個 IMAGE_IMPORT_DESCRIPTOR 中全是 0,是結束的標準

這兩個 IMAGE_IMPORT_DESCRIPTOR 分別與 KERNEL32.dll、USER32.dll 相關聯

跟隨第一個 IMAGE_IMPORT_DESCRIPTOR 的第一行 2098

來到 USER32.dll 處

繼續往下跟隨

跟隨 402122

這裡都是 API 函式名

IMAGE_IMPORT_DESCRIPTOR 的第五行為指向輸入表(IAT)的偏移地址

跟隨 200C

這裡的第二列是函式的地址

例如:77D507EA 是 MessageBoxA 函式所在的地址

驗證一下

程式剛開始執行的時候呼叫了 MessageBoxA 函式,這裡的 4011EA 就是 MessageBoxA 函式

按回車

這裡將 jmp 到 77D507EA 執行 MessageBoxA 函式,這個地址是屬於動態連結庫的

從而驗證了 77D507EA 是 MessageBoxA 函式所在的地址