SetThreadToken() 함수가 있지만 "SetProcessToken()"과 같은 함수는 없습니다.다른 프로세스의 토큰을 설정하는 방법이 있습니까?
다른 프로세스의 토큰을 설정하는 방법이 있습니까? "SetProcessToken()"작성하는 방법?
SetThreadToken() 함수가 있지만 "SetProcessToken()"과 같은 함수는 없습니다.다른 프로세스의 토큰을 설정하는 방법이 있습니까?
다른 프로세스의 토큰을 설정하는 방법이 있습니까? "SetProcessToken()"작성하는 방법?
프로세스에는 사용자의 보안 토큰 복사본 인 기본 보안 토큰 하나만 있습니다.
스레드에는 두 번째 보안 토큰 인 가장 (impersonation token)이 있습니다. 프로세스에는 스레드 만 있습니다. 프로세스가 다른 사용자의 보안 토큰을 가장 할 수 없습니다.
예, 문서화되지 않은 NtSetInformationProcess
기능을 사용할 수 있지만 일단 프로세스가 실행되면 프로세스 토큰이 잠기고 더 이상 수정할 수 없습니다. 따라서 CREATE_SUSPENDED
생성 플래그로 프로세스를 시작하고 프로세스 토큰을 설정 한 다음 ResumeThread()
을 사용하여 프로세스를 다시 시작해야합니다. 호출자가 프로세스 토큰을 설정하려면 SeAssignPrimaryTokenPrivilege
특권을 가지고 있어야합니다. 다음은 충분해야한다 등
코드 :
// A few required typedefs
typedef enum _PROCESS_INFORMATION_CLASS
{
ProcessBasicInformation,
ProcessQuotaLimits,
ProcessIoCounters,
ProcessVmCounters,
ProcessTimes,
ProcessBasePriority,
ProcessRaisePriority,
ProcessDebugPort,
ProcessExceptionPort,
ProcessAccessToken,
ProcessLdtInformation,
ProcessLdtSize,
ProcessDefaultHardErrorMode,
ProcessIoPortHandlers,
ProcessPooledUsageAndLimits,
ProcessWorkingSetWatch,
ProcessUserModeIOPL,
ProcessEnableAlignmentFaultFixup,
ProcessPriorityClass,
ProcessWx86Information,
ProcessHandleCount,
ProcessAffinityMask,
ProcessPriorityBoost,
MaxProcessInfoClass
} PROCESS_INFORMATION_CLASS, *PPROCESS_INFORMATION_CLASS;
typedef struct _PROCESS_ACCESS_TOKEN
{
HANDLE Token;
HANDLE Thread;
} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
typedef NTSTATUS (NTAPI * NtSetInformationProcess) (HANDLE processHandle, PROCESS_INFORMATION_CLASS infoClass, PVOID info, ULONG infoLength);
// Assume we have a handle to an existing process: targetProcessHandle, started in a suspended state, and a new token: newToken to assign to this process.
// First we must enable SeAssignPrimaryTokenPrivilege.
// Note: The user under which this runs must already hold the privilege, this only enables it (it is initially disabled by default).
LUID luid;
LookupPrivilegeValue(0, SE_ASSIGNPRIMARYTOKEN_NAME, &luid);
TOKEN_PRIVILEGES privs;
privs.PrivilegeCount = 1;
privs.Privileges[0].Luid = luid;
privs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
HANDLE myToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &myToken))
{
wprintf("Unable to open own process token to enable permissions\n");
return FALSE;
}
if (!AdjustTokenPrivileges(myToken, FALSE, &privs, sizeof(TOKEN_PRIVILEGES), 0, 0))
{
wprintf("Error setting token privileges: 0x%08x\n", GetLastError());
CloseHandle(myToken);
return FALSE;
}
// Even if AdjustTokenPrivileges returns TRUE, it may not have succeeded, check last error top confirm
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
wprintf("Unable to enable a required privilege\n");
CloseHandle(myToken);
return FALSE;
}
CloseHandle(myToken);
PROCESS_ACCESS_TOKEN tokenInfo;
tokenInfo.Token = newToken;
tokenInfo.Thread = 0;
// Get a handle to ntdll
HMODULE ntdll = LoadLibrary(L"ntdll.dll");
// And a pointer to the NtSetInformationProcess function
NtSetInformationProcess setInfo = (NtSetInformationProcess)GetProcAddress(ntdll,"NtSetInformationProcess");
NTSTATUS setInfoResult = setInfo(targetProcessHandle, ProcessAccessToken, &tokenInfo, sizeof(PROCESS_ACCESS_TOKEN));
if (setInfoResult < 0)
{
wprintf(L"Error setting token: 0x%08x\n", setInfoResult);
return FALSE;
}
FreeLibrary(ntdll);
// You can now resume the target process' main thread here using ResumeThread().
return TRUE;
이것이 왜 투표 취소 된 이유인지 이해하는 것이 좋을 것입니다 ... – Iridium
예. , OpenProcessToken()
하여 하나의 토큰을 얻을 DuplicateTokenEx()
와 토큰을 복제, 당신은 SetTokenInformation()
와 함께 원하는대로 중복 된 토큰을 설정하고 이것을 SeTcbPrivilege
, SeAssignPrimaryTokenPrivilege
및 SeIncreaseQuotaPrivilege
@ user143233, 현재 프로세스 또는 이전에 OpenProcess()로 얻은 프로세스 핸들에 대한 권한이 설정 되었습니까? –
새로운 프로세스입니다. 이 토큰으로 새 프로세스를 시작합니다. DuplicateTokenEx() 다음에는 어떤 프로세스와도 연관되지 않은 토큰이 있습니다. 그것을 변경해도 아무런 효과가 없지만이 토큰으로 새 프로세스를 만들면 새 프로세스가 토큰의 설정을 가져옵니다. – user1438233
에 필요한
CreateProcessAsUser()
으로이 토큰을 사용하여 새 프로세스를 생성 수퍼 유저로부터의 링크로 인한 Upvoting. – Joshua