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
谦谦君子,卑以自牧