第 6 章 再解电源服务溢出崩溃

  • bcdedit 启用内核调试
  • !process 切换到触发异常的进程
  • .reload /user 查看用户态内容
  • 内核调试。UnhandledExceptionFilter 会在存在内核调试器的情况下触发 int 3
  • 断点异常之后会发错误报告给 WER 服务

第 7 章 三解电源服务溢出崩溃

  • WinRE 设置 windbg 为 JIT
  • 没有出现界面。再挂上内核调试器
  • 沿着调用栈顺藤摸瓜,查出等待链的最后是出问题的电源服务
  • !process 0 0 列出所有进程;.PROCESS /i <eprocess 地址> 切换到目标进程;!alpc /m <消息地址> 查看 ALPC 信息(栈会打印消息地址);.kill <eprocess> 杀进程
  • 禁用电源服务避免在系统启动过程中被调用,service.msc 设置服务的失败操作为什么也不做,防止重启
  • session 0 隔离:在服务的属性页勾选“允许桌面交互”并启用交互服务检测服务(Interactive Server Dectection)。也可修改注册表里服务键值下的 Type,置上 0x100 位。0x20 表示与其他服务共享宿主进程,0x10 单独拥有宿主进程。
  • JIT 仍没有动静,可能是启动过程受到干扰:可以在启动电源服务时同时启动调试器,在注册表“Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options” 里新建 svchost.exe,创建 Debugger 字符串值,设置为 windbg 路径
  • 注册表设置服务启动超时:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 新建字符串 ServicesPipeTimeout,单位毫秒,一天=86400000
  • 设置注册表 JIT 以便远程调试:"windbg.exe -p %ld -e %ld -QY -c ".server tcp:port=2000" -loga windbg.log" -g 开关是忽略初始断点,要去掉。触发后打开新的 windbg 进行远程调试