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