Advertisement
Guest User

Untitled

a guest
Jul 24th, 2017
319
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. static volatile UCHAR guz;
  2.  
  3. void PrintRefCount(HKEY hKey)
  4. {
  5.     ULONG Type, RefCount, cb = sizeof(DWORD);
  6.  
  7.     if (!RegQueryValueExW(hKey, L"RefCount", 0, &Type, (PBYTE)&RefCount, &cb) &&
  8.         Type == REG_DWORD && cb == sizeof(DWORD))
  9.     {
  10.         DbgPrint("RefCount = %x\n", RefCount);
  11.     }
  12. }
  13.  
  14. void ProfileTest(HANDLE hToken)
  15. {
  16.     PVOID stack = alloca(guz);
  17.     ULONG cb = 0, rcb = 32, len;
  18.  
  19.     union {
  20.         PVOID buf;
  21.         PTOKEN_USER ptu;
  22.         PWSTR szSubKey;
  23.         PBYTE pb;
  24.     };
  25.  
  26.     do
  27.     {
  28.         if (cb < rcb) cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
  29.  
  30.         if (GetTokenInformation(hToken, ::TokenUser, buf, cb, &rcb))
  31.         {
  32.             PWSTR szSid;
  33.             if (ConvertSidToStringSid(ptu->User.Sid, &szSid))
  34.             {
  35.                 STATIC_WSTRING(ProfileList, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\");
  36.                
  37.                 rcb = sizeof(ProfileList) + (len = (ULONG)wcslen(szSid) * sizeof(WCHAR));
  38.  
  39.                 if (cb < rcb) cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
  40.  
  41.                 memcpy(pb, ProfileList, sizeof(ProfileList) - sizeof(WCHAR));
  42.                 memcpy(pb + sizeof(ProfileList) - sizeof(WCHAR), szSid, len);
  43.  
  44.                 LocalFree(szSid);
  45.  
  46.                 HKEY hKey;
  47.                 if (!RegOpenKeyExW(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_READ|KEY_WOW64_64KEY, &hKey))
  48.                 {
  49.                     PrintRefCount(hKey);
  50.  
  51.                     PROFILEINFO pi = { sizeof(pi), 0, L"*" };
  52.  
  53.                     if (LoadUserProfileW(hToken, &pi))
  54.                     {
  55.                         PrintRefCount(hKey);
  56.                         UnloadUserProfile(hToken, pi.hProfile);
  57.                     }
  58.                     PrintRefCount(hKey);
  59.  
  60.                     RegCloseKey(hKey);
  61.                 }
  62.             }
  63.             break;
  64.         }
  65.  
  66.     } while (GetLastError() == ERROR_INSUFFICIENT_BUFFER);
  67. }
  68.  
  69. void ProfileTest()
  70. {
  71.     HANDLE hToken;
  72.     if (OpenProcessToken(NtCurrentProcess(), TOKEN_QUERY|TOKEN_IMPERSONATE|TOKEN_DUPLICATE, &hToken))
  73.     {
  74.         ProfileTest(hToken);
  75.         CloseHandle(hToken);
  76.     }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement