如何通过ntsd -d在windbg中显示源代码?

发布于 2024-11-15 01:20:41 字数 1740 浏览 3 评论 0原文

当我通过 windbg -k 在目标上传输 ntsd -d 时,我无法使源代码在 Windbg 中显示,但当我在本地调试时它可以工作。

我想调试 Winlogon.exe 和 LSASS.exe 的第一个代码执行。但为了方便重现问题,我进行了以下设置:

  • 我使用 CrashMe 示例应用程序,预构建源和符号,复制到目标和主机上的 C:\CrashMe
  • 我在任何地方都使用 Windows 调试工具 (DTW) 版本 6.12.0002.633。
  • 目标运行Windows XP SP3,主机运行Windows 7 Ultimate。
  • 两台机器上的每个路径和设置都是相同的:DTW 的路径和 crashme 的路径。
  • 我总是使用完全限定路径(如 c:\dtw\ntsd.exe)。
  • 我在虚拟机中运行 XP,使用 /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200 启动,

我可以使用此命令在本地进行调试,从 C:\CrashMe 启动:

windbg -g -G -srcpath C:\CrashMe -y C:\CrashMe debug\CrashMe.exe

我可以启动 Windows XP 虚拟机并使用以下命令连接到它:

windbg -n -k com:pipe,port=\\.\pipe\com_1,reconnect -srcpath SRV*;C:\CrashMe -y   
c:\windows\system32;c:\windows\symbols;C:\CrashMe\debug  

但我需要调试远程计算机。在目标上,我有以下选择:

  1. 通过 -server-remote 进行调试 中断
  2. 正在运行的进程
  3. 使用图像文件执行选项 (IFEO)。

在每个选项中我都可以看到符号(x crashme!* 有效)。

我无法使用 #1 (-server) 或 #2 (breakin.exe),因为我想调试身份验证提供程序的启动代码,所以我需要在 ntsd -d 下启动 LSASS.exe。我不能让它运行并稍后附加。

我的理解是我需要使用 IFEO。我使用 gflags.exe 而不是手动修改注册表,将可执行选项设置为

c:\dtw\ntsd -d -G -lines -x -y c:\symcache;c:\windows\system32 -n -srcpath C:\CrashMe\ 
  • “我可以中断应用程序”,但我设置的断点永远不会被命中。
  • 我可以 .open 任何文件,但无法使用该文件设置断点。
  • 我可以检查(检查)任何
  • 我看不到源代码的符号。

如何通过 windbg -k 查看在 ntsd -d 下运行的进程的 DLL 源代码?

I can't make source code show in windbg when I pipe ntsd -d on the target through windbg -k, but it works when I debug locally.

I want to debug the very first code execution of Winlogon.exe and LSASS.exe. But to make it easy to reproduce the problem, I made up this setup:

  • I use the CrashMe sample application, with source and symbols pre-built, copied to C:\CrashMe on both the target and host
  • I use Windows Debugging tools for Windows (DTW) version 6.12.0002.633 everywhere.
  • The target is running Windows XP SP3, the host Windows 7 ultimate.
  • Every path and settings is the same on both machine : path to DTW and path to crashme.
  • I always use fully qualified path (like c:\dtw\ntsd.exe).
  • I run a XP in a VM, booted with /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200

I am able to debug locally with this command, launched from C:\CrashMe:

windbg -g -G -srcpath C:\CrashMe -y C:\CrashMe debug\CrashMe.exe

I can launch the Windows XP virtual machine and connect to it with this command:

windbg -n -k com:pipe,port=\\.\pipe\com_1,reconnect -srcpath SRV*;C:\CrashMe -y   
c:\windows\system32;c:\windows\symbols;C:\CrashMe\debug  

But I need to debug a remote machine. On the target, I have these choices:

  1. Debug through -server and -remote
  2. Breaking in a running process
  3. Use Image File Execution Options (IFEO).

In each of these options I can see the symbols (x crashme!* works).

I cannot use #1 (-server) or #2 (breakin.exe <pid>), because I want to debug the startup code of an authentication provider, so I need LSASS.exe start under ntsd -d. I can't let it run and attach later on.

My understanding is that I need to use IFEO. Using gflags.exe instead of modifying the registry manually, I set executable options to

c:\dtw\ntsd -d -G -lines -x -y c:\symcache;c:\windows\system32 -n -srcpath C:\CrashMe\ 
  • I can breakin the application, but breakpoints I set are never hit.
  • I can .open any file, but I can't use the file to set breakpoint.
  • I can x (examine) any symbol
  • I can not see the source code.

How can I see my DLL source code of a process running under ntsd -d through windbg -k?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

疏忽 2024-11-22 01:20:41

TL;DR:使用 -server-ddefer 并通过第二个 Windbg 会话进行连接,该会话设置了 .lsrcpath 以获取您想要的内容。

其余的部分:
源模式需要从运行调试器的系统访问源文件。在通过内核模式连接调试用户模式代码的情况下,这变得很棘手。由于测试是在目标机器上的 ntsd 上下文中执行的,并且该机器已进入调试器,因此加载源文件通常不起作用。我相信,如果您在目标计算机上放置完整的源代码树或将源路径指向共享,则可能会发生这种情况,但我尚未验证这一点。

我验证的是 您可以使用此方法将源文件加载到您的主机中

这是通过执行以下操作来实现的:

  1. 启动主机内核调试器
  2. 在目标计算机上启动 ntsd(例如)“ntsd -server tcp:port=50000 -ddefer test.exe”
  3. Start与调试服务器的连接(例如,在 WinDbg 中,我使用 ctrl+r `tcp:port=50000,server=tawnos-target`)
  4. 连接将挂起。切换到内核调试器(应该位于“Input>”)并运行“.sleep 5000”以允许连接完成
  5. 此时,您的远程连接应该完成。您现在可以根据需要重新加载符号并使用 .lsrcpath 设置 Windbg 将使用的 srcpath 以查看源代码

TL;DR: Use -server <TRANSPORT> -ddefer and connect through a second windbg session that has .lsrcpath set to get what you want.

The rest:
Source mode requires access from the system running the debugger to the source files. In the case of debugging user mode code over the kernel mode connection, this becomes tricky. Since the test is executing in the context of ntsd on the target machine, and that machine is broken into the debugger, loading source files generally doesn't work. I believe if you put a full source tree on the target machine or pointed the source path to a share, it might, but I haven't verified that.

What I did verify is that you can use this method to get source files loaded in your host machine.

This works by doing the following:

  1. Start your host kernel debugger
  2. Start ntsd on the target machine with (for example) `ntsd -server tcp:port=50000 -ddefer test.exe`
  3. Start a connection to your debug server (e.g. in WinDbg I use ctrl+r `tcp:port=50000,server=tawnos-target`)
  4. The connection will hang starting. Switch to your kernel debugger (which should be sitting at Input>) and run `.sleep 5000` to allow the connection to complete
  5. At this point, your remote connection should complete. You can now reload symbols as needed and use .lsrcpath to set a srcpath that windbg will use in order to view source code
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文