电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 979 人浏览分享

服务进程创建一个带窗口的进程,过UAC

[复制链接]
979 0


  1. 主要代码如下:

  2. DWORD FindSessionPid(LPSTR lpProcessName, DWORD dwSessionId)
  3. {
  4. DWORD res = 0;
  5. PROCESSENTRY32 procEntry;
  6. HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  7. if (hSnap == INVALID_HANDLE_VALUE)
  8. {
  9.    return res ;
  10. }
  11. procEntry.dwSize = sizeof(PROCESSENTRY32);
  12. if (!Process32First(hSnap, &procEntry))
  13. {
  14.    goto _end;
  15. }
  16. do
  17. {
  18.    if (_stricmp(procEntry.szExeFile, lpProcessName) == 0)
  19.    {
  20.     DWORD winlogonSessId = 0;
  21.     if (ProcessIdToSessionId(procEntry.th32ProcessID, &winlogonSessId) && winlogonSessId == dwSessionId)
  22.     {
  23.      res = procEntry.th32ProcessID;
  24.      break;
  25.     }
  26.    }
  27. } while (Process32Next(hSnap, &procEntry));
  28. _end:
  29. CloseHandle(hSnap);
  30. return res;
  31. }
  32. BOOL LaunchAppIntoDifferentSession(LPSTR lpCmdLine)
  33. {
  34. PROCESS_INFORMATION pi;
  35. STARTUPINFO si;
  36. BOOL bResult = FALSE;
  37. DWORD dwSessionId = 0, winlogonPid = 0;
  38. HANDLE hUserToken, hUserTokenDup, hPToken, hProcess;
  39. DWORD dwCreationFlags;
  40. // Log the client on to the local computer.
  41. typedef DWORD (WINAPI *__pfnWTSGetActiveConsoleSessionId)();
  42. typedef BOOL (WINAPI *__pfnWTSQueryUserToken)( ULONG SessionId, PHANDLE phToken );
  43. __pfnWTSGetActiveConsoleSessionId pfnWTSGetActiveConsoleSessionId =
  44.    (__pfnWTSGetActiveConsoleSessionId)GetProcAddress(LoadLibraryA("kernel32.dll"), "WTSGetActiveConsoleSessionId");
  45. __pfnWTSQueryUserToken pfnWTSQueryUserToken =
  46.    (__pfnWTSQueryUserToken)GetProcAddress(LoadLibraryA("Wtsapi32.dll"), "WTSQueryUserToken");
  47. if(pfnWTSGetActiveConsoleSessionId == NULL)
  48. {
  49.    WriteLog("Not found api: WTSGetActiveConsoleSessionId\n");
  50.    return 0;
  51. }
  52. if(pfnWTSQueryUserToken == NULL)
  53. {
  54.    WriteLog("Not found api: WTSQueryUserToken\n");
  55.    return 0;
  56. }
  57. dwSessionId = pfnWTSGetActiveConsoleSessionId();
  58. winlogonPid = FindSessionPid("explorer.exe", dwSessionId);
  59. if(winlogonPid == 0)
  60. {
  61.    winlogonPid = FindSessionPid("winlogon.exe", dwSessionId);
  62. }
  63. if(winlogonPid == 0)
  64. {
  65.    WriteLog("Can't Find Explorer\n");
  66.    return 0;
  67. }
  68. ////////////////////////////////////////////////////////////////////////
  69. dwCreationFlags = NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE;
  70. ZeroMemory(&si, sizeof(STARTUPINFO));
  71. si.cb= sizeof(STARTUPINFO);
  72. si.lpDesktop = "winsta0\\default";
  73. ZeroMemory(&pi, sizeof(pi));
  74. TOKEN_PRIVILEGES tp;
  75. LUID luid;
  76. LPVOID TokenInformation;
  77. DWORD RetLen = 0;
  78. if( !pfnWTSQueryUserToken(dwSessionId, &hUserToken) )
  79. {
  80.    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, winlogonPid);
  81.    if(!OpenProcessToken(hProcess, TOKEN_ALL_ACCESS_P, &hPToken))
  82.    {
  83.     char pTemp[121];
  84.     sprintf(pTemp, "Process token open Error: %u\n", GetLastError());
  85.     WriteLog(pTemp);
  86.    }
  87.    if(hPToken == NULL)
  88.    {
  89.     WriteLog("Process tokenError: \n");
  90.    }
  91. }
  92. else
  93. {
  94.    hPToken = hUserToken;
  95. }

  96. if(GetTokenInformation(hPToken, TokenLinkedToken, &TokenInformation, 4, &RetLen))
  97. {
  98.    hUserTokenDup = TokenInformation;
  99. }
  100. else
  101. {
  102.     if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
  103.     {
  104.      char pTemp[121];
  105.      sprintf(pTemp, "Lookup Privilege value Error: %u\n", GetLastError());
  106.      WriteLog(pTemp);
  107.     }
  108.    if(!DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hUserTokenDup))
  109.    {
  110.     char pTemp[121];
  111.     sprintf(pTemp, "DuplicateTokenEx Error: %u\n", GetLastError());
  112.     WriteLog(pTemp);
  113.    }
  114. }
  115. LPVOID pEnv = NULL;
  116. if(CreateEnvironmentBlock(&pEnv, hUserTokenDup, TRUE))
  117. {
  118.    dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
  119. }
  120. else
  121. {
  122.    WriteLog("CreateEnvironmentBlock Failed\n");
  123.    pEnv = NULL;
  124. }
  125. // Launch the process in the client's logon session.
  126. bResult = CreateProcessAsUser(
  127.    hUserTokenDup,            // client's access token
  128.    NULL,       // file to execute
  129.    lpCmdLine,         // command line      
  130.    NULL,              // pointer to process SECURITY_ATTRIBUTES
  131.    NULL,              // pointer to thread SECURITY_ATTRIBUTES
  132.    FALSE,             // handles are not inheritable
  133.    dwCreationFlags,   // creation flags
  134.    pEnv,              // pointer to new environment block
  135.    NULL,              // name of current directory
  136.    &si,               // pointer to STARTUPINFO structure
  137.    &pi                // receives information about new process
  138.    );
  139. // End impersonation of client.
  140. //GetLastError Shud be 0
  141. int iResultOfCreateProcessAsUser = GetLastError();
  142. if(bResult == FALSE && iResultOfCreateProcessAsUser != 0)
  143. {
  144.    char pTemp[121];
  145.    sprintf(pTemp, "CreateProcessAsUser Error: %u\n", GetLastError());
  146.    WriteLog(pTemp);
  147. }
  148. if(pi.hProcess)
  149. {
  150.    CloseHandle(pi.hProcess);
  151. }
  152. if(pi.hThread)
  153. {
  154.    CloseHandle(pi.hThread);
  155. }
  156. //Perform All the Close Handles task
  157. if(hProcess)
  158. {
  159.    CloseHandle(hProcess);
  160. }
  161. if(hUserToken)
  162. {
  163.    CloseHandle(hUserToken);
  164. }
  165. if(hUserTokenDup)
  166. {
  167.    CloseHandle(hUserTokenDup);
  168. }
  169. if(hPToken)
  170. {
  171.    CloseHandle(hPToken);
  172. }
  173. if(pEnv)
  174. {
  175.    DestroyEnvironmentBlock(pEnv);
  176. }
  177. return bResult;
  178. }
  179. 调用方式:
  180. LaunchAppIntoDifferentSession("c:\\windows\\notepad.exe");

  181. 前提是有个服务进程已经启动,然后服务进程会以管理员模式(不需要用户点UAC的框)启动一个新的可以创建窗口的进程。
  182. 安装这个服务需要点UAC的框,所以不是什么不可公开的思路。好处就一点:每次自启动的进程,不需要再让用户点UAC框了
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

23

粉丝

2901

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.