VC 用服务进程开启有UI的进程和写注册表HKEY_CURRENT_USER子键的问题

有时我们需要通过服务进程来启动某个进程,且该被启动的进程有UI,或者需要用服务进程来写HKEY_CURRENT_USER子键,此时我们就会碰到一个问题:被启动的进程看不到UI,但在进程列表中却能看到该进程;而HKEY_CURRENT_USER键则必须用当前用户才能写成功。

如果使用CreateProcess来创建进程的话,新创建的进程和服务程序依然是相同的用户身份,还是无法达到目的,只有使用CreateProcessAsUser了。但CreateProcessAsUser的第一个参数是HANDLE hToken,该参数通常应该用LogonUser来获得,但是LogonUser又需要用户名和用户密码,这样就很不现实。那应该怎么办呢?一个方法可以绕过LogonUser直接获得hToken。因为用户已经登陆,那么肯定有Shell(就是EXPLORER.EXE)运行了,我们可以通过遍历进程来取得Shell的hToken来运行进程。下面就是示例代码:

BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
{
 if(!lpName)
 {
  return FALSE;
 }
 HANDLE         hProcessSnap = NULL; 
    BOOL           bRet      = FALSE; 
    PROCESSENTRY32 pe32      = {0}; 
 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if (hProcessSnap == INVALID_HANDLE_VALUE) 
        return (FALSE); 
 
    pe32.dwSize = sizeof(PROCESSENTRY32); 
 
    if (Process32First(hProcessSnap, &pe32)) 
    {  
        do 
        {
   if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))
   {
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
     FALSE,pe32.th32ProcessID);
    bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
    CloseHandle (hProcessSnap); 
    return (bRet);
   }
        } 
        while (Process32Next(hProcessSnap, &pe32)); 
        bRet = TRUE; 
    } 
    else 
        bRet = FALSE;
 
    CloseHandle (hProcessSnap); 
    return (bRet);
}

BOOL RunProcess(LPCSTR lpImage)
{
 if(!lpImage)
 {
  return FALSE;
 }
 HANDLE hToken;
 if(!GetTokenByName(hToken,"EXPLORER.EXE"))
 {
  return FALSE;
 }
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 
 ZeroMemory(&si, sizeof(STARTUPINFO));
 si.cb= sizeof(STARTUPINFO);
 si.lpDesktop = TEXT("winsta0\\default");
 
 BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,
  FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
 CloseHandle(hToken);
 if(bResult)
 {
  OutputDebugString("CreateProcessAsUser ok!\r\n");
 }
 else
 {
  OutputDebugString("CreateProcessAsUser false!\r\n");
 }
 return bResult;
}

这样就可以以登陆用户的身份来运行程序了,此时就可以写注册表,启动UI进程了。

用这种方法,我们还可以使用管理员权限运行的服务程序来启动我们的UI进程,此时该UI进程也是以管理员权限运行的(未验证)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值