恶意软件经常会使用COM机制来实现恶意逻辑,因此对COM机制的理解与分析是比较重要的,有利于对恶意软件深度分析,参考链接中提供的材料会比较详细可配合学习,这里仅是记录之前逆向恶意文件时一个手工还原的过程。
COM到底是什么?
根据微软的说法,“微软组件对象模型(COM)是一个独立于平台、分布式、面向对象的系统,用于创建二进制软件组件。” 综上所述,COM允许程序通过COM对象进行交互。这种交互可以发生在“单个进程内、其他进程中,甚至可以在远程计算机上”,而编写程序的语言并不重要,只要它能够创建指针结构和通过这些指针调用函数就能与COM兼容,这意味着像Visual Basic和Java这样的语言也可以使用COM技术。
由于技术的进步,COM不再被频繁使用,因此当分析人员遇到使用这种不熟悉的通信方法的恶意软件时,可能很难确定发生了什么以及如何发生的,当然静态分析也更加复杂。
如何利用IDA对其静态分析?
一旦在静态分析中遇到CoInitializeEx的调用,表明此函数将初始化COM库,以便调用的线程可以利用它的函数。一旦我们发现它正在初始化COM库,就可以搜索对CoCreateInstance的调用,因为这会产生与特定CLSID关联的类的未初始化对象。
如下发现了CoCreateInstance的调用,可以找到&rclsid的值。
利用&rclsid(CLSID)值通过SDK的头文件找到对应的接口类名称(例如安装了SDK后本地路径为C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\um\Bits.h),如下。
在IDA中打开结构体窗口(shift+F9),增加结构体,搜索是否存在标准结构体,本例搜索的是IBackgroundCopyManagerVtbl,如下已存在标准结构体。
标准结构体添加完成,接下来应用结构体。
选中对应的变量值右键选择Convert to struct *来转换为结构体变量,如下。
选中之前导入的标准结构体,如下。
第一步应用完成如下,&ppv变量后续将以结构体内成员的方式展示。
继续应用标准结构体,最终静态分析结果如下。
由于这种通用的过程一般都会存在功能化插件实现来避免手工重复执行,但是唯一比较不足的是使用IDA自带的插件COM Helper会失败,只能迂回去在IDA安装目录下的cfg/clsid.cfg文件搜索GUID找到对应的接口类名称,然后增加标准类结构体。如果正在调试此恶意文件,这些COM调用函数将显示为ObjectStublessClient,有时将不得不依赖动态调试时传递给函数的值来确定该函数在做什么。一旦我们完全恢复了大部分函数调用名称,可以了解正在发生的事情。目前COM功能的使用在恶意软件作者中似乎很受欢迎,这可能是因为它通常不会被多个反恶意软件程序检测到。
参考材料
2019-02-02_bits_in_c
http://tmp2.dreamhosters.com/scc_compile_bits.html
Analyzing COMmunication in Malware | 0ffset Training Solutions
https://www.0ffset.net/reverse-engineering/analyzing-com-mechanisms-in-malware/
Igor’s tip of the week #93: COM reverse engineering and COM Helper – Hex Rays
https://hex-rays.com/blog/igors-tip-of-the-week-93-com-reverse-engineering-and-com-helper/