一、前言
com組件可能屬於相對冷門的東西,但是通過com卻可以實現很多API可以實現的功能
。當病毒使用com來實現某些惡意功能時,由於com與平常API實現的方式不相同,可能會出現在沙箱中監控不到惡意行為的情況。而如果沒有接觸過com,在逆向分析時也會存在不少困惑。
二、正文
- com組件初始化部分
在使用com之前需要進行初始化工作。無論是正常com編程或是惡意軟件中都需要調用CoInitializeEx進行初始化工作。
- COM的對象和接口
初始化了com組件后,使用函數CoCreateInstance來調用對象和接口。這里有幾個比較重要的參數,其中第一個參數使用CLSID指定了對象,第四個參數使用IID指定了接口,最后一個參數為獲得的接口指針。CLSID和IID都是標識COM的GUID,所以通過查找對應的GUID就可以找到使用了什么對象和接口。
GUID的結構體如圖,格式為xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。IDA識別出clsid則直接顯示,如果沒有識別則需要自己添加和關聯結構體。
如果clsid是動態解密生成的,則需要自己在調試器的數據窗口中查看。如圖下一個例子,數據窗口中為小端序,根據前面結構體可以得出下面的clsid為4590F811-1D3A-11D0-891F-00AA004B2E24
- 根據clsid值和IID值查找對應的對象和接口
獲取到clsid或IID后,就要找到對應的對象和接口,這里有3種方法,在多數情況下,需要同時使用這幾種方法才可以找到對應的對象和接口。
1、注冊表項查找:其中clsid在注冊表HKEY_CLASSES_ROOT\CLSID下,IID在HKEY_CLASSES_ROOT\Interface或HKLM\Software\Classes\Interface下。
2.OleView:OleView是讀取注冊表里的clsid和iid相關內容並顯示出來,這里查找和查看相對方便一點,不過需要系統配有.net環境。下載地址:https://github.com/tyranid/oleviewdotnet。
3.谷歌:如果前面都找不到就只能Google查找,直接輸入GUID來查找對應的對象或接口
- 接口的成員函數
前面說了這么多,最主要的還是確定使用了那個接口,然后根據接口來確定調用的成員函數,找到成員函數后可以查找對應的文檔來查看具體功能的實現。如果在用OD分析com組件時,會發現看不到調用了那個函數的情況,這是由於這里call的只是一個虛函數表的地址,所以在分析com組件時一般需要ida進行輔助分析。
由於我們前面確定了使用的接口,所以可以通過導入接口成員函數的結構體來識別出調用的函數,這里測試例子中的接口為IWbemLocator,所以首先在structure窗口中獲取這個接口的結構體。其中Vtbl是虛函數表的意思,這個就是我們的要導入的結構體
導入結構體后就可以把接口指針和結構體關聯起來,接口指針是CoCreateInstance的第五個參數,所以關聯起來后就可以看到實際調用的函數。