全文目录
COM对象与接口
找到com组件对应的二进制
IDA逆向修改COM对象实战
再开始之前请先简单阅读下面机翻的官方概念
微软组件对象模型(COM)定义了一种二进制互操作性标准,用于创建可在运行时交互的可重用软件库。您可以使用 COM 库,而无需将其编译到应用程序中。COM 是 Windows Media Player 和 Windows Server 等许多微软产品和技术的基础。
有问题联系作者
建议你关注下,毕竟全网技术栈最全公众号,总有涉及到你的领域。
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
也可以直接从HKEY_CLASSES_ROOT下找,两者本质一样。只不过
HKEY_CLASSES_ROOT是从HKEY_LOCAL_MACHINESOFTWAREClasses映射过来的
比如我们想要找到WScript.Shell的CLSID
然后通过CLSID定位对应的Dll位置,首先拷贝CLSID
进入注册表HKEY_CLASSES_ROOTCLSID,可以看到大量的CLSID表键,用来标记
输入HKEY_CLASSES_ROOTCLSID{72C24DD5-D70A-438B-8A42-98424B88AFB8}定位到对应的COM组件。
接下来查看InProcServer32该字段基本是一个提供导出功能的DLL
我们也可以查看TypeLib字段,该字段同样是用一个GUID标记{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B},它记录再HKEY_CLASSES_ROOTTypeLib键值下(该键值可选,不是必须的)
查看HKEY_CLASSES_ROOTTypeLib{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B},可以看到默认使用的DLL位置
原文始发于微信公众号(安全狗的自我修养):让逆向更接近源码——IDA修改COM对象指针技巧(逆向实战1)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论