COM 对象逆向

admin 2025年2月13日13:46:11评论7 views字数 2036阅读6分47秒阅读模式

免责声明

锦鲤安全的技术文章仅供参考,此文所提供的信息仅供网络安全人员学习和参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。如有侵权烦请告知,我们会立即删除并致歉。本文所提供的工具仅用于学习,禁止用于其他,请在24小时内删除工具文件!谢谢!

一、概念

CLSID:用于表示 COM 类对象。它代表了 COM 组件的实际实现类

IID:用于标识 COM 接口。

ProgID: 用于表示 COM 类的友好名称,可以理解为人类可读的名称,而CLSID是程序使用。

AppID:用于指定 COM 应用程序的身份,它在 COM 的服务器进程中通常有用。

MTX:表示 COM 对象的名字或标识符,用于分布式环境,用于标识对象的位置。

在一般逆向中最常用的就是 CLSID 和 IID,相当于代表类和方法。

二、COM逆向技巧

3.1 手动还原符号

3.1.1 常用接口逆向

样本:45EF985BD2BD4666C6FF9B7AB8DA4598935C2A66AC0DC758020E97423036B0E0

从导入表中找到 CoCreateInstance 函数,使用X交叉引用找到调用的地方后,没有插件的情况下,获取的接口都是没有类型的,所以后续逆向就有很大的阻力。比如我们无法知道后续的 ppv+36 调用的是类中的哪个函数?到底是执行什么能?

COM 对象逆向

在手动逆向中我们都要使用一个工具:COMView(https://www.japheth.de/Download/COMView.zip)或者 OleView(https://github.com/tyranid/oleviewdotnet/releases/tag/v1.11)。

下面我们都使用 COMView:

COM 对象逆向

运行软件后,我们可以获取所有的接口。

第一种方式:通过 IID 来直接寻找接口

通过 IDA 不难得出 IID 为:D8F015C0-C278-11CE-A49E44455354000

COM 对象逆向
点击 interface,直接输入 IID 进行搜索。
COM 对象逆向
直接可以得到这个接口为:IShellDispatch
COM 对象逆向
然后按 Y,修改 ppv 的类型为 IShellDispatch*,即可得出:
COM 对象逆向

3.1.2 偏僻接口逆向(通用办法)

样本:83e62221df7ba94f18fc9b63fec82285d8694c0c0a2542c0196752dc81524a10

与上述一致,原始如下:

COM 对象逆向

先通过直接 IID 直接查找:

IID 为:

IID1:56A86895-0AD4-11CE-B03A0020AF0BA770

IID2:56A868A9-0AD4-11C3-B03A0020AF0BA770

COM 对象逆向
COM 对象逆向

这次有点出乎意料,什么也可以找到?难道系统不支持这个接口?这次我们换个思路,按照 CLSID 进行查找。

CLSID如下:

CLSID1:E436EBB3-524F-11CE-9F530020AF0BA770

CLSID2:D76E2820-1563-11CF-AC9800AA004C0F9

COM 对象逆向
这次可以找到:
COM 对象逆向
COM 对象逆向

这里只能说明我们调用的 COM 组件的类为:Filter Graph、AVI Compressor,具体的还需要进一步查找。其实我们右键,可以查找到这种 COM 组件没有导出的型库(typelib),所以没有不能直接通过 IID 找到。

COM 对象逆向

Typelib 是什么呢?其实就是 com 组件类的组合,统一放在一起。

这种没有 typelib 的,都需要在原始 DLL 中寻找接口。所以我们找到 Filter Graph

AVI Compressor 分别对应的 DLL 为:quartz.dll、qcap.dll。现在只需要 IDA 分别载这两个 DLL ,去搜索相应的接口即可。

IID1:56A86895-0AD4-11CE-B03A0020AF0BA770为, IBaseFilter

COM 对象逆向
IID2:56A868A9-0AD4-11C3-B03A0020AF0BA770为, IGraphBuilder
COM 对象逆向
最终重新定义类型后,效果如下:
COM 对象逆向

3.2 插件

3.2.1 插件原理讲解

原理为通过遍历 COM 相关的注册表,解析相关 DLL,获取函数和 IID 的关系。

后在 IDA 中获取 CoCreateInstance 的所有引用找到所有的 IID,与其进行对比输出。

COM 对象逆向
COM 对象逆向

3.2.2 常用插件使用

https://github.com/airbus-cert/comida:

按照插件后直接运行,可以直接找到。

COM 对象逆向
COM 对象逆向

彩蛋:

83e62221df7ba94f18fc9b63fec82285d8694c0c0a2542c0196752dc81524a10

部分同学可能会发现,自己尝试的时候,恢复不了这样的形式,这是为什么呢?

其实 IDA 反编译的锅!

COM 对象逆向

我们查看一下不同版本 IDA 的反编译结果:

IDA6.8:

COM 对象逆向
IDA7.7:
COM 对象逆向
IDA9.0:
COM 对象逆向

貌似从 IDA7.x 以后 IDA 对于这块代码反编译解释出现了问题,可能是因为变量重播的问题。修复办法:先 U,再 P,重新分析一下即可。

原文始发于微信公众号(锦鲤安全):COM 对象逆向

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月13日13:46:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   COM 对象逆向https://cn-sec.com/archives/3736009.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息