天天看點

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即可搞定

繼續閱讀