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组件的调用方式也多种多样
- 直接调用com组件的dll文件
字面意,像是c#则直接dllimport引入dll文件
- 通过clsid调用
clsid存在注册表中,由于clsid的唯一性我们可以通过clsid来调用com组件
- 通过应用名调用
如上文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协议,主要的过程是