概述: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 结构体
typedef struct _RpcCoreInternalCtxt_T{ VOID* pGlobalRpcServer; UINT64 ModuleVersion; }RpcCoreInternalCtxt_T; -
ModuleSectionInfo 结构体
typedef struct _ModuleSectionInfo_T{ VOID* pBase; UINT Size; }ModuleSectionInfo_T; -
RpcServer 结构体
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 结构体如下所示:
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