您可以使用CreateProcessAsUserW
以非提升用户令牌启动进程。但有几个问题存在——如果hToken是调用者的主标记的受限版本,则需要SE_INCREASE_QUOTA_NAME
和SE_ASSIGNPRIMARYTOKEN_NAME
特权来调用此API。
第二个问题是如何获取用户令牌?您可以使用WTSQueryUserToken
,但是要调用此API,您需要拥有SE_TCB_NAME
特权。
因此,您需要具备/获取3项特权SE_ASSIGNPRIMARYTOKEN_NAME
、SE_TCB_NAME
和SE_INCREASE_QUOTA_NAME
。一般情况下,LocalSystem
进程都具有这些权限。如果我们具有SE_DEBUG_PRIVILEGE
,则可以打开其中的一些进程。
所以一般来说我们需要做以下步骤:
- 获取自身的
SessionId
(用于调用WTSQueryUserToken
)
- 在进程或线程令牌中启用
SE_DEBUG_PRIVILEGE
(提升的令牌通常具有此特权)
- 搜索具有所需特权的令牌的进程
- 使用此令牌进行模拟
- 调用
WTSQueryUserToken
- 调用
CreateProcessAsUserW
----- 代码: ---------------
inline ULONG BOOL_TO_ERROR(BOOL f)
volatile UCHAR guz;
ULONG takePrivileges(HANDLE hToken, ::PTOKEN_PRIVILEGES ptp, ULONG cb, BOOL& bContinue)
if (!--n)
if (dwError == NOERROR)
CloseHandle(hToken);
}
return dwError;
}
}
} while (Privileges++, --PrivilegeCount);
}
return ERROR_NOT_FOUND;
}
ULONG GetPrivileges()
;
if (Process32FirstW(hSnapshot, &pe))
;
BOOL bContinue = TRUE;
do
if (GetTokenInformation(hToken, ::TokenPrivileges, buf, cb, &rcb))
} while (GetLastError() == ERROR_INSUFFICIENT_BUFFER);
CloseHandle(hToken);
}
CloseHandle(hProcess);
}
} while (bContinue && Process32NextW(hSnapshot, &pe));
}
CloseHandle(hSnapshot);
}
else
return dwError;
}
ULONG RunNotElevated(PCWSTR lpApplicationName, PWSTR lpCommandLine, PCWSTR lpCurrentDirectory)
, SE_PRIVILEGE_ENABLED } } };
AdjustTokenPrivileges(hDupToken, FALSE, &tp, 0, 0, 0);
if ((dwError = GetLastError()) == NOERROR)
CloseHandle(hDupToken);
if (dwError == NOERROR)
;
PROCESS_INFORMATION pi;
PVOID lpEnvironment;
if (WTSQueryUserToken(SessionId, &hToken))
CloseHandle(hToken);
if (dwError == NOERROR)
}
}
SetThreadToken(0, 0);
}
}
}
return dwError;
}
void test_r()
}
WTSQueryUserToken
获取您的会话标记或者通过进程枚举中的LogonSID找到它,并最终使用CreateProcessAsUserW
。 - RbMm