COM组件的逆向
一、前言
com組件可能屬于相對冷門的東西,但是通過com卻可以實(shí)現(xiàn)很多API可以實(shí)現(xiàn)的功能
。當(dāng)病毒使用com來實(shí)現(xiàn)某些惡意功能時(shí),由于com與平常API實(shí)現(xiàn)的方式不相同,可能會出現(xiàn)在沙箱中監(jiān)控不到惡意行為的情況。而如果沒有接觸過com,在逆向分析時(shí)也會存在不少困惑。
二、正文
com組件初始化部分
在使用com之前需要進(jìn)行初始化工作。無論是正常com編程或是惡意軟件中都需要調(diào)用CoInitializeEx進(jìn)行初始化工作。
COM的對象和接口
初始化了com組件后,使用函數(shù)CoCreateInstance來調(diào)用對象和接口。這里有幾個(gè)比較重要的參數(shù),其中第一個(gè)參數(shù)使用CLSID指定了對象,第四個(gè)參數(shù)使用IID指定了接口,最后一個(gè)參數(shù)為獲得的接口指針。CLSID和IID都是標(biāo)識COM的GUID,所以通過查找對應(yīng)的GUID就可以找到使用了什么對象和接口。
GUID的結(jié)構(gòu)體如圖,格式為xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。IDA識別出clsid則直接顯示,如果沒有識別則需要自己添加和關(guān)聯(lián)結(jié)構(gòu)體。
如果clsid是動(dòng)態(tài)解密生成的,則需要自己在調(diào)試器的數(shù)據(jù)窗口中查看。如圖下一個(gè)例子,數(shù)據(jù)窗口中為小端序,根據(jù)前面結(jié)構(gòu)體可以得出下面的clsid為4590F811-1D3A-11D0-891F-00AA004B2E24
根據(jù)clsid值和IID值查找對應(yīng)的對象和接口
獲取到clsid或IID后,就要找到對應(yīng)的對象和接口,這里有3種方法,在多數(shù)情況下,需要同時(shí)使用這幾種方法才可以找到對應(yīng)的對象和接口。
1、注冊表項(xiàng)查找:其中clsid在注冊表HKEY_CLASSES_ROOTCLSID下,IID在HKEY_CLASSES_ROOTInterface或HKLMSoftwareClassesInterface下。
2.OleView:OleView是讀取注冊表里的clsid和iid相關(guān)內(nèi)容并顯示出來,這里查找和查看相對方便一點(diǎn),不過需要系統(tǒng)配有.net環(huán)境。下載地址:https://github.com/tyranid/oleviewdotnet。
3.谷歌:如果前面都找不到就只能Google查找,直接輸入GUID來查找對應(yīng)的對象或接口
接口的成員函數(shù)
前面說了這么多,最主要的還是確定使用了那個(gè)接口,然后根據(jù)接口來確定調(diào)用的成員函數(shù),找到成員函數(shù)后可以查找對應(yīng)的文檔來查看具體功能的實(shí)現(xiàn)。如果在用OD分析com組件時(shí),會發(fā)現(xiàn)看不到調(diào)用了那個(gè)函數(shù)的情況,這是由于這里call的只是一個(gè)虛函數(shù)表的地址,所以在分析com組件時(shí)一般需要ida進(jìn)行輔助分析。
由于我們前面確定了使用的接口,所以可以通過導(dǎo)入接口成員函數(shù)的結(jié)構(gòu)體來識別出調(diào)用的函數(shù),這里測試?yán)又械慕涌跒镮WbemLocator,所以首先在structure窗口中獲取這個(gè)接口的結(jié)構(gòu)體。其中Vtbl是虛函數(shù)表的意思,這個(gè)就是我們的要導(dǎo)入的結(jié)構(gòu)體
導(dǎo)入結(jié)構(gòu)體后就可以把接口指針和結(jié)構(gòu)體關(guān)聯(lián)起來,接口指針是CoCreateInstance的第五個(gè)參數(shù),所以關(guān)聯(lián)起來后就可以看到實(shí)際調(diào)用的函數(shù)。
三、參考文章
https://www.4hou.com/reverse/15870.html
總結(jié)
- 上一篇: python如何运用ols_使用OLS回
- 下一篇: 通知实战 设置通知图片(iOS10以后的