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

posted @ 2019-05-26 22:16  QKSword  阅读(2352)  评论(0编辑  收藏  举报