调试IIS Worker Process (w3wp.exe) 的方法

·

w3wp.exe是IIS实际负责HTTP(S)数据交换(在HTTP.SYS与ring3之间)的程序,该进程由IIS服务进程启动,启动参数如下:

w3wp.exe启动参数

因为是IIS服务在接受到HTTP请求时自动创建的进程,所以使用普通的调试器启动方式是无法对w3wp.exe进行有效调试的。现将对w3wp.exe进程的调试方法记录如下:

调试方法一共分为3个步骤

  1. 添加w3wp.exe的映像劫持。
  2. 访问站点并查看windbg.exe进程的PID。
  3. 使用windbg.exe连接调试器。
  1. 添加w3wp.exe的映像劫持

注册表路径为

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

添加名为w3wp.exe的项,并在右侧添加名为“Debugger”的字符串类型数据,数据内容为

"C:\Program Files\Windows Kits\10\Debuggers\x64\windbg.exe" -server npipe:pipe=w3wp%d -G -g
映像劫持调试
  • 其中管道名为w3wp<windbg的PID>。
  • -g 告诉调试器在工作进程启动时不要中断初始断点,如果是调试w3wp.exe的启动过程,则需要去掉这个选项。
  • -G 告诉调试器在工作进程退出时不要中断最后一个断点。
  1. 访问站点并查看windbg.exe进程的PID
进程关系

这里要记住的是调试器的PID,而不是w3wp.exe的PID,图中PID为1304。

  1. 使用windbg.exe连接调试器

连接调试器的命令如下

"C:\Program Files\Windows Kits\10\Debuggers\x64\windbg.exe" -remote npipe:server=localhost,pipe=w3wp<debugger PID>

本地例子中的实际命令为

"C:\Program Files\Windows Kits\10\Debuggers\x64\windbg.exe" -remote npipe:server=localhost,pipe=w3wp1304
连接调试器

如果觉得每次都需要查看PID比较麻烦,在一开始可以将管道名设置为固定值,这样就比较方便了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注