【RPC】RpcView是如何检测的
概述: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
4typedef struct _RpcCoreInternalCtxt_T{
VOID* pGlobalRpcServer;
UINT64 ModuleVersion;
}RpcCoreInternalCtxt_T; -
ModuleSectionInfo 结构体
1
2
3
4typedef 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
29typedef 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
21typedef 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
【RPC】RpcView是如何检测的
https://hodlyounger.github.io/2023/11/08/A_OS/Windows/RPC/【RPC】RpcView 相关/