c - 在不创建新线程的情况下将调试器附加到进程

标签 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

帮助将不胜感激!

最佳答案

刚找到解决方案,

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

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

enter image description here

一切顺利!

感谢 RbMm 澄清这个问题!

-- 编辑 --

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

关于c - 在不创建新线程的情况下将调试器附加到进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38296095/

相关文章:

c++ - 为什么 pthread_exit 的行为类似于 pthread_join?

java - 带有时间戳的 StacktraceElement

C++11 多线程问题

c++ - 具有多个客户端的服务器 : how to forward message from one client to another

javascript - 检查 JavaScript 中是否存在对象

c - 需要 C 语言的 main 函数,用于微 Controller

c - 从输入中获取选择

python - 在Python中读取C数组

Perl 调试器 - 出错时中断(异常)?

debugging - 使用GDB调试GNU汇编程序时使宏扩展