COM组件的逆向
Posted qksword
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于COM组件的逆向的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )(代
Android 逆向启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )
Android 逆向类加载器 ClassLoader ( 加载 Android 组件的类加载器 | 双亲委派机制实例分析 )
Android 逆向启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )