2012-11-01 4 views
0

OpenInputDesktop()에 액세스하여 필요한 작업을 수행 할 수 있도록 기본 토큰을 가져 오려고합니다.Windows 8에서 기본 액세스 토큰을 얻으려면 어떻게합니까?

나는 모든 사이트에서 도움을 구했고 아래에서와 같이 결정적인 코드를 찾았지만 DuplicateTokenEx()은 998로 메모리 위치에 대한 잘못된 액세스를 의미합니다.

HANDLE GetCurrentUserToken() 
{ 
    HANDLE currentToken = 0; 
    PHANDLE primaryToken = 0; 

    unsigned int winlogonPid = 0; 

    int dwSessionId = 0; 
    PHANDLE hUserToken = 0; 
    PHANDLE hTokenDup = 0; 

    PWTS_SESSION_INFO pSessionInfo = 0; 
    DWORD dwCount = 0; 

    WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, 
         &pSessionInfo, &dwCount); 

    //TestLog("Error on WTSEnumerateSessions(): %d",GetLastError()); 

    int dataSize = sizeof(WTS_SESSION_INFO); 

    for (DWORD i = 0; i < dwCount; ++i) 
    { 
     WTS_SESSION_INFO si = pSessionInfo[i]; 
     if (WTSActive == si.State) 
     { 
      dwSessionId = si.SessionId; 
      break; 
     } 
    } 

    WTSFreeMemory(pSessionInfo); 

    array<Process^>^localByName = Process::GetProcessesByName("winlogon"); 


    for (int i=0;i<localByName->Length;i++) 
    { 
     Process^p1 = (Process^)(localByName->GetValue(i)); 

     if ((unsigned int)p1->SessionId == dwSessionId) 
     { 
      winlogonPid = (unsigned int)p1->Id; 
     } 
    } 

    // obtain a handle to the winlogon process 
    HANDLE hProcess = OpenProcess(MAXIMUM_ALLOWED, false, winlogonPid); 
    TestLog("Error on OpenProcess():",GetLastError()); 

    // obtain a handle to the access token of the winlogon process 
    if (!OpenProcessToken(hProcess, TOKEN_DUPLICATE, &currentToken)) 
    { 
     TestLog("Error on OpenProcessToken():",GetLastError()); 
     CloseHandle(hProcess); 
     return false; 
    } 

    BOOL bRet ; 
    // bRet = DuplicateTokenEx(currentToken, 
    //   MAXIMUM_ALLOWED /*TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS*/, 
    //   NULL/*0*/, 
    //   SecurityImpersonation, TokenImpersonation, primaryToken); 

    bRet = DuplicateTokenEx(currentToken, 
          TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, 
          NULL, SecurityImpersonation, 
          TokenPrimary, primaryToken); 

    TestLog("Error on DuplicateTokenEx():",GetLastError()); 
    TestLog("return value of DuplicateTokenEx()",bRet); 

    int errorcode = GetLastError(); 
    if (bRet == false) 
    { 
     return 0; 
    } 

    return primaryToken; 
} 

int main(array<System::String ^> ^args) 
{ 
    Console::WriteLine(L"Hello World"); 

    TestLog("**Start TestLaunchExeOneTime**",0); 
    HANDLE hTokenNew = NULL, hTokenDup = NULL; 
    HMODULE hmod = LoadLibrary(L"kernel32.dll"); 

    hTokenDup = GetCurrentUserToken(); 

    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    memset(&si,0,sizeof(STARTUPINFO)); 
    si.cb = sizeof(STARTUPINFO); 
    si.lpDesktop = L"winsta0\\default"; 

    LPVOID pEnv = NULL; 
    DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE; 
    HMODULE hModule = LoadLibrary(L"Userenv.dll"); 
    if(hModule) 
    { 
     if(CreateEnvironmentBlock(&pEnv,hTokenDup,FALSE)) 
     { 
      //WriteToLog("CreateEnvironmentBlock Ok"); 
      dwCreationFlag |= CREATE_UNICODE_ENVIRONMENT;  
     } 
     else 
     { 
      TestLog("Error on CreateEnvironmentBlock():",GetLastError()); 
      pEnv = NULL; 
     } 
    } 

    // 

    if (!CreateProcessAsUser(hTokenDup, 
     NULL, 
     L"C:\\temp\\DesktopDuplicationmilliseconds.exe", 
     NULL, 
     NULL, 
     FALSE, 
     dwCreationFlag, 
     pEnv, 
     NULL, 
     &si, 
     &pi 
     )) 
    { 

    } 
    else 
    { 
     TestLog("Error on CreateProcessAsUser():",GetLastError()); 
     // printf("error : %d",GetLastError()); 
    } 

    return 0; 
} 

답변

1

기본 토큰에 대한 메모리를 할당하지 않았습니다. primaryToken 변수는 핸들에 대한 포인터이지만 실제로 아무 것도 가리 키지 않았습니다. (당신은 또한 핸들을 반환하는 함수로 GetCurrentUserToken를 선언했지만, 실제로 핸들에 대한 포인터를 반환한다.)

당신은 명시 적으로 핸들을위한 메모리 할당해야

:

primaryToken = malloc(sizeof(HANDLE)); 

[...] 

return *primaryToken; 

또는 더 현명, 핸들이 아닌 포인터로 primaryToken을 정의하고 적절한 장소에 대한 참조를 전달합니다

HANDLE primaryToken; 

[...] 

bRet = DuplicateTokenEx(currentToken, 
         TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, 
         NULL, SecurityImpersonation, 
         TokenPrimary, &primaryToken); 
+0

덕분에 내가 함께 붙어 pHandle에이었다. 이 HANDLE로 실행되는 AN :) – Mak

관련 문제