From 5f07396fad3b1e6992488495d9a2a23e98c254b8 Mon Sep 17 00:00:00 2001 From: binarymaster Date: Sun, 2 Nov 2014 16:00:46 +0300 Subject: [PATCH] Commit 2014.11.02 Added support for termsrv.dll 6.4.9860.0 --- src-x86-binarymaster/rdpwrap.dll | Bin 69632 -> 70144 bytes src-x86-binarymaster/src/rdpwrap.dpr | 63 +++++++++++ src-x86-binarymaster/src/rdpwrap.identcache | Bin 116 -> 115 bytes src-x86-x64-Fusix/rdpw32.dll | Bin 86016 -> 86016 bytes src-x86-x64-Fusix/rdpw64.dll | Bin 98304 -> 98816 bytes src-x86-x64-Fusix/src/RDPWrap.cpp | 119 ++++++++++++++++++++ 6 files changed, 182 insertions(+) diff --git a/src-x86-binarymaster/rdpwrap.dll b/src-x86-binarymaster/rdpwrap.dll index 3c4cc8c21877f024aca31bf0cd28cba2b2c8fc68..95b109bd1cc2bb2dd489cba49aac86d7061c4a07 100644 GIT binary patch delta 5137 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 delta 4451 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 nil then begin WriteLog('[0x'+IntToHex(DWORD(bServerSku), 1)+'] bServerSku = 1'); bServerSku^ := 1; @@ -1460,6 +1488,41 @@ begin @Jump, SizeOf(far_jmp), bw); end; + if (FV.Release = 9860) and (FV.Build = 0) then begin + WriteLog('Patch CEnforcementCore::GetInstanceOfTSLicense'); + // .text:100962BB call ?IsLicenseTypeLocalOnly@CSLQuery@@SGJAAU_GUID@@PAH@Z ; CSLQuery::IsLicenseTypeLocalOnly(_GUID &,int *) + // .text:100962C0 test eax, eax + // .text:100962C2 js short loc_100962DF + // .text:100962C4 cmp [ebp+var_C], 0 + // .text:100962C8 jz short loc_100962DF <- jmp + SignPtr := Pointer(Cardinal(TermSrvBase) + $962C8); + b := $EB; + WriteProcessMemory(GetCurrentProcess, SignPtr, @b, 1, bw); + + WriteLog('Patch CSessionArbitrationHelper::IsSingleSessionPerUserEnabled'); + // .text:10030841 lea eax, [esp+150h+VersionInformation] + // .text:10030845 inc ebx <- nop + // .text:10030846 mov [edi], ebx + // .text:10030848 push eax ; lpVersionInformation + // .text:10030849 call ds:__imp__GetVersionExW@4 ; GetVersionExW(x) + SignPtr := Pointer(Cardinal(TermSrvBase) + $30845); + WriteProcessMemory(GetCurrentProcess, SignPtr, @nop, 1, bw); + + WriteLog('Patch CDefPolicy::Query'); + SignPtr := Pointer(Cardinal(TermSrvBase) + $3BEC9); + WriteProcessMemory(GetCurrentProcess, SignPtr, + @CDefPolicy_Query_eax_ecx[0], + SizeOf(CDefPolicy_Query_eax_ecx), bw); + + WriteLog('Hook CSLQuery::Initialize'); + SignPtr := Pointer(Cardinal(TermSrvBase) + $46F18); + Jump.PushOp := $68; + Jump.PushArg := @New_CSLQuery_Initialize; + Jump.RetOp := $C3; + WriteProcessMemory(GetCurrentProcess, SignPtr, + @Jump, SizeOf(far_jmp), bw); + end; + end; end; diff --git a/src-x86-binarymaster/src/rdpwrap.identcache b/src-x86-binarymaster/src/rdpwrap.identcache index b288331252de59f23da5f5c3cdedb86925b6496a..89a10bb6fbe3df8d302f06c64d3e091f08571a8d 100644 GIT binary patch delta 18 ZcmXRZW@ThxU`U$CYR6n$lswU07XT$R1atrZ delta 19 acmXReVP#}sU`U?GYR6J$sAn|MO&0(s0t7Sw diff --git a/src-x86-x64-Fusix/rdpw32.dll b/src-x86-x64-Fusix/rdpw32.dll index 306889dcd1f9f398d26d6ce97c2c6c60e2240dc4..426b52af9787b75094f954efe3b72e3782935c9f 100644 GIT binary patch delta 6738 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

