让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

admin 2023年10月20日02:21:12评论28 views字数 2076阅读6分55秒阅读模式


全文目录

COM对象与接口

找到com组件对应的二进制

IDA逆向修改COM对象实战

开始之前请先简单阅读下面机翻的官方概念

微软组件对象模型(COM)定义了一种二进制互操作性标准,用于创建可在运行时交互的可重用软件库。您可以使用 COM 库,而无需将其编译到应用程序中。COM 是 Windows Media Player 和 Windows Server 等许多微软产品和技术的基础。

有问题联系作者


让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

 

建议你关注下,毕竟全网技术栈最全公众号,总有涉及到你的领域。 

让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)


COM 定义了一种二进制标准,适用于许多操作系统和硬件平台。对于网络计算,COM 定义了一种标准的导线格式和协议,用于在不同硬件平台上运行的对象之间进行交互。COM 与实现语言无关,这意味着您可以使用不同的编程语言(如 C++ 和 .NET Framework 中的编程语言)创建 COM 库。

COM 规范提供了实现跨平台软件重用的所有基本概念:

组件间函数调用的二进制标准。

将函数强类型分组为接口的规定。

提供多态性、特征发现和对象生命周期跟踪的基础接口。

唯一标识组件及其接口的机制。

可从部署中创建组件实例的组件加载器。

COM 有许多共同作用的部分,可以创建由可重用组件构建的应用程序:

提供符合 COM 规范的运行时环境的主机系统。

定义功能契约的接口和实现接口的组件。

为系统提供组件的服务器,以及使用组件所提供功能的客户端。

跟踪组件在本地和远程主机上部署位置的注册表。

服务控制管理器,用于定位本地和远程主机上的组件,并连接服务器和客户端。

结构化存储协议,定义如何浏览主机文件系统上的文件内容。

实现跨主机和平台的代码重用是 COM 的核心。可重复使用的接口实现被命名为组件、组件对象或 COM 对象。一个组件实现一个或多个 COM 接口。

您可以通过设计库实现的接口来定义自定义 COM 库。库的用户可以发现并使用库的功能,而无需了解库的部署和实现细节。

COM对象与接口

COM 对象通过接口公开其功能,接口是成员函数的集合。COM 接口定义了组件的预期行为和责任,并指定了一个强类型合约,提供了一小套相关操作。COM 组件之间的所有通信都是通过接口进行的,组件提供的所有服务都是通过接口公开的。调用者只能访问接口的成员函数。内部状态除非在接口中公开,否则调用者无法访问。

接口是强类型的。每个接口都有自己唯一的接口标识符(名为 IID),这样就避免了人类可读名称可能出现的碰撞。IID 是全球唯一标识符(GUID),与开放软件基金会(OSF)分布式计算环境(DCE)定义的全球唯一标识符(UUID)相同。创建新界面时,必须为该界面创建一个新的标识符。当调用者使用接口时,必须使用唯一标识符。这种显式标识符消除了会导致运行失败的命名冲突,从而提高了健壮性。

定义新接口时,可以使用接口定义语言(IDL)创建接口定义。根据该接口定义,微软 IDL 编译器会生成头文件供使用该接口的应用程序使用,并生成处理远程过程调用的源代码。微软提供的 IDL 基于 DCE IDL 的简单扩展,DCE IDL 是基于远程过程调用(RPC)的分布式计算的行业标准。IDL 是一种方便界面设计人员使用的工具,对于 COM 的互操作性并不重要。有了 IDL,就不必为每个编程环境手动创建头文件。更多信息,请参阅定义 COM 接口。

白话:

说白了COM组件就是由C++或.NET等非固定语言实现的二进制程序。每个COM组件都有自己的CLSID来对应自己二进制文件本身,RIID对应COM组件提供给用户端调用的功能接口。CLSID和RIID的字符各式都是GUID保证自己的唯一性。

哪里可以找到com组件对应的二进制

我们可以通过注册表找到对应的com组件类的CLSID

HKEY_LOCAL_MACHINESOFTWAREClasses

让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

也可以直接从HKEY_CLASSES_ROOT下找,两者本质一样。只不过

HKEY_CLASSES_ROOT是从HKEY_LOCAL_MACHINESOFTWAREClasses映射过来的

让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

比如我们想要找到WScript.Shell的CLSID

让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

然后通过CLSID定位对应的Dll位置,首先拷贝CLSID

让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

进入注册表HKEY_CLASSES_ROOTCLSID,可以看到大量的CLSID表键,用来标记


让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

输入HKEY_CLASSES_ROOTCLSID{72C24DD5-D70A-438B-8A42-98424B88AFB8}定位到对应的COM组件。

让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

接下来查看InProcServer32该字段基本是一个提供导出功能的DLL

让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

我们也可以查看TypeLib字段,该字段同样是用一个GUID标记{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B},它记录再HKEY_CLASSES_ROOTTypeLib键值下(该键值可选,不是必须的)

让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

查看HKEY_CLASSES_ROOTTypeLib{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B},可以看到默认使用的DLL位置

原文始发于微信公众号(安全狗的自我修养):让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月20日02:21:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)http://cn-sec.com/archives/2125026.html

发表评论

匿名网友 填写信息