使用WinDbg调试远程用户态程序的步骤:
假设这个用户态程序是我们自己的, 有源码~
* 在程序入口处加入等待调试的代码.
* 将用户态目标程序编译成Release版带调试符号, 假设这个PE文件叫 25912.exe
* 用WinDbg链接远程计算机, http://msdn.microsoft.com/en-us/library/windows/hardware/hh451173%28v=vs.85%29.aspx
当第一次被断在系统断点时, 设置好WinDbg的符号路径, PE映像路径, PE源文件路径.
打开25912.c, 在等待调试的代码下面下断点.
输入 g 命令, 全速运行WinDbg
* 将映像文件(25912.exe)拷贝到远程计算机.
运行此用户态程序, 程序运行后, 停在等待调试的代码处.
* 将WinDbg暂停,
用 !process 0 0 列出所有进程, 找到 25912.exe.
PROCESS 857313b0 SessionId: 1 Cid: 0b3c Peb: 7ffd4000 ParentCid: 0750 DirBase: 3efb9540 ObjectTable: 91756858 HandleCount: 21. Image: 25912.exe
kd> !process 857313b0 0 PROCESS 857313b0 SessionId: 1 Cid: 0b3c Peb: 7ffd4000 ParentCid: 0750 DirBase: 3efb9540 ObjectTable: 91756858 HandleCount: 21. Image: 25912.exe
kd> .process /p 857313b0 Implicit process is now 857313b0 .cache forcedecodeuser done
kd> .reload /f /user Loading User Symbols ..............
用 bl 命令将断点列出时, 断点类型 已经变成了 E
非入侵式切换到用户态程序
kd> .process /i /p 857313b0 You need to continue execution (press 'g' <enter>) for the context to be switched. When the debugger breaks in again, you will be in the new process context.
因为下了等待调试的代码, 需要在用户态程序中执行等待调试结束的动作(回车), 然后就落在了WinDbg的断点上.
然后进行正常的应用层单步调试.