簡單COM惡意組件分析
什麼是COM組件
COM組件是微軟的一個接口標註,全稱是組件對象模型(Component Obejct Model),它可以使不同的軟件組件在不知道其他組件代碼的接口規範時,進行相互間的調用。COM可以支持任何編程語言,因此被設計成了一個可複用的軟件組件。
COM組件的基本分析
每個程序在調用COM組件之前,都需要進行一系列的初始化工作,常用的函數包括了
OleInitialize
或者CoInitializeEx
函數進行一個組件的初始化,之後才能對響應的COM組件使用。
在分析一個COM組件的樣本的時候,需要清楚每個COM組件初始化的一些參數,需要關注的是
CLSID
:類型標識符
IID
接口標識符
COM通過上述兩個標識來訪問相關的組件。
當一個程序調用了CoCreateInstance
函數式,操作系統會使用註冊表中的註冊信息來判斷請求中的riid
和rclsid
這兩個字段的值,通常會查詢如下註冊表
HKLM\SOFTWARE\Classes\CLSID
HKCU\SOFTWARE\Classes\CLSID
來進行查找要使用的COM服務器的信息。
如果COM組件是一個應用程序則CLSID一個LocalService
,如果COM組價你被安裝爲了一個DLL用來被程序加載,則對應的CLSID是一個InprocServer32
的鍵。
例如Windows的組側表下有如下信息
\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Classes\AppID\{278A87E1-1BC2-4E19-82E9-8BBE31D67D20}
那麼COM組件通過這個278A87E1-1BC2-4E19-82E9-8BBE31D67D20
就能訪問到相關的組件,每個COM組件被註冊爲了一個LocalService
的形式,如下
簡單的樣本分析
樣本是來自《惡意分析》中的Lab07-02實驗,hash值爲
BDF941DEFBC52B03DE3485A5EB1C97E64F5AC0F54325E8CB668C994D3D8C9C90
查看樣本的信息得知,編譯時間爲2010/12/19
並且程序使用VC++6.0編寫,並沒有加殼
查看導入表信息,發現了OleInitialize CoCreateInstance
函數,如下
推斷程序會調用相關的COM組件使用。使用IDA打開後,程序來到main
函數,程序首先調用OleInitialize
函數進行了初始化COM組件,接着調用了CoCreateInstance
函數創建了一個實例對象,
其中的ripid
和rclsid
分別是
## 整理後
riid:D30C1661-CDAF-11D0-8A3E-00C04FC9E26E
clsid:0002DF01-0000-0000-C000-000000000046
根據對應的riid rclsid
值可以知道,riid表示的IWebBrowser2
的接口,而rclsid
的值指向了Internet Explorer
,這裏要使用的是瀏覽器的COM組件信息,接着設置網絡請求的地址URL
"UTF-16LE", 'http://www.malwareanalysisbook.com/ad.html',0
最後調用了Navigate
函數訪問了指定的url地址。如下
對應的僞C程序
總結
在分析一個調用COM組件的樣本時,可以先定位到初始化函數的調用,接着查看對應的riid和rclsid
的值確定程序要調用COM組件的服務和要執行的功能,有時候在確定了彙編層的調用後,可以在僞代碼之間設置先關的結構對象來明確程序的調用函數,例如這裏的Navigate
函數,當設置了ppv
的指針爲IWebBrowser2
結構之後,就能看到這裏調用了Navigate
函數。