CreateProcess 创建explorer.exe失败的原因简单分析

创建explorer.exe失败的原因简单分析




非管理员用户调用CreateProcess启动explorer时发现返回TRUE但explorer没有起来,
分析:explorer自己退出了,于是用waitfor+getexitcode得到2
ida 打开explorer搜索ExitProcess调用处发现在WinMain中确实有:
    v19 = ShouldStartDesktopAndTray();          // //  判断要不要起桌面和托盘
    if ( v19 == 1 )
    {
      v20 = CreateMutexW(0i64, 0, L"Local\\ExplorerIsShellMutex");
      v18 = v20;
      if ( v20 )
        WaitForSingleObject(v20, 0xFFFFFFFF);
      v19 = (unsigned int)IsDesktopWindowAlreadyPresent() != 0 ? 5 : 3;
    }
    SetExplorerServerMode((unsigned int)v19);
    if ( v19 == 3 )                             // //桌面还不存在
    {
      *(_DWORD *)v4 = 0;
      v21 = GetCommandLineW();
      v22 = PathGetArgsW(v21);
      if ( v22
        && *v22
        && (LODWORD(TraceGuidReg) = 1, CompareStringOrdinal(v22, 0xFFFFFFFFi64, L"/NOUACCHECK", 0xFFFFFFFFi64) == 2) )// 参数中存在/NOUACCHECK的时候不会走下面的exitprocess逻辑 这样就能起来了
      {
        v25 = 1;
      }
      else
      {
        v23 = SHIsCurrentAppElevated((unsigned __int64)&v85 & 0xFFFFFFFFFFFFFFC0ui64);
        v25 = *(_DWORD *)v4;
        if ( v23 >= 0 && v25 )
        {
          *(_DWORD *)v4 = 0;
          v69 = CheckElevationEnabled((unsigned __int64)&v85 & 0xFFFFFFFFFFFFFFC0ui64);
          v24 = *(_DWORD *)v4;
          if ( v69 )
            v24 = 1i64;
          if ( (_DWORD)v24 && !(unsigned int)SHIsCurrentAccountBuiltInAdmin() && RunExplorerUnelevated() >= 0 )
            ExitProcess(2u);
        }
      }


于是在命令行加上/NOUACCHECK即可搞定

你可能感兴趣的:(C语言,VC++,内联,同名类,栈破坏)