科普_COM组件劫持原理与实践

本文介绍了COM组件的基本概念、作用以及其与注册表的关系,展示了如何使用Python创建并注册一个COM组件。接着,深入探讨了COM劫持的原理,通过示例说明了如何实现COM组件的劫持,并讨论了可能的安全风险和清除方法。最后,提出了COM劫持的思路扩展,包括潜在的攻击手段。
摘要由CSDN通过智能技术生成

0x00 前言

在术的道路上,从来都是独善其行,如能结余同行,自当求之不得。

玄幻小说的世界结构,放之现代也是同理,望成之所成,念之所念。

0x01 什么是COM

什么是COM,说白了,就是一堆功能相关的interface,它是某种语言向另一种语言暴露功能的最大单位。

COMcomponent(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。

在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。

由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。

COM的最核心的思想,说白了就是要做个跨语言的 “class” “object” “function” 。

0x02 它解决了什么问题

每一种技术的出现,都是为了解决另一个问题而诞生的。

1、代码共用问题

2、版本问题

3、调用其它软件的功能

4、所有代码均可以面向对象

从以上四点可以看出,COM技术可以说是非常强大的一门技术,而且Windows编程也是会用到该技术。

0x03 什么是CLSID

当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全球唯一:

第一种是采用和Internet地址一样的管理方式,成立一个管理机构,用户如果想开发一个COM组件的时候需要向该机构提出申请,并交一定的费用。

第二种是发明一种算法,每次都能产生一个全球唯一的COM组件标识符。

第一种方法,用户使用起来太不方便,微软采用第二种方法,并发明了一种算法,这种算法用GUID(Globally Unique Identifiers)来标识COM组件,GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。

GUID的例子: 54BF6567–1007–11D1–B0AA–444553540000

HKEY_CLASSES_ROOT\CLSID{002B9E07-2E10-438F-AF1E-40E6A96F1EE4}

在微软的COM中GUID和UUID、CLSID、IID是一回事,只不过各自代表的意义不同:

  • UUID : 代表COM

  • CLSID : 代表COM组件中的类

  • IID :代表COM组件中的接口

在程序中,实际对象数据对应的处理程序路径string往往不尽相同,比如有的放C盘有的D盘,微软想出了一个解决方案,那就是不使用直接的路径表示方法,而使用一个叫 CLSID的方式间接描述这些对象数据的处理程序路径。

CLSID 其实就是一个号码,CLSID 的结构定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct _GUID {
 DWORD Data1; // 随机数 
 WORD Data2; // 和时间相关 
 WORD Data3; // 和时间相关 
 BYTE Data4[8]; // 和网卡MAC相关 
} GUID;

typedef GUID CLSID;  // 组件ID
typedef GUID IID;    // 接口ID 
\#define REFCLSID const CLSID &

// 常见的声明和赋值方法
CLSID CLSID_Excel = {0x00024500,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
struct __declspec(uuid("00024500-0000-0000-C000-000000000046")) CLSID_Excel;
class DECLSPEC_UUID("00024500-0000-0000-C000-000000000046") CLSID_Excel;
// 注册表中的表示方法
{00024500-0000-0000-C000-000000000046}

下面,我们用python生成一个CLSID:

1
2
3
4
5
6
7
C:\Users\shiya
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值