Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define BEGIN_PRIVILEGES(name, n) static const union { TOKEN_PRIVILEGES name;\
- struct { ULONG PrivilegeCount; LUID_AND_ATTRIBUTES Privileges[n];} label(_) = { n, {
- #define LAA(se) {{se}, SE_PRIVILEGE_ENABLED }
- #define LAA_D(se) {{se} }
- #define END_PRIVILEGES }};};
- BEGIN_PRIVILEGES(tp_backup_restore, 2)
- LAA(SE_BACKUP_PRIVILEGE),
- LAA(SE_RESTORE_PRIVILEGE),
- END_PRIVILEGES
- UNICODE_STRING Empty {};
- const SECURITY_QUALITY_OF_SERVICE sqos = {
- sizeof (sqos), SecurityImpersonation, SECURITY_DYNAMIC_TRACKING, FALSE
- };
- const OBJECT_ATTRIBUTES soa = { sizeof(soa), 0, 0, 0, 0, const_cast<SECURITY_QUALITY_OF_SERVICE*>(&sqos) };
- NTSTATUS GetToken(PVOID buf, const TOKEN_PRIVILEGES* RequiredSet)
- {
- NTSTATUS status;
- union {
- PVOID pv;
- PBYTE pb;
- PSYSTEM_PROCESS_INFORMATION pspi;
- };
- pv = buf;
- ULONG NextEntryOffset = 0;
- do
- {
- pb += NextEntryOffset;
- HANDLE hProcess, hToken, hNewToken;
- CLIENT_ID ClientId = { pspi->UniqueProcessId };
- if (ClientId.UniqueProcess)
- {
- if (0 <= NtOpenProcess(&hProcess, PROCESS_QUERY_LIMITED_INFORMATION,
- const_cast<POBJECT_ATTRIBUTES>(&soa), &ClientId))
- {
- status = NtOpenProcessToken(hProcess, TOKEN_DUPLICATE, &hToken);
- NtClose(hProcess);
- if (0 <= status)
- {
- status = NtDuplicateToken(hToken, TOKEN_ADJUST_PRIVILEGES|TOKEN_IMPERSONATE,
- const_cast<POBJECT_ATTRIBUTES>(&soa), FALSE, TokenImpersonation, &hNewToken);
- NtClose(hToken);
- if (0 <= status)
- {
- status = NtAdjustPrivilegesToken(hNewToken, FALSE, const_cast<PTOKEN_PRIVILEGES>(RequiredSet), 0, 0, 0);
- if (STATUS_SUCCESS == status)
- {
- status = NtSetInformationThread(NtCurrentThread(), ThreadImpersonationToken, &hNewToken, sizeof(hNewToken));
- }
- NtClose(hNewToken);
- if (STATUS_SUCCESS == status)
- {
- return STATUS_SUCCESS;
- }
- }
- }
- }
- }
- } while (NextEntryOffset = pspi->NextEntryOffset);
- return STATUS_UNSUCCESSFUL;
- }
- NTSTATUS ImpersonateToken(const TOKEN_PRIVILEGES* RequiredSet)
- {
- NTSTATUS status;
- ULONG cb = 0x40000;
- do
- {
- status = STATUS_INSUFFICIENT_RESOURCES;
- if (PBYTE buf = new BYTE[cb += PAGE_SIZE])
- {
- if (0 <= (status = NtQuerySystemInformation(SystemProcessInformation, buf, cb, &cb)))
- {
- status = GetToken(buf, RequiredSet);
- if (status == STATUS_INFO_LENGTH_MISMATCH)
- {
- status = STATUS_UNSUCCESSFUL;
- }
- }
- delete [] buf;
- }
- } while(status == STATUS_INFO_LENGTH_MISMATCH);
- return status;
- }
- ImpersonateToken(&tp_backup_restore);
- //////////////////////////////////
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement