Windows Rundll32(DllHost 的子进程)崩溃了。我该如何识别它?

Windows Rundll32(DllHost 的子进程)崩溃了。我该如何识别它?

Windows 10 家庭版 / “基于 x64 的 PC” / Dell XPS 13 9360

在可靠性监视器中,我每天都会遇到许多“应用程序故障”。它们可以一直追溯到 2017-12-04,没有任何变化(下面的详细信息相同),我认为这台机器是第一次使用的。问题被标记为已报告(过去几分钟内的问题实例除外)。

@magicandre1981 还建议我开一个Windows 应用反馈中心中的公开问题因为某些原因。

我的问题是:我该如何识别这种情况?是什么原因导致崩溃?能以某种方式解决这些问题吗?

问题详细信息

  • 故障应用程序路径: C:\Windows\System32\rundll32.exe
  • 问题事件名称:APPCRASH
  • 故障模块名称:Windows.UI.Immersive.dll
  • 故障模块版本:10.0.16299.125
  • 异常偏移量:00000000000ac885
  • 异常代码:c0000005
  • 操作系统版本:10.0.16299.2.0.0.768.101
  • 存储桶 ID:ab5106f0b0020ee0d7e0c2d4f71642fb (1720589277589816059)

已安装“防病毒软件”(McAfee VirusSafe)并且正在运行,没有警报,没有隔离的项目,也没有我能找到的重要日志。这sfc /scannow表明系统运行正常。

手动触发问题

似乎可以通过登录来触发崩溃。这不是过去导致崩溃的原因,因为机器通常没有用户登录和退出(甚至打开和关闭机器)。

进程监控允许跟踪进程的创建和退出以第二个用户身份运行它,我能够看到崩溃的过程:

  • 命令行:"C:\WINDOWS\system32\rundll32.exe" -localserver 22d8c27b-47a1-48d1-ad08-7da7abd79617

目前还不清楚这个 UUID 是什么。该-localserver选项似乎没有记录。Google 找到了一个问题,唯一的答案声称它是“进程分析性能分析程序(Windows 性能计数器程序)”。诚然,我可以看到它,profapi.dll并且powrprof.dll正在加载此进程。

  • 父进程:DllHost.exe(“COM Surrogate”)。

被形容为 ”我对这段代码感觉不太好,所以我打算让 COM 将它托管在另一个进程中。这样,如果它崩溃了,崩溃的将是 COM Surrogate 牺牲进程,而不是我“。

  • 命令行:C:\WINDOWS\system32\DllHost.exe /Processid:{133EAC4F-5891-4D04-BADA-D84870380A80}

父级命令行中的此 UUID可以在注册表中找到。它与名称“Shell Create Object Task Server”相关联。使用 Process Monitor 中的注册表跟踪,我看到DllHost加载了shell32.dll,位于HKCR\CLSID\{133eac...}\InProcServer32)。

=> 我认为我们可以将这个父进程识别为 shell32.dll /“Shell Create Object Task Server”,并且它是操作系统的一部分。


两个进程都以用户身份运行NT AUTHORITY\SYSTEM。这似乎是一个可能的调查地点。GUI 软件的特权部分在做什么,需要在单独的进程中运行吗?

崩溃回溯

运行后procdump -ma -i C:\dumps,我能够捕获崩溃转储。(procdump -u停止捕获)。来自 DebugDiag 的分析器能够打开它们并运行 CrashHangAnalysis:

在 rundll32.exe_171225_165805.dmp 中,汇编指令位于Windows_UI_Immersive!CUserTileValidator::_SetReadOnlyCapability+1dC:\Windows\System32\Windows.UI.Immersive.dll来自 Microsoft Corporation 的尝试从线程 0 上的内存位置 0x00000000 读取时引发访问冲突异常 (0xC0000005)。

以下线程rundll32.exe_171225_165805.dmp正在处理通过 LRPC 到端点的入站 RPC 调用OLE54BFB094974A828ACE9FBFE5A353

