COM組件的逆向


一、前言

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的第五個參數,所以關聯起來后就可以看到實際調用的函數。

 

 

 

三、參考文章

https://www.4hou.com/reverse/15870.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM