RDP 配置文件编写记录

RDP 配置文件编写记录

RDP Wrapper 官方配置文件只能支持到18年的Win10系统,新版本的系统需要自己编写 INI 文件,当然也可以去 RDP 的官方 github issues 里面寻找相应的配置文件。

RDP Ini 文件样本 for win10(10.0.19041.789)

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[10.0.19041.789]
LocalOnlyPatch.x86=1
LocalOnlyOffset.x86=B59D9
LocalOnlyCode.x86=jmpshort
SingleUserPatch.x86=1
SingleUserOffset.x86=3BC45
SingleUserCode.x86=nop
DefPolicyPatch.x86=1
DefPolicyOffset.x86=3E7C9
DefPolicyCode.x86=CDefPolicy_Query_eax_ecx
SLInitHook.x86=1
SLInitOffset.x86=67BF8
SLInitFunc.x86=New_CSLQuery_Initialize

LocalOnlyPatch.x64=1
LocalOnlyOffset.x64=88F41
LocalOnlyCode.x64=jmpshort
SingleUserPatch.x64=1
SingleUserOffset.x64=0CA4C
SingleUserCode.x64=Zero
DefPolicyPatch.x64=1
DefPolicyOffset.x64=18A15
DefPolicyCode.x64=CDefPolicy_Query_eax_rcx
SLInitHook.x64=1
SLInitOffset.x64=1D5BC
SLInitFunc.x64=New_CSLQuery_Initialize

[10.0.19041.789-SLInit]
bInitialized.x86=D0954
bServerSku.x86=D0958
lMaxUserSessions.x86=D095C
bAppServerAllowed.x86=D0964
bRemoteConnAllowed.x86=D096C
bMultimonAllowed.x86=D0970
ulMaxDebugSessions.x86=D0974
bFUSEnabled.x86=D0978

bInitialized.x64=106028
bServerSku.x64=10602C
lMaxUserSessions.x64=106030
bAppServerAllowed.x64=106038
bRemoteConnAllowed.x64=106040
bMultimonAllowed.x64=106044
ulMaxDebugSessions.x64=106048
bFUSEnabled.x64=10604C

RDP 的Patch代码,我可以根据需要添加

1
2
3
4
5
6
7
8
9
10
11
12
[PatchCodes]
nop=90
Zero=00
jmpshort=EB
nopjmp=90E9
CDefPolicy_Query_edx_ecx=BA000100008991200300005E90
CDefPolicy_Query_eax_rcx_jmp=B80001000089813806000090EB
CDefPolicy_Query_eax_esi=B80001000089862003000090
CDefPolicy_Query_eax_rdi=B80001000089873806000090
CDefPolicy_Query_eax_ecx=B80001000089812003000090
CDefPolicy_Query_eax_ecx_jmp=B800010000898120030000EB0E
CDefPolicy_Query_eax_rcx=B80001000089813806000090

RDP Wrapper 对 termsrv.dll 有 3 处 Patch,1 处 hook。每个 Patch 后缀 .x86.x64 指定架构。

Patchs

需要用 IDA 分析 termsrv.dll,加载的时候需要加载微软的符号表。

LocalOnlyPatch

函数: CEnforcementCore::GetInstanceOfTSLicense

签名:?GetInstanceOfTSLicense@CEnforcementCore@@UEAAJAEAU_GUID@@PEAPEAVITSLicense@@@Z

把 jz 改成 jmp: LocalOnlyCode.x64=jmpshort

SingleUserPatch

函数: CSessionArbitrationHelperMgr::IsSingleSessionPerUserEnabled

签名: ?IsSingleSessionPerUserEnabled@CSessionArbitrationHelperMgr@@UEAAJPEAH@Z

改成常量1改成0:SingleUserCode.x64=Zero 注意 offset 的位置。

DefPolicyPatch

函数: CDefPolicy::Query

签名: ?Query@CDefPolicy@@UEAAJPEAH@Z

改成如下

DefPolicyCode.x64=CDefPolicy_Query_eax_rcx

这里的 [rcx+638h] 是最大的连接数,直接给它赋值一个大数值即可。

SLInitHook

hook 的目标函数是: CConnectionHandlerItem::CConnHandlerKeepAliveObject::Cleanup

签名: ?Cleanup@CConnHandlerKeepAliveObject@CConnectionHandlerItem@@AEAAXXZ

SLInitOffset.x64 填这个函数的偏移即可。

其它全局变量

[x.x.x.x-SLInit] 中的值

我只给出这些全局变量的符号, IDA 加载符号表后可以直接定位

属性 符号
bInitialized ?bInitialized@CSLQuery@@0HA
bServerSku ?bServerSku@CSLQuery@@0HA
lMaxUserSessions ?lMaxUserSessions@CSLQuery@@0JA
bAppServerAllowed ?bAppServerAllowed@CSLQuery@@0HA
bRemoteConnAllowed ?bRemoteConnAllowed@CSLQuery@@0HA
bMultimonAllowed ?bMultimonAllowed@CSLQuery@@0HA
ulMaxDebugSessions ?ulMaxDebugSessions@CSLQuery@@0KA
bFUSEnabled ?bFUSEnabled@CSLQuery@@0HA

参考

https://paper.seebug.org/papers/scz/windows/201804121554.txt

https://github.com/stascorp/rdpwrap


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!