( 0 )

线程 0 - 系统 ID 4332

  • 入口点 rundll32!wWinMainCRTStartup
  • 创建时间 25/12/2017 16:58:04
  • 用户模式所用时间 0 天 00:00:00.000
  • 内核模式所用时间 0 天 00:00:00.000

ntdll!NtWaitForMultipleObjects+14 
ntdll!WerpWaitForCrashReporting+a8 
ntdll!RtlReportExceptionHelper+33e 
ntdll!RtlReportException+9d 
combase!ServerExceptionFilter+71 
combase!AppInvokeExceptionFilterWithMethodAddress+62 
combase!`ObjectMethodExceptionHandlingAction<<lambda_76d9e92c799d246a4afbe64a2bf5673d> >'::`1'::filt$0+77 
ucrtbase!_C_specific_handler+a0 
ntdll!RtlpExecuteHandlerForException+d 
ntdll!RtlDispatchException+358 
ntdll!KiUserExceptionDispatch+2e 
Windows_UI_Immersive!CUserTileValidator::_SetReadOnlyCapability+1d 
Windows_UI_Immersive!CUserTileValidator::_GenerateLargeFromDynamicAndReset+23 
Windows_UI_Immersive!CUserTileValidator::ValidateUserTile+141 
rpcrt4!Invoke+73 
rpcrt4!NdrStubCall2+3a5 
rpcrt4!NdrStubCall3+e3 
combase!CStdStubBuffer_Invoke+62 
rpcrt4!CStdStubBuffer_Invoke+3b 
combase!ObjectMethodExceptionHandlingAction<<lambda_76d9e92c799d246a4afbe64a2bf5673d> >+53 
combase!DefaultStubInvoke+2d2 
combase!ServerCall::ContextInvoke+492 
combase!AppInvoke+99e 
combase!ComInvokeWithLockAndIPID+55b 
combase!ComInvoke+210 
combase!ThreadDispatch+d4 
combase!ThreadWndProc+e8 
user32!UserCallWinProcCheckWow+2ad 
user32!DispatchMessageWorker+19f 
rundll32!_InvokeLocalServer+1b9 
rundll32!wWinMain+168 
rundll32!operator delete+2eb 
kernel32!BaseThreadInitThunk+14 
ntdll!RtlUserThreadStart+21 

Inbound RPC Call:

Protocol Sequence    ncalrpc 
Endpoint OLE54BFB094974A828ACE9FBFE5A353 
Source Process ID 1160 
Source Thread ID 2624

根据 Process Explorer,PID 1160 是“RPC”和“RPC Endpoint Mapper”的 svchost.exe 实例。

答案1

崩溃的原因是什么? 能以某种方式解决吗?

显然,崩溃是由验证UserTile该特定用户引起的。

我相信这是指您登录时显示的图片。将用户的图片设置为从中获取的任意图像文件后Pictures/,当我切换用户并以特定用户身份登录时不再触发崩溃。

我该如何识别这一点?

看起来“异常偏移”是 DLL/EXE 内部的代码偏移(即避免重定位/地址随机化的影响)。因此,可以通过“异常偏移”+ 特定的 DLL/EXE 内容来识别崩溃位置 -

  • 故障模块名称:Windows.UI.Immersive.dll
  • 故障模块版本:10.0.16299.125
  • “基于 x64 的 PC”(DLL 的 64 位版本,而不是 32 位“x86”)。

如果您有 DLL/EXE 的调试符号,您可能需要付出额外的努力来查找此位置。procdump按照所述方法捕获崩溃转储。如果 DLL/EXE 来自 Microsoft,请使用支持 Microsoft 符号服务的任何调试器打开转储。与数字地址相比,符号名称不太可能随时间(或不同的硬件平台)而改变。调试器还将显示导致崩溃的嵌套函数调用的完整跟踪。

  • 象征性位置:Windows_UI_Immersive!CUserTileValidator::_SetReadOnlyCapability+1d等等。

相关内容