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

因为是IIS服务在接受到HTTP请求时自动创建的进程,所以使用普通的调试器启动方式是无法对w3wp.exe进行有效调试的。现将对w3wp.exe进程的调试方法记录如下:
调试方法一共分为3个步骤
- 添加w3wp.exe的映像劫持。
- 访问站点并查看windbg.exe进程的PID。
- 使用windbg.exe连接调试器。
- 添加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 告诉调试器在工作进程退出时不要中断最后一个断点。
- 访问站点并查看windbg.exe进程的PID

这里要记住的是调试器的PID,而不是w3wp.exe的PID,图中PID为1304。
- 使用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比较麻烦,在一开始可以将管道名设置为固定值,这样就比较方便了。
发表回复