在Windows中如何交换调试器?

我有一个进程A,它创建自身的副本:

,然后使用WaitForDebugEvent(50ms)修改其B的控制流来调试其子级(进程B)。在高度活跃的启动之后,除非我单击B中的按钮,否则WaitForDebugEvent将会超时(返回false)。

问题:如何摆脱调试器(进程A)并将自己的调试器附加到B?

我试图通过将代码注入A(DLL注入)以及调试A和A来调用DebugActiveProcessStop从调试B的线程调用它(内联代码注入),两种方式都会得到ACCESS_DENIED

如果尝试连接第二个调试器,则会得到Error 87 (ERROR_INVALID_PARAMETER)。赢得7 x64

评论

第二次附加失败应导致错误0xc000048而不是错误0n87该进程可能无法调试自身的确切副本,因为这将导致连锁反应。 (每个副本都会复制自己并生成一个孩子,直到资源耗尽为止)

@blabb,代码可以创建一个互斥锁以防止这种情况发生,请参阅G.i节。 “最终”反调试参考中的内容

#1 楼

使用ProcessHacker暂停父进程,然后尝试停止从Processhacker移除调试器

#2 楼

首先,您必须查找要调用的IsDebuggerPresent并将EAX寄存器中的返回值修改为0。然后,必须找到调用GetCurrentProcessId并使用您的虚拟进程ID修改输入参数。在启动新线程之前必须执行的第二个过程,然后才能将调试器附加到该子进程。
我在多合一键盘记录器中遇到了相同的情况