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即可搞定
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章