概述:RpcView 代码学习及扫描逻辑整理

0x01 RpcView 代码学习

silverf0x/RpcView: RpcView is a free tool to explore and decompile Microsoft RPC interfaces

RpcView 是一款开源的 Windows RPC 监控工具。界面部分是用Qt实现的,功能是C\C++写的,功能部分涉及到枚举系统的rpc并且还实现了rpc的反汇编。不管是要研究 RPC 还是学习代码逻辑、规范等,都比较有参考意义。

本文主要是看功能部分,界面部分暂不涉及。

0x02 Rpc扫描

可以看出来 RpcView 这款软件的强大之处哈,rpc的所有信息都可以拿到。

扫描逻辑

一个基础概念:==PE文件结构:DOS头+PE头+节表+.data/.rdata/.text==

简单画个 flow 看下 RpcView 的相关调用流程,以获取一个进程为例(仅涉及rpc部分,其他信息获取逻辑看源码即可,补充一篇整理的PE相关的文章 windows:【PE】PE文件结构(一) - oone)。

flowchart LR
    A[RpcCoreGetProcessInfo\n获取一个进程的信息,包括rpc信息] --> B[GetRpcServerAddressInProcess\n获取rpc信息结构体 pRpcCoreInternalCtxt]
    B --> C[GetModuleDataSection\n获取RPCRT4.dll的.data数据段 ModuleSectionInfo]
    C --> D[通过 ModuleSectionInfo.pBase获取 RpcServer]
    D --> E[通过获取的 RpcServer 与 RpcInterface \n比较判断当前进程是否为 RPCserver]

上述流程就获取到了一个进程中是否含有RPC服务,并且如果有的话,可以借 RPCserver 获取RPC的相关信息。

  • pRpcCoreInternalCtxt 结构体

    1
    2
    3
    4
    typedef struct _RpcCoreInternalCtxt_T{
    VOID* pGlobalRpcServer;
    UINT64 ModuleVersion;
    }RpcCoreInternalCtxt_T;
  • ModuleSectionInfo 结构体

    1
    2
    3
    4
    typedef struct _ModuleSectionInfo_T{
    VOID* pBase;
    UINT Size;
    }ModuleSectionInfo_T;
  • RpcServer 结构体

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    typedef struct _RPC_SERVER_T{
    MUTEX_T MUTEX;
    ULONG Unk1;
    ULONG Unk2;
    BOOL bIsListening;
    ULONG MinimumCallThreads;
    ULONG bWait;
    ULONG OutCalls;
    ULONG Unk3;
    ULONG InCalls;
    SIMPLE_DICT_T AddressDict;
    ULONG Unk3_;
    SIMPLE_DICT_T _ProtSeqQueue;
    ULONG Unk4[4];
    ULONG OutPackets;
    ULONG Unk5;
    MUTEX_T Mutex2;
    ULONG MaxCalls;
    VOID PTR_T hEvent;
    ULONG Unk6[6];
    SIMPLE_DICT_T InterfaceDict;
    BOOL ___bIsListening;
    BOOL bIsListenMaxCallsDefault;
    ULONG Unk7[6];
    ULONG InPackets;
    RPC_FORWARD_FUNCTION PTR_T pRpcForwardFunction;
    ULONG Unk8[6];
    SIMPLE_DICT_T AuthenInfoDict;
    }RPC_SERVER_T, PTR_T PRPC_SERVER_T;
  • RpcInterface 结构体如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    typedef struct _RPC_INTERFACE_T
    {
    RPC_SERVER_T PTR_T pRpcServer;
    ULONG Flags;
    ULONG EpMapperFlags;
    RPC_MGR_EPV PTR_T pMgrEpv;
    RPC_IF_CALLBACK_FN PTR_T IfCallbackFn;
    RPC_SERVER_INTERFACE_T RpcServerInterface;
    ULONG pSyntaxInfo;
    ULONG pTransfertSyntaxes;
    ULONG pTransfertSyntaxesCount;
    ULONG Unk1;
    ULONG NbTypeManager;
    ULONG MaxRpcSize;
    ULONG Unk2;
    ULONG pUuidVector;
    SIMPLE_DICT_T RpcInterfaceManagerDict;
    UCHAR Annotation[MAX_RPC_INTERFACE_ANNOTATION];
    SIMPLE_DICT_T FwEpDict;
    ULONG Unk3[6];
    }RPC_INTERFACE_T, PTR_T PRPC_INTERFACE_T;

    0x03 RpcCore

    本章主要描述上述检测流程,以及rpcview是如果工作拿到相关信息的。

    NDR 相关可查官方文档:MIDL_STUB_DESC (rpcndr.h) - Win32 apps | Microsoft Learn