%yf zK7F3I`#Vbn}6VGs* zMmg@g2wP04;&F)}E=8hXQ-(3*nc{E}eP)^**dr3dvW~f1E5?j|BX{6a>#3TB5s39l zAl{EaGrcBzWkxvVbv+Sf3PqmYLx|DgXp}cYj0#7{JHr^feBy}D!_Zz+7nJPN-Fh_a zuNGSXC-;X@M-zuSg2*wrIrpOdiobms>|i41j$t)n=$y~nq3vAja*sB9k`n4#2cHf> z(|i@&8bzaUx=cFbt=c#jYH!lYRg~bD_@^VZt@$fa? zdR<*Suzr~Rw~V;=tx3`bUT zT2#9~>(m%JOPY25i7L$R;t0_JaYRE98W}JF$I-EXXz$b@3>%hPKe15ivr{1W^LwT(a;w#XAz%F_yFx|ljXC>-1P2=`UcPO!J6MQ(bvJVJZFOy*Z>+7WDzW>L@JhwB|6Tg zVtKu)6H`qSFUEr()2kd8j7N|!e2P9%lX%zRD8pJ9XsY+O|AC{DP?@mTp?jf25&#oe zZg*v|p9KJ&HOCZ=`7gW;yp(m(z$l*z2MxHKKE90T1~btk7P$WQW1vwkbivIv_wS&X z_CW}>4Zx414Q&sk+AL|H`lc`~cb#)-`-Mh*H)W+bmD**|>R^>NJ<%Xvje1A4Y;)D~fA?1DiBcoteF{M2vU&)ui|B|Kq7xAoBKT8*esv@gVU`ipzs>jrJo+t~kuo}&eZi5~~wTo`!(HxzXO{Hulq@C;AU0f^s zMF$Wb)o5gNJG=^IMoZCCp^`Sn|KEcf12qzOu2qX}Ilp&5IshMo@E8jr-7@xt&xbDt zjjz4n2Jv!hiq{te1j#QRj?#X@Kl?Dq{)+VNz-vVM1q+DTo{%xlI(!lwP03OX9AN%- zJLr`kGr+s$COFUSST zrTEY=-RY+Dh+d8jVx8PZ$C_J1Ic%pfGMJH!M!WdNh^N!B|J-momJ|CY$38Z=LEYjq zn{x04$I@^7*|DHEA+!F@v3@t4jyYn3tj^_SPM1UvqeA%GuRtkvxwX&Lv5xrLj~hMB z>DJvU!>zV;9%nf3KgGsbJt_=o5Xx-l&As4QK~=@5)gwKqjyfZpK?%$<16IPj$Tc99JmHf|-2%4Fcn zjf|5o{Lrf%-X^Gf=<^QC@O7mFI-Vm!mtJ-_avv_9Tb=a`pB`s-Ot-w2=$LM*$+%o9 zy|mp#%$7@QX@wv@eYLbBJEA2{mM-XVDG-K{!)Fpi{rJ)gBSsTAR?3ZPgA*GkmA*Q9 zZ)+lF9vZegf}4k#^K*~ygRH@_YTeU)v#Q+ODjgR4nz@+SVaZ!*$YBgO#%;j62=sI= z+Oj(ipNG!wZV%5#yCWh?$ zoYPNENyJvM^xCNf3Bq)zrDhma%5vE)Q@0eOzROjeP1 zNO#JcN~Th%Db#yZKJ_7WjjE;|QC@T?-JWJ?g-)g?(rNSzdIi0bK1=^ZH_*@M5No7$ zq;$xpl3AdZu#~tIo=Dy>qxCb0z<3sp%d>8%|K8YXCzsuYC0{&zE z0RJU_p0D8>csIdM=q#{8FJYK4R(May6h0P;g)-s1a7DN&)CfNb4ZNL{(C!shiY&>Nn~S%8fSD zJUyHqP219G8@-UuqY+(1AEK|)wRE(#t5vYRVx4L≀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 diff --git a/src-x86-x64-Fusix/src/RDPWrap.cpp b/src-x86-x64-Fusix/src/RDPWrap.cpp index 69df681..52ee4df 100644 --- a/src-x86-x64-Fusix/src/RDPWrap.cpp +++ b/src-x86-x64-Fusix/src/RDPWrap.cpp @@ -33,12 +33,17 @@ // 6.3.9600.16384 (Windows 8.1) [init hook + extended patch] // 6.3.9600.17095 (Windows 8.1 with KB2959626) [init hook + extended patch] // 6.4.9841.0 (Windows 10 Technical Preview) [init hook + extended patch] +// 6.4.9860.0 (Windows 10 Technical Preview 1) [init hook + extended patch] // Known failures // 6.0.6000.16386 (Windows Vista RTM x86, crashes on logon attempt) // Internal changelog: +// 2014.11.02 : +// - researching termsrv.dll 6.4.9860.0 +// - done + // 2014.10.19 : // - added support for version 6.0.6000.16386 (x64) // - added support for version 6.0.6001.18000 (x64) @@ -368,6 +373,19 @@ char CDefPolicy_Query_eax_rcx[] = {0xB8, 0x00, 0x01, 0x00, 0x00, 0x89, 0x81, 0x3 // .text:000000018000C130 nop // char CDefPolicy_Query_eax_rcx[] +// termsrv.dll build 6.4.9860.0 + +// Original +// .text:000000018000B9F5 cmp [rcx+63Ch], eax +// .text:000000018000B9FB jz sub_18003B9C8 +//_______________ +// +// Changed +// .text:000000018000B9F5 mov eax, 100h +// .text:000000018000B9FA mov [rcx+638h], eax +// .text:000000018000BA00 nop +// char CDefPolicy_Query_eax_rcx[] + #else typedef unsigned long PLATFORM_DWORD; struct FARJMP @@ -608,6 +626,19 @@ char CDefPolicy_Query_eax_ecx[] = {0xB8, 0x00, 0x01, 0x00, 0x00, 0x89, 0x81, 0x2 // .text:1003B994 nop // char CDefPolicy_Query_eax_ecx[] +// termsrv.dll build 6.4.9860.0 + +// Original +// .text:1003BEC9 cmp eax, [ecx+320h] +// .text:1003BECF jz loc_1005EE1A +//_______________ +// +// Changed +// .text:1003BEC9 mov eax, 100h +// .text:1003BECE mov [ecx+320h], eax +// .text:1003BED4 nop +// char CDefPolicy_Query_eax_ecx[] + #endif FARJMP Old_SLGetWindowsInformationDWORD, Stub_SLGetWindowsInformationDWORD; @@ -1061,6 +1092,28 @@ HRESULT WINAPI New_CSLQuery_Initialize() bRemoteConnAllowed = (DWORD*)(TermSrvBase + 0xBFA0C); #endif } + if (FV.Release == 9860 && FV.Build == 0) + { + #ifdef _WIN64 + bFUSEnabled = (DWORD*)(TermSrvBase + 0xECBD8); + lMaxUserSessions = (DWORD*)(TermSrvBase + 0xECBDC); + bAppServerAllowed = (DWORD*)(TermSrvBase + 0xECBE0); + bInitialized = (DWORD*)(TermSrvBase + 0xECBE4); + bMultimonAllowed = (DWORD*)(TermSrvBase + 0xECBE8); + bServerSku = (DWORD*)(TermSrvBase + 0xECBEC); + ulMaxDebugSessions = (DWORD*)(TermSrvBase + 0xECBF0); + bRemoteConnAllowed = (DWORD*)(TermSrvBase + 0xECBF4); + #else + bFUSEnabled = (DWORD*)(TermSrvBase + 0xBF7E0); + lMaxUserSessions = (DWORD*)(TermSrvBase + 0xBF7E4); + bAppServerAllowed = (DWORD*)(TermSrvBase + 0xBF7E8); + bInitialized = (DWORD*)(TermSrvBase + 0xBF7EC); + bMultimonAllowed = (DWORD*)(TermSrvBase + 0xBF7F0); + bServerSku = (DWORD*)(TermSrvBase + 0xBF7F4); + ulMaxDebugSessions = (DWORD*)(TermSrvBase + 0xBF7F8); + bRemoteConnAllowed = (DWORD*)(TermSrvBase + 0xBF7FC); + #endif + } if (bServerSku) { Log = new char[1024]; @@ -2142,6 +2195,72 @@ void Hook() #endif WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &Jump, sizeof(FARJMP), &bw); } + if (FV.Release == 9860 && FV.Build == 0) + { + WriteToLog("Patch CEnforcementCore::GetInstanceOfTSLicense\r\n"); + #ifdef _WIN64 + // .text:0000000180081083 call ?IsLicenseTypeLocalOnly@CSLQuery@@SAJAEAU_GUID@@PEAH@Z ; CSLQuery::IsLicenseTypeLocalOnly(_GUID &,int *) + // .text:0000000180081088 test eax, eax + // .text:000000018008108A js short loc_1800810AB + // .text:000000018008108C cmp [rsp+58h+arg_18], 0 + // .text:0000000180081091 jz short loc_1800810AB <- jmp + SignPtr = (PLATFORM_DWORD)(TermSrvBase + 0x81091); + #else + // .text:100962BB call ?IsLicenseTypeLocalOnly@CSLQuery@@SGJAAU_GUID@@PAH@Z ; CSLQuery::IsLicenseTypeLocalOnly(_GUID &,int *) + // .text:100962C0 test eax, eax + // .text:100962C2 js short loc_100962DF + // .text:100962C4 cmp [ebp+var_C], 0 + // .text:100962C8 jz short loc_100962DF <- jmp + SignPtr = (PLATFORM_DWORD)(TermSrvBase + 0x962C8); + #endif + b = 0xEB; + WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &b, sizeof(b), &bw); + + WriteToLog("Patch CSessionArbitrationHelper::IsSingleSessionPerUserEnabled\r\n"); + #ifdef _WIN64 + // .text:0000000180011AA3 lea rcx, [rsp+190h+VersionInformation] ; lpVersionInformation + // .text:0000000180011AA8 mov ebx, 1 <- 0 + // .text:0000000180011AAD mov [rsp+190h+VersionInformation.dwOSVersionInfoSize], 11Ch + // .text:0000000180011AB5 mov [rdi], ebx + // .text:0000000180011AB7 call cs:__imp_GetVersionExW + SignPtr = (PLATFORM_DWORD)(TermSrvBase + 0x11AA9); + b = 0; + #else + // .text:10030841 lea eax, [esp+150h+VersionInformation] + // .text:10030845 inc ebx <- nop + // .text:10030846 mov [edi], ebx + // .text:10030848 push eax ; lpVersionInformation + // .text:10030849 call ds:__imp__GetVersionExW@4 ; GetVersionExW(x) + SignPtr = (PLATFORM_DWORD)(TermSrvBase + 0x30845); + b = 0x90; + #endif + WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &b, sizeof(b), &bw); + + WriteToLog("Patch CDefPolicy::Query\r\n"); + #ifdef _WIN64 + SignPtr = (PLATFORM_DWORD)(TermSrvBase + 0xB9F5); + WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &CDefPolicy_Query_eax_rcx, sizeof(CDefPolicy_Query_eax_rcx), &bw); + #else + SignPtr = (PLATFORM_DWORD)(TermSrvBase + 0x3BEC9); + WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &CDefPolicy_Query_eax_ecx, sizeof(CDefPolicy_Query_eax_ecx), &bw); + #endif + + WriteToLog("Hook CSLQuery::Initialize\r\n"); + #ifdef _WIN64 + SignPtr = (PLATFORM_DWORD)(TermSrvBase + 0x1EB00); + Jump.MovOp = 0x48; + Jump.MovRegArg = 0xB8; + Jump.MovArg = (PLATFORM_DWORD)New_CSLQuery_Initialize; + Jump.PushRaxOp = 0x50; + Jump.RetOp = 0xC3; + #else + SignPtr = (PLATFORM_DWORD)(TermSrvBase + 0x46F18); + Jump.PushOp = 0x68; + Jump.PushArg = (PLATFORM_DWORD)New_CSLQuery_Initialize; + Jump.RetOp = 0xC3; + #endif + WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &Jump, sizeof(FARJMP), &bw); + } } } WriteToLog("resume\r\n");