【问题标题】:Attach debugger to a process without creating a new thread将调试器附加到进程而不创建新线程
【发布时间】:2016-11-12 18:14:52
【问题描述】:

我想将调试器附加到另一个进程,但我需要在不创建新线程的情况下附加调试器。通常,当调试器附加到进程时,它会在目标进程中创建一个新线程,并在创建的线程中执行一个名为 ntdll!DbgBreakPoint 的例程。

此例程执行int3 指令,该指令允许调试器控制执行,因此当调试器启动时,这就是附加调试器后调用堆栈的样子:

ntdll!DbgBreakPoint
ntdll!DbgUiRemoteBreakin+0x39
KERNEL32!BaseThreadInitThunk+0x24
ntdll!__RtlUserThreadStart+0x2f
ntdll!_RtlUserThreadStart+0x1b

我需要在这些限制下附加调试器的原因是因为我需要在 ntdll 中调试新线程的创建,并且在线程已经创建后调试它没有任何意义。

因为我可以控制目标程序,所以我可以将主线程的上下文的程序计数器设置为我想要的任何值,因此我可以将第一个执行的指令设置为代码中某处的int 3,但我无法捕捉异常是因为当我附加调试器时,已经创建了线程,我又回到了同样的问题。

我已经尝试使用奇怪的 WinDbg/ollydbg/x64dbg 设置来解决我的问题,但我无法让它工作。所以就我而言,是否有任何调试器/调试方法可以让我在不创建远程线程的情况下附加到远程进程并捕获我的int 3

我们将不胜感激!

【问题讨论】:

  • 是的,存在 :) 绝对不需要在附加时创建新线程
  • @RbMm,您好,您能详细说明一下吗?
  • DbgEng.dll 在调用 NtDebugActiveProcess 后调用 DbgUiIssueRemoteBreakIn 创建远程线程 - DbgUiRemoteBreakin。你可以 nop(在开始时插入 ret)这个函数。在我自己的调试器中我没有调用它
  • 我很困惑,如果您想在应用程序开始创建线程之前附加调试器,为什么不直接从调试器启动进程?

标签: c multithreading debugging winapi reverse-engineering


【解决方案1】:

刚刚找到解决办法,

WinDbg 中有一个选项叫做“非侵入式调试”。使用此选项,调试器将不会尝试在目标进程中创建新线程。

要启用它,在附加到新进程时只需选中此框:

你很高兴!

感谢 RbMm 澄清这个问题!

-- 编辑--

此解决方案可以让您查看代码和寄存器,但它不会破坏 int 3 指令上的调试器,因此它不是一个好的解决方案。

【讨论】:

  • 但这是真正的调试吗?“可以检查进程,但不会收到调试事件” - 我在 self debugger9atach 中也有此选项,无需调试和挂起!)
  • 你发现的 - 不是你的调试和解决方案
  • 您的解决方案是否在int 3 上中断?
  • 不明白你的问题。我的调试器在 int 3 上中断了吗?
  • 是的。你捕捉到调试异常了吗?
猜你喜欢
  • 2013-09-29
  • 2019-08-12
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2010-10-07
  • 1970-01-01
  • 2014-07-11
相关资源
最近更新 更多