如何使用windbg从头调试 Windows 服务

date
Nov 28, 2023
slug
how-to-debug-windows-service-from-scratch-by-windbg
status
Published
tags
WinDbg
Debug
summary
这篇文章介绍了如何从头开始使用Windbg调试Windows服务。首先,作者提到了设置注册表项,以使Windows在启动服务时自动启动Windbg来进行调试。其次,作者建议延长服务的超时时间,以便有足够的时间进行调试。最后,对于一些复杂的服务,例如svchost.exe中包含多个服务的情况,作者解释了如何将特定服务隔离到单独的svchost.exe进程中进行调试。这些步骤有助于开发人员更有效地调试Windows服务。
type
Post

背景

普通进程可以很容易的通过 windbg 来进行调试。对于服务,我们可能会优先想到附加进程的方式,可是如果想从头开始进行调试呢?
以下就以 Windows 上的大杂烩服务 scvhost.exe 为例,来从头调试下服务。

准备

1. 设置 IFEO

Windows 进程在创建的过程中,在打开要执行的镜像的时候,会去访问 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 下寻找特定的 option。例如要打开的文件是SppExtComObj.exe,就会找到确认 Image File Execution Options 下是否存在 SppExtComObj.exe 子项,如果存在 PspAllocateProcess 就会再去找是否存在 debugger 的key,如果这个key存在,就会将 debugger 的值替换 SppExtComObj.exe,并且重新运行步骤一。
使用注册表编辑器,打开注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options ,添加一个主键,名称设置成我们要调试的服务的 exe 文件。这里是:scvhost.exe
notion image
然后在 Image File Execution Options 下添加一个字符串项,命名为 debugger ,然后再设置一下这个参数的值,这里我们想通过 windbg 来调试,所以设置成 windbg 的路径。
notion image
改完之后,重启电脑生效。

2. 调整服务超时

当调试服务的时候,其实是在服务器启动时进行调试的,而系统对服务设置了默认的超时时间,超过时间就会退出启动并报错。
系统默认启动服务的超时时间是30秒,但30秒远远不够对服务进行分析,所以要延长服务超时的时长。
打开注册表,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 键值下查找ServicesPipeTimeout参数,一般不存在,需要新建。新建DWORD值“ServicesPipeTimeout”,其值为欲设置的超时时间,先选择为十进制,数值单位是毫秒,如设置 24小时,则值为86400000毫秒:
notion image

3. 隔离服务

我们知道 svchost 是个大杂烩,所以可能有很多服务组合到单个 svchost 进程中。我们要调试这类服务,我们就得将其隔离到单独的 scvhost 中。
这里我们以计划任务这个服务为例:
  1. 先查询下这个服务:
注意其中的 C:\Windows\system32\svchost.exe -k netsvcs -p
  1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SvcHost 下创建一个类型为REG_MULTI_SZ的值,名称为:tmpgrp(任意别重复就行),值为:schedule(服务的名称)
  1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SvcHost 下创建一个同名子健(tmpgrp)
  1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SvcHost 找到 netsvcs (步骤一中的 BINARY_PATH_NAME 中的 netsvcs),并将其中的内容拷贝到我们刚创建的 tmpgrp 子键下面:
notion image
  1. 再修改一下服务的配置:
最后,重启 Windows 就可以了。

参考链接:

 

© Frend Guo 2022 - 2024