将调试器附加到进程而不创建新线程

时间:2016-07-10 20:14:50

标签: c multithreading debugging winapi reverse-engineering

我想将调试器附加到另一个进程,但我需要附加调试器而不创建新线程。通常,当调试器附加到进程时,它会在目标进程中创建一个新线程,并在创建的线程中执行一个名为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

帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

刚刚找到解决方案,

WinDbg中有一个名为"非侵入性调试"的选项。使用此选项,调试器不会尝试在目标进程中创建新线程。

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

enter image description here

你很高兴去!

感谢RbMm澄清这个问题!

- 编辑 -

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