tgjarwl的博客

道可道,非常道;名可名,非常名

记录生活,记录更好的自己。


从协议的角度看wmi

本文涉及到的协议

[MS-RPCE]
[MS-DCOM]
[MS-WMI]

概述

windows中的很多协议,都是嵌套的。有时候为了去明白上层的一些协议,需要去深入看下,比较底层的协议实现。就比如wmi是依赖dcom和rpc的。这些在wmi的协议中都有很好的说明。下面通过一段简单的代码,探究下这个过程的实现。

交互过程

先来看一段简单的代码,在调用com接口前,需要调用CoCreateInstance函数创建对象,之后再调用相应的方法。

CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);

从协议的角度来说,下图是一个完整的过程

avatar

首先来看[MS-WMI]是如何对这一过程解释的 avatar

通过解释,可以明白的是,客户端会发送 DCOM RemoteCreateInstance 在这个请求中会附带 IWbemLevel1Login消息。而这个请求在DCOM层又是怎么发送的呢?现在转到[MS-DCOM]协议 avatar

该接口是属于IRemoteSCMActiator下的一个函数。 avatar

下面深入看下dcom的交互过程 avatar

通过红线标红的解释,发现正是第二个过程。单是因为该过程又是基于RPC的,下面转到[MS-RPCE]这个文档去确认点东西。Rpc的交互过程是这样的 avatar

第一步是会发送bind消息,之后如果需要认证的话,需要发送AUTH3认证消息。结合上面那么多的讲解,那么一个完整的过程应该是怎么样的呢?借助于wireshark来说明整个过程。 avatar

dcom调用方法的过程

从上图可以看出来,一个完整的dcom-rpc方法调用,需要经过两步,

bind        指定方法所在的类(通知指定某一个类的guid来确定要调用的类)
request     调用bind阶段类中的某一个方法(通过 opnum 来确定)

wmi方法的调用

因为wmi是依赖dcom的,所以wmi的数据是封装在dcom交互的request中的。 例如 CoCreateInstance会触发dcom的RemoteCreateInstance

avatar

这里面出现了一个clsid。在[MS-WMI]协议手册中,可以看到这个id的说明,正是wmi请求的第一个login时机的clsid。 avatar

具体的一些调用参数,也是会存放在request的数据中。

结尾

出于一些监控或者拦截的目的,从协议下手也是一个很好的方法。像wmi,远程计划任务等等。大多数远程交互,windows都是提供了很完备的资料,循着这些资料以及手工分析下,还是有很多很好的点可以利用或者学习。

Microsoft Protocols : https://docs.microsoft.com/en-us/openspecs/protocols/ms-protocolslp/9a3ae8a2-02e5-4d05-874a-b3551405d8f9