com对象

发觉硬啃不太动,还是从com对象学起

com对象简介

COM对象是遵循COM规范编写、以Win32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行二进制代码,能够满足对组件架构的所有需求。——-百度百科

com组件无关编程语言,通过提供接口来进行调用,如下是用python实现的com组件,通过第三方库注册com组件

import win32com.server.register

import pythoncom

class PythonUtilities:
    _public_methods_ = [ 'SplitString' ]
    _reg_progid_ = "PythonDemos.Utilities"
    # NEVER copy the following ID pythoncom.CreateGuid()
    
    _reg_clsid_ = "{F191DE06-CD12-4D8E-A7DA-3A0088765B63}"


    def SplitString(self, val, val2):
        if val == val2:
            return True
        else :
            return False
 
# Add code so that when this script is run by
# Python.exe, it self-registers.
if __name__=='__main__':
    print("Registering COM server")

    win32com.server.register.UseCommandLine(PythonUtilities)

如上代码实现了一个函数判断两个值是否相等,第三方库实际实现的似乎是将python代码编译成了dll文件,再进行com组件的注册,代码中的clsid是世界唯一的,由微软算法根据时间计算机参数等等所得。运行注册后我们就可以通过clsid调用自己写的com组件了

com组件的调用方式也多种多样

  1. 直接调用com组件的dll文件

字面意,像是c#则直接dllimport引入dll文件

  1. 通过clsid调用

clsid存在注册表中,由于clsid的唯一性我们可以通过clsid来调用com组件

  1. 通过应用名调用

如上文python组件名为PythonDemos.Utilities

不同语言有自己的实现方法。

利用com

windows自1993年引入com后就一直在使用,所以其内部也带有不少可以调用的com组件,我们熟悉的windows下载方式有certutil,bitsadmin,powershell调用System.Net.WebClient程序集等等。其实com组件中也存在不少可以用于下载的组件,且由于实现方法不同,不会触发对之前那些下载手段的检测。

如F5078F35-C551-11D3-89B9-0000F81FE221,提供了下载方法

又比如0F87369F-A4E5-4CFC-BD3E-73E6154572DD,实现了windows的任务控制,即和windows7中的at指令和windows10中的schtasks相类似,我们则可以用这个com组件代替schtasks命令执行计划任务。

总之windows10中有上万个com组件,其中肯定还有可以利用的点,缺少的则是善于发现的眼睛

一点思考

师傅们可能知道可以通过修改文件夹名加clsid即.{xxx-xxx-xxx}的方式,可以快速创建回收站等,且这个文件夹可以被压缩到压缩包里。

除了可以隐藏一些文件以外,这是否也是一个调用com的过程?如果是,理论上应该可以注册恶意dll到com组件,然后通过点击文件夹这种方式调用执行(注册到注册表不需要管理员权限

另外也找到一个com组件在用这种方式打开时会导致windows文件管理器报错

似乎和windows dlan这个组件有关,不止是点击打开,搜索甚至浏览到上层目录或上上层目录都会导致explorer.exe崩溃,这也说明explorer.exe应该和com组件有所互动。研究中,有点啃不动(找不到任何资料…

dcom

dcom即远程调用com组件,涉及到rpc协议,主要的过程是