一、前言
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_ROOTCLSID下,IID在HKEY_CLASSES_ROOTInterface或HKLMSoftwareClassesInterface下。
2.OleView:OleView是读取注册表里的clsid和iid相关内容并显示出来,这里查找和查看相对方便一点,不过需要系统配有.net环境。下载地址:https://github.com/tyranid/oleviewdotnet。
3.谷歌:如果前面都找不到就只能Google查找,直接输入GUID来查找对应的对象或接口
接口的成员函数