2011-02-28 5 views
1

SetThreadToken() 함수가 있지만 "SetProcessToken()"과 같은 함수는 없습니다.다른 프로세스의 토큰을 설정하는 방법이 있습니까?

다른 프로세스의 토큰을 설정하는 방법이 있습니까? "SetProcessToken()"작성하는 방법?

+0

에 필요한 CreateProcessAsUser()

으로이 토큰을 사용하여 새 프로세스를 생성 수퍼 유저로부터의 링크로 인한 Upvoting. – Joshua

답변

1

프로세스에는 사용자의 보안 토큰 복사본 인 기본 보안 토큰 하나만 있습니다.

스레드에는 두 번째 보안 토큰 인 가장 (impersonation token)이 있습니다. 프로세스에는 스레드 만 있습니다. 프로세스가 다른 사용자의 보안 토큰을 가장 할 수 없습니다.

6

예, 문서화되지 않은 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; 
+0

이것이 왜 투표 취소 된 이유인지 이해하는 것이 좋을 것입니다 ... – Iridium

3

예. , OpenProcessToken()하여 하나의 토큰을 얻을 DuplicateTokenEx()와 토큰을 복제, 당신은 SetTokenInformation()와 함께 원하는대로 중복 된 토큰을 설정하고 이것을 SeTcbPrivilege, SeAssignPrimaryTokenPrivilegeSeIncreaseQuotaPrivilege

+0

@ user143233, 현재 프로세스 또는 이전에 OpenProcess()로 얻은 프로세스 핸들에 대한 권한이 설정 되었습니까? –

+0

새로운 프로세스입니다. 이 토큰으로 새 프로세스를 시작합니다. DuplicateTokenEx() 다음에는 어떤 프로세스와도 연관되지 않은 토큰이 있습니다. 그것을 변경해도 아무런 효과가 없지만이 토큰으로 새 프로세스를 만들면 새 프로세스가 토큰의 설정을 가져옵니다. – user1438233

관련 문제