在前一篇當中我們提到了 Windows 中常見的 PE 檔包括 可執行檔(Executable file)與 動態連結函式庫(Dynamic link library),如今最常見的病毒非 Windows 的 PE病毒莫屬了,當在這些病毒運作中需要執行某些功能時,比方說複製自己、搜尋並感染文件或連結上網等等,都會調用到 Windows 中的 API 函式,所謂的 API(application programming interface)也就是應用程式介面,主要是提供使用者能透過程式告知電腦所要進行的動作,這些 APIs 都存在於動態連結函式庫在(.dll)中,接下來讓我們來挖掘這些函式資料庫的內容吧!
在Windows底下其實已經存在著不少 dll 檔在 Windows\System32 路徑底下(預設路徑為 C:\Windows\System32\
),如下圖所示。
讓我們用 Windows 中的基本配備-Notepad 來做個範例,我們可以透過反編譯軟體(Disassembly software)-Hiew 來看一下 Notepad 在使用上會用到哪些 API。
Import table
首先我們可以從 PE structure 中找到 import table RVA 在於 PE + 0x80 的位址 (下圖紅框框處),可以得知 Import table RVA = 0x07604
。
如前一篇我們所介紹的 RVA(Relative Virtual Address)即是相對虛擬位址,就是相對於 ImageBase 的位址,ImageBase 同樣能從 PE structure 中找到是在 PE + 0x34 的位址(上圖綠框框處),是 0x01000000
,RVA + ImageBase = VA(Virtual Address),當軟體在執行時會將檔案從硬碟映射至記憶體當中,VA 即是在記憶體中的絕對位址。
因此在找到 Notepad 的 import table RVA 後,將 RVA 與 ImageBase 相加可以得到 Import table 的 VA 為 0x01051AFC
,接著我們可以按 F5,並輸入"."+ VA 位址,即可移動至 Import table 的位址,Import table 的結構如下:
常用到的像是 Import descriptor + 偏移值 0x0 的位址存放著一個 Array,包含了調用 API 的名稱偏移值,而在 0xC 的位址存放此 Import descriptor 對應到的 DLL 檔名稱的位址,而最底下的 First thunk 將會在執行檔案時,系統自動載入調用 API 的位址到此。
從 Import table 格式中我們可以得到一切調用 API 的資訊,且 Import descriptor 數量可以一個以上,依據調用的 DLL 檔案個數而定,調用一個 DLL 檔會有一個 Import descriptor,讓我們拿第一個 Import descriptor 裡的第一個 API 來對照(API 順序不代表其使用順序):
這時我們就可以得知 Notepad 的第一個 Import descriptor 第一個調用的 API 是 PageSetupDlgW
,所在的 DLL 檔名為 comdlg32.dll
,但其實以上 Import table 找 API 及 其 DLL 的步驟只需要在 Hiew 中按 F8 → F7 就會以清單方式顯示出來(如下圖),為了讓各位能夠了解 Import table 怎麼來的,因此我們針對 Import table 做逐步解析。
接著我們能到System32路徑底下找到 comdlg32.dll
的DLL檔,
Export table
一樣使用 Hiew 來解析一下這個DLL檔案,可以從 PE structure 找到 Export table RVA 是在 PE + 0x78 的位址,
Export table 放置的即是提供調用 API 的端點,格式如下:
像例子中 Notepad 將用到 PageSetupDlgW
這個API,則我們可以用 Hiew 觀察 DLL 檔的 Export table,並找到這 API 的端口位址,當然 Hiew 這麼方便,肯定有個快捷鍵可以使用,點選 F8 → F9 即可看到所有提供調用的 API 以及位址皆以清單方式顯示出來,
我們可以找到 PageSetupDlgW
的端口位址在 0x763448D6
,順著這位置跳過去即可到達 API 執行代碼。
幾乎所有的 PE 病毒都會調用到 API,只是用到的 API 會隨著病毒行為而有所不同,所有 API 都可以從 Microsoft 的 MSDN 中搜尋其功能。
在本篇中我們用到一些些 Hiew 的功能,工具的強大必須透過對將分析的物件夠了解,接下來即將進入到核心部分囉。
希望有興趣的讀者也能夠點個追蹤,有任何問題或有想多了解的地方也可以回覆在文章底下唷,謝謝你們XDDDD!
參考來源:
MSDN-peering inside the PE https://msdn.microsoft.com/en-us/library/ms809762.aspx
維基百科 https://zh.wikipedia.org/wiki/Portable_Executable