Windows 個(gè)人版實(shí)現(xiàn)多用戶遠(yuǎn)程登陸
在個(gè)人 Windows 版本中是不提供像Windows Server的多用戶同時(shí)訪問(wèn)主機(jī)的功能。 不過(guò)我們可以通過(guò) hook Windows 提供遠(yuǎn)程服務(wù)的
C:\Windows\System32\termsrv.dll
庫(kù)文件、修改相關(guān)注冊(cè)表并提供依賴程序的方式可以使個(gè)人版本的Windows 提供多人同時(shí)訪問(wèn)主機(jī)的功能。實(shí)現(xiàn)環(huán)境:
Windows版本:Windows 10 Education 20H2
硬件平臺(tái):x64
termsrv.dll版本:10.0.19041.84
多用戶訪問(wèn)開(kāi)啟實(shí)現(xiàn)思路流程
通過(guò)修改注冊(cè)表將原有的termsrv.dll文件入口重定向至hook程序的dll文件上(后稱為A文件),A文件將自己偽裝成termsrv.dll,并對(duì)外提供與原接口一致的API調(diào)用方法,A文件在runtime運(yùn)行時(shí)的執(zhí)行步驟如下:
-
加載原有的termsrv.dll文件至內(nèi)存
-
根據(jù)預(yù)先調(diào)研好的設(shè)定配置位置及值,修改內(nèi)存中termsrv.dll相對(duì)偏移位置的內(nèi)存值,使其具備多用戶遠(yuǎn)程登錄能力
-
A文件的對(duì)外API透?jìng)鞯叫薷暮蟮膖ermsrv.dll執(zhí)行,使對(duì)外表現(xiàn)為開(kāi)啟多用戶遠(yuǎn)程登陸特性,達(dá)成目的
優(yōu)點(diǎn):不需要更改windows的原始dll文件,影響小,不具備破壞性。
思路流程拆解
本流程實(shí)現(xiàn)中可以拆解為4個(gè)比較關(guān)鍵的步驟,分為4個(gè)關(guān)鍵小節(jié)依次進(jìn)行說(shuō)明具體實(shí)現(xiàn)
- 修改注冊(cè)表,將dll導(dǎo)流至hook.dll
- hook.dll加載termsrv.dll之內(nèi)存后修改4個(gè)位置的內(nèi)存值,使termsrv.dll開(kāi)啟多用戶登錄模式
- 在windows 注冊(cè)表,配置正確的用戶訪問(wèn)策略
- 檢查有無(wú)遠(yuǎn)程訪問(wèn)所需的依賴程序及庫(kù)文件,如果沒(méi)有,提供并放至指定路徑下
-
1、修改注冊(cè)表,引流服務(wù)至hook.dll
2、hook termsrv.dll, 修改內(nèi)存值,使其開(kāi)啟多用戶模式
Hook 程序思路
-
termsrv.dll
暴露了兩個(gè)函數(shù)接口:ServiceMain
和SvchostPushServiceGlobals
,Hook 程序同樣也需要暴露這兩個(gè)函數(shù)接口。 -
當(dāng)系統(tǒng)調(diào)用 Hook 程序的這兩個(gè)接口時(shí),首先將
termsrv.dll
動(dòng)態(tài)庫(kù)加載到內(nèi)存,凍結(jié)進(jìn)程和線程的狀態(tài)。Hook 程序再根據(jù)偏移量找到對(duì)應(yīng)的termsrv.dll
在內(nèi)存中需要 Patch 點(diǎn)的地址,對(duì) Patch 點(diǎn)進(jìn)行修改,再恢復(fù)進(jìn)程和線程的狀態(tài),再去調(diào)用termsrv.dll
文件對(duì)應(yīng)的函數(shù)接口。
附:修改位置查找方法
需要使用 IDA 對(duì)
termsrv.dll
文件進(jìn)行分析,找到修改的位置和修改的內(nèi)容。使用 IDA 打開(kāi)
termsrv.dll
,,找到 Header 值位置180000000
。 -
?Hook程序修改位置1:LocalOnlyPatch
函數(shù):CEnforcementCore::GetInstanceOfTSLicense(_GUID &,ITSLicense * *)
該函數(shù)主要會(huì)對(duì)本地的 License 進(jìn)行判斷,需要讓該函數(shù)不進(jìn)行判斷直接進(jìn)行跳轉(zhuǎn)。
修改內(nèi)容:
需要將該函數(shù)此處的比較跳轉(zhuǎn)(JZ)修改為直接跳轉(zhuǎn)(JMP):
修改前:
.text:0000000180087611 jz short loc_180087657 // 74 44
修改后:
.text:0000000180087611 jmp short loc_180087657 // EB 44
偏移量:180087611
- 180000000
= 87611
?Hook程序修改位置2:SingleUserPatch
函數(shù):CSessionArbitrationHelperMgr::IsSingleSessionPerUserEnabled(int *)
該函數(shù)會(huì)判斷當(dāng)前主機(jī)是否只允許單用戶進(jìn)行會(huì)話連接,需要讓該函數(shù)判斷為允許多用戶連接。
修改內(nèi)容:
需要將此處傳入值 1 修改為 0:
修改前:
.text:000000018000BFE0 mov dword ptr [rdx], 1 // C7 02 00 00 00 00
修改后:
.text:000000018000BFE0 mov dword ptr [rdx], 0 // C7 02 01 00 00 00
偏移量:0BFE2
?Hook程序修改位置3:DefPolicyPatch
函數(shù):CDefPolicy::Query(int *)
該函數(shù)主要作用是設(shè)置最大遠(yuǎn)程連接數(shù),這里讓最大連接數(shù)設(shè)置為最大值(256)即可。
修改內(nèi)容:
需要將修改此處的比較、跳轉(zhuǎn)語(yǔ)句修改為直接重設(shè)寄存器值語(yǔ)句:
修改前:
此處根據(jù)具體比較的寄存器和執(zhí)行的跳轉(zhuǎn)語(yǔ)句執(zhí)行不同的預(yù)設(shè)語(yǔ)句
.text:0000000180017ED5 cmp [rcx+63Ch], eax \\ 39 81 3C 06 00 00
.text:0000000180017EDB jz loc_18002D0BA \\ 0F 84 D9 51 01 00
修改后:
.text:0000000180017ED5 mov eax, 100h \\ B8 00 01 00 00
.text:0000000180017EDA mov [rcx+638h], eax \\ 89 81 38 06 00 00
.text:0000000180017EE0 nop \\ 90
偏移量:17ED5
?Hook程序修改位置4:SLInitHook
函數(shù):CSLQuery::Initialize(void)
修改內(nèi)容:
通過(guò)全局關(guān)鍵字搜索找到該函數(shù)變量的存放區(qū)域:
變量的值需要重設(shè)為:
bServerSku = 1
bRemoteConnAllowed = 1
bFUSEnabled = 1
bAppServerAllowed = 1
bMultimonAllowed = 1
lMaxUserSessions = 0
ulMaxDebugSessions = 0
bInitialized = 1
各變量的偏移量:
bInitialized.x64 =103FF8
bServerSku.x64 =103FFC
lMaxUserSessions.x64 =104000
bAppServerAllowed.x64 =104008
bRemoteConnAllowed.x64=104010
bMultimonAllowed.x64 =104014
ulMaxDebugSessions.x64=104018
bFUSEnabled.x64 =10401C
3、配置windows 遠(yuǎn)程注冊(cè)表配置項(xiàng)
1. ServiceDll
服務(wù)端會(huì)根據(jù)該值查找處理 RDP 遠(yuǎn)程連接的 dll 庫(kù)文件,我們需要將其替換為 Hook 的 dll 文件。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService\Parameters -> ServiceDll
原始值:%SystemRoot%\System32\termsrv.dll
替換值:{{rdpwrap.dll文件 所在路徑}}
2. fDenyTSConnections
該值控制主機(jī)是否開(kāi)啟 Windows 遠(yuǎn)程桌面服務(wù)。true
關(guān)閉遠(yuǎn)程服務(wù),false
開(kāi)啟遠(yuǎn)程服務(wù)。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server -> fDenyTSConnections
3. EnableConcurrentSessions
該值會(huì)管理主機(jī)是否允許多個(gè)用戶遠(yuǎn)程登錄并同時(shí)使用服務(wù)器。true
開(kāi)啟并發(fā)會(huì)話,false
關(guān)閉并發(fā)會(huì)話。
位置:
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Licensing Core -> EnableConcurrentSessions
4. AllowMultipleTSSessions
該值控制主機(jī)是否允許多終端服務(wù)會(huì)話。true
允許多用戶,false
不允許多用戶。
位置:Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon -> AllowMultipleTSSessions
5. AddIns
位置:
配置剪貼板和客戶端端口的重定向器。
Clip Redirector:
剪切板重定向器。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\AddIns\Clip Redirector
DND Redirector:
RDP 展示程序。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\AddIns\DND Redirector
Dynamic VC:
Dynamic Virtual Channel。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\AddIns\Dynamic VC
4、補(bǔ)全缺失的依賴程序
由于開(kāi)啟多用戶能力后,相較于某些系統(tǒng)版本(家庭版),缺少部分遠(yuǎn)程桌面使用的文件,需要在對(duì)應(yīng)的位置配置文件的拷貝,讓遠(yuǎn)程桌面能力能完整對(duì)外服務(wù)
1. rdpclip.exe
該程序用于剪切板重定向,用于同步客戶端和服務(wù)端的剪切板。
位置:%SystemRoot%\System32\rdpclip.exe
2. rfxvmt.dll
該動(dòng)態(tài)庫(kù)包含遠(yuǎn)程桌面服務(wù)端程序。
位置:%SystemRoot%\System32\rfxvmt.dll
操作流程總結(jié)
-
提取所需文件,包括:
rdpclip.exe
(存在則不管)、rfxvmt.dll
(存在則不管)和rdpwrap.dll
(Hook 程序,必須放在系統(tǒng)級(jí)目錄下,不可放在用戶目錄內(nèi),這里選擇路徑為C:\Program Files\Test\rdpwrap.dll
); -
修改
ServiceDll
注冊(cè)表的值,將其替換為 Hook 程序的路徑(C:\Program Files\Test\rdpwrap.dll
); -
修改注冊(cè)表的值,正確配置遠(yuǎn)程桌面服務(wù);
-
開(kāi)啟防火墻 3389 端口;
-
殺死
TermService
服務(wù)的進(jìn)程; -
啟動(dòng)
TermService
服務(wù),服務(wù)啟動(dòng)后會(huì)根據(jù)ServiceDll
的值加載rdpwrap.dll
程序,rdowrap.dll
程序則會(huì)去 Hooktermsrv.dll
文件(如果在Windows 服務(wù)管理中TermService
服務(wù)配置為自動(dòng),那么可以不用手動(dòng)重啟,Windows 會(huì)自動(dòng)重啟該服務(wù)
2、hook termsrv.dll, 修改內(nèi)存值,使其開(kāi)啟多用戶模式
Hook 程序思路
-
termsrv.dll
暴露了兩個(gè)函數(shù)接口:ServiceMain
和SvchostPushServiceGlobals
,Hook 程序同樣也需要暴露這兩個(gè)函數(shù)接口。 -
當(dāng)系統(tǒng)調(diào)用 Hook 程序的這兩個(gè)接口時(shí),首先將
termsrv.dll
動(dòng)態(tài)庫(kù)加載到內(nèi)存,凍結(jié)進(jìn)程和線程的狀態(tài)。Hook 程序再根據(jù)偏移量找到對(duì)應(yīng)的termsrv.dll
在內(nèi)存中需要 Patch 點(diǎn)的地址,對(duì) Patch 點(diǎn)進(jìn)行修改,再恢復(fù)進(jìn)程和線程的狀態(tài),再去調(diào)用termsrv.dll
文件對(duì)應(yīng)的函數(shù)接口。
附:修改位置查找方法
需要使用 IDA 對(duì) termsrv.dll
文件進(jìn)行分析,找到修改的位置和修改的內(nèi)容。
使用 IDA 打開(kāi) termsrv.dll
,,找到 Header 值位置 180000000
。
?Hook程序修改位置1:LocalOnlyPatch
函數(shù):CEnforcementCore::GetInstanceOfTSLicense(_GUID &,ITSLicense * *)
該函數(shù)主要會(huì)對(duì)本地的 License 進(jìn)行判斷,需要讓該函數(shù)不進(jìn)行判斷直接進(jìn)行跳轉(zhuǎn)。
修改內(nèi)容:
需要將該函數(shù)此處的比較跳轉(zhuǎn)(JZ)修改為直接跳轉(zhuǎn)(JMP):
修改前:
.text:0000000180087611 jz short loc_180087657 // 74 44
修改后:
.text:0000000180087611 jmp short loc_180087657 // EB 44
偏移量:180087611
- 180000000
= 87611
?Hook程序修改位置2:SingleUserPatch
函數(shù):CSessionArbitrationHelperMgr::IsSingleSessionPerUserEnabled(int *)
該函數(shù)會(huì)判斷當(dāng)前主機(jī)是否只允許單用戶進(jìn)行會(huì)話連接,需要讓該函數(shù)判斷為允許多用戶連接。
修改內(nèi)容:
需要將此處傳入值 1 修改為 0:
修改前:
.text:000000018000BF09 mov dword ptr [rax+8], 1 // C7 40 08 01 00 00 00
修改后:
.text:000000018000BF09 mov dword ptr [rax+8], 0 // C7 40 08 00 00 00 00
偏移量:0BF09
?Hook程序修改位置3:DefPolicyPatch
函數(shù):CDefPolicy::Query(int *)
該函數(shù)主要作用是設(shè)置最大遠(yuǎn)程連接數(shù),這里讓最大連接數(shù)設(shè)置為最大值(256)即可。
修改內(nèi)容:
需要將修改此處的比較、跳轉(zhuǎn)語(yǔ)句修改為直接重設(shè)寄存器值語(yǔ)句:
修改前:
此處根據(jù)具體比較的寄存器和執(zhí)行的跳轉(zhuǎn)語(yǔ)句執(zhí)行不同的預(yù)設(shè)語(yǔ)句
.text:0000000180017ED5 cmp [rcx+63Ch], eax \\ 39 81 3C 06 00 00
.text:0000000180017EDB jz loc_18002D0BA \\ 0F 84 D9 51 01 00
修改后:
.text:0000000180017ED5 mov eax, 100h \\ B8 00 01 00 00
.text:0000000180017EDA mov [rcx+638h], eax \\ 89 81 38 06 00 00
.text:0000000180017EE0 nop \\ 90
偏移量:17ED5
?Hook程序修改位置4:SLInitHook
函數(shù):CSLQuery::Initialize(void)
修改內(nèi)容:
通過(guò)全局關(guān)鍵字搜索找到該函數(shù)變量的存放區(qū)域:
變量的值需要重設(shè)為:
bServerSku = 1
bRemoteConnAllowed = 1
bFUSEnabled = 1
bAppServerAllowed = 1
bMultimonAllowed = 1
lMaxUserSessions = 0
ulMaxDebugSessions = 0
bInitialized = 1
各變量的偏移量:
bInitialized.x64 =103FF8
bServerSku.x64 =103FFC
lMaxUserSessions.x64 =104000
bAppServerAllowed.x64 =104008
bRemoteConnAllowed.x64=104010
bMultimonAllowed.x64 =104014
ulMaxDebugSessions.x64=104018
bFUSEnabled.x64 =10401C
3、配置windows 遠(yuǎn)程注冊(cè)表配置項(xiàng)
1. ServiceDll
服務(wù)端會(huì)根據(jù)該值查找處理 RDP 遠(yuǎn)程連接的 dll 庫(kù)文件,我們需要將其替換為 Hook 的 dll 文件。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService\Parameters -> ServiceDll
原始值:%SystemRoot%\System32\termsrv.dll
替換值:{{rdpwrap.dll文件 所在路徑}}
2. fDenyTSConnections
該值控制主機(jī)是否開(kāi)啟 Windows 遠(yuǎn)程桌面服務(wù)。true
關(guān)閉遠(yuǎn)程服務(wù),false
開(kāi)啟遠(yuǎn)程服務(wù)。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server -> fDenyTSConnections
3. EnableConcurrentSessions
該值會(huì)控制服務(wù)端遠(yuǎn)程桌面服務(wù)是否啟用并發(fā)會(huì)話。true
開(kāi)啟并發(fā)會(huì)話,false
關(guān)閉并發(fā)會(huì)話。
位置:
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Licensing Core -> EnableConcurrentSessions
4. AllowMultipleTSSessions
該值控制主機(jī)是否允許多用戶會(huì)話。true
允許多用戶,false
不允許多用戶。
位置:Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon -> AllowMultipleTSSessions
5. AddIns
位置:
配置剪貼板和客戶端端口的重定向器。
Clip Redirector:
剪切板重定向器。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\AddIns\Clip Redirector
DND Redirector:
RDP 展示程序。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\AddIns\DND Redirector
Dynamic VC:
Dynamic Virtual Channel。
位置:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\AddIns\Dynamic VC
4、補(bǔ)全缺失的依賴程序
由于開(kāi)啟多用戶能力后,相較于某些系統(tǒng)版本(家庭版),缺少部分遠(yuǎn)程桌面使用的文件,需要在對(duì)應(yīng)的位置配置文件的拷貝,讓遠(yuǎn)程桌面能力能完整對(duì)外服務(wù)
1. rdpclip.exe
該程序用于剪切板重定向,用于同步客戶端和服務(wù)端的剪切板。
位置:%SystemRoot%\System32\rdpclip.exe
2. rfxvmt.dll
該動(dòng)態(tài)庫(kù)包含遠(yuǎn)程桌面服務(wù)端程序。
位置:%SystemRoot%\System32\rfxvmt.dll
操作流程總結(jié)
-
提取所需文件,包括:
rdpclip.exe
(存在則不管)、rfxvmt.dll
(存在則不管)和rdpwrap.dll
(Hook 程序,必須放在系統(tǒng)級(jí)目錄下,不可放在用戶目錄內(nèi),這里選擇路徑為C:\Program Files\Test\rdpwrap.dll
); -
修改
ServiceDll
注冊(cè)表的值,將其替換為 Hook 程序的路徑(C:\Program Files\Test\rdpwrap.dll
); -
修改注冊(cè)表的值,正確配置遠(yuǎn)程桌面服務(wù);
-
開(kāi)啟防火墻 3389 端口;
-
殺死
TermService
服務(wù)的進(jìn)程; -
啟動(dòng)
TermService
服務(wù),服務(wù)啟動(dòng)后會(huì)根據(jù)ServiceDll
的值加載rdpwrap.dll
程序,rdowrap.dll
程序則會(huì)去 Hooktermsrv.dll
文件(如果在Windows 服務(wù)管理中TermService
服務(wù)配置為自動(dòng),那么可以不用手動(dòng)重啟,Windows 會(huì)自動(dòng)重啟該服務(wù)
Windows 個(gè)人版開(kāi)啟單用戶多會(huì)話
通過(guò)上面的操作,主機(jī)已經(jīng)實(shí)現(xiàn)了不同用戶的同時(shí)訪問(wèn)。但是如果不同會(huì)話以同一用戶身份進(jìn)行訪問(wèn),會(huì)導(dǎo)致先連接的會(huì)話被后連接的會(huì)話擠掉。
在完成上述步驟的基礎(chǔ)上,通過(guò)再修改下列注冊(cè)表配置項(xiàng)實(shí)現(xiàn)單用戶多會(huì)話連接。
-
MaxInstance
配置最大會(huì)話數(shù)量
位置:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services -> MaxInstance
-
fSingleSessionPerUser
開(kāi)啟單用戶多會(huì)話模式。
true
代表關(guān)閉單用戶多會(huì)話模式,false
代表開(kāi)啟單用戶多會(huì)話模式。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-481282.html位置:
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server -> fSingleSessionPerUser
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-481282.html
到了這里,關(guān)于Windows 個(gè)人版實(shí)現(xiàn)多用戶遠(yuǎn)程登陸的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!