概述: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】RpcView 相关/image-20231110112108011.png)

可以看出来 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