Hidden Bee惡意軟體家族的定製IDA裝載模組開發
本文源自我自己受到的啟發,也許將來有人會從原始碼中獲益。
在閱讀hasherezade的關於Hidden Bee惡意程式家族的定製檔案格式(本文示例)的研究時,我突然想到這個用例似乎特別適合於IDA的定製裝載模組。IDA裝載模組方法與前一種方法相比有一些優點:它是完全自動化的,不需要額外的程式、外掛或指令碼;這些匯入具有專有名稱和型別資訊,允許IDA的普通P.I.T.演算法傳播這些資訊;使用者可以將資料庫重新定位到任意的基本地址。
考慮到定製裝載是我尚未編寫的IDA外掛的唯一變體,這似乎是一個不錯的小範圍專案。對於該專案,我的一個非常小的貢獻是Hidden Bee格式的IDA定製裝載,在我的GitHub上可以找到該裝載。IDAPython程式碼要求安裝Ero Carrera的pefile模組,比如通過pip。
Hidden Bee
簡而言之,Hidden Bee惡意程式家族以定製的檔案格式傳播有效負載,該檔案格式是PE檔案格式的簡化版本。hasherezade的文章中包含了所有細節。並沒有對該專案做原始的惡意軟體分析;我只是讀了她的部落格文章,想到了如何將細節轉換成一個裝載外掛,然後根據hasherezade提供的示例連結對其進行除錯。和往常一樣,Chris Eagle的IDA Pro Book第二版很有用。關於裝載API的一些細節在IDA 7.x AP中已經更改。x API埠,但是Hex-Rays的移植指南提供了資訊,並且IDA 7.1 SDK中的裝載示例也被移植到最新的API。
簡單介紹一下IDA裝載模組
1. IDA裝載模組只是一個具有良好定義介面的IDA外掛。當將任意檔案載入到IDA中時,都將呼叫IDA裝載模組。他們有兩項主要責任:
允許訪問檔案位元組,確定該檔案是否為裝載模組能夠處理的格式。為此,每個IDA裝載模組都必須匯出一個名為accept_file的函式。如果無法識別檔案格式,該函式返回0;如果可以識別,則返回非零值。
2. 如果檔案型別模組可以載入,並且使用者選擇使用這個模組載入檔案,執行實際的載入過程,如使用IDB建立片段、從檔案中複製位元組到片段、處理重定位、解析匯入、新增entrypoints,等等。為此,每個IDA裝載模組必須匯出一個名為load_file的函式。
這兩個函式都將“linput_t *”物件作為輸入,該物件的行為類似於C FILE *物件,它支援查詢指定位置、從檔案中讀取位元組陣列等等。由於Hidden Bee的格式包括重定位,我選擇實現第三個可選的IDA loader模組函式:move_segm。當用戶請求將資料庫重新定位到另一個地址時,IDA核心將呼叫此函式。
為Hidden Bee寫一個載入模組
在閱讀了前面的文章後,我發現在IDA中載入Hidden Bee影象的唯一困難是: A)Hidden Bee定製頭通過雜湊而不是名稱指定API匯入; B)它包含重定位資訊。從概念上講,通過雜湊進行重新定位和匯入查詢非常簡單,但是關於如何更好的將它們與IDA結合的詳細資訊並不清楚。遺憾的是,在閱讀了SDK中的裝載模組示例後,我對這些任務沒有信心。在該專案上80%的時間花在了逆向工程%IDADIR%\loaders\pe.dll上——PE檔案格式的裝載模組——特別關注它對重定位和匯入的處理。
匯入
為了通過hash處理匯入,hasherezade的工具鏈最終會生成一個文字檔案,其中包含匯入雜湊名稱的地址及其對應的明文API字串。然後,她使用另一個外掛在匯入雜湊DWORD的地址上建立重複的註釋。與之相反,我想讓IDA以與普通二進位制檔案相同的方式顯示匯入資訊,即我希望IDA在每個匯入上設定正確的型別簽名。我想這可能有點困難,但幾小時後逆向工程pe_import_visitor_t類(部分記錄在%IDASDK%\ldr\pe\common.hpp)的虛擬函式,證明你所要做的觸發此功能只是DWORD的名稱設定為從型別庫載入的東西。
下面的截圖顯示IDA成功地將型別資訊應用於API:
重定位
對於PE檔案中常見的IMAGE_REL_BASED_HIGHLOW重定位來說,每個重定位最終都可以通過將重定位資訊直接轉換到IDA的fixup_data_t資料結構中進行處理,然後將它們傳遞給set_fixup API。SDK示例並沒有提供如何正確處理PE IMAGE_REL_BASED_HIGHLOW重定位的直接概念,因此我逆向工程了PE.dll來精確的計算出重定位需要發生什麼。(幸運的是,由於其SDK的可用性,逆向工程IDA可做可不做。)如果願意,可以在do_reloc函式中看到結果。不要讓我解釋它為什麼有效;事實證明它確實工作。
下面是將資料庫從基地址0x0到基地址0x12340000的前後對比。特別注意,紅色下劃線的位元組發生了變化。之前:
之後: