当我将OllyDbg或ImmunityDebugger附加到进程时,它会自动中断执行。我附加到以SYSTEM身份运行的用户模式服务,仅需要捕获异常,因此这不是理想的选择。有没有一种方法可以禁用“断开连接”行为?

评论

您想将调试器附加到程序上并立即执行“继续”,是否正确?

差不多了我宁愿完全避免断点。我只希望调试器在发生异常时中断。

@Polynomial是否也可以选择反调试技术?

@DenisLaskov一个选项?我不确定是否要关注。

@Polynomial:嗯,为什么这么苛刻? a。)我可能只是投票而未告诉您原因,所以您永远不会知道b。)对问题的投票会影响您的代表(true)但对我的代表不利(因此即使您一直检查每个人的代表,您也无法告诉谁被否决了c)您可以简单地编辑您的问题以减少歧义,我很乐意收回我的被否决票-它甚至可能最终会被否决。最后但并非最不重要的一点是,我支持弃权票及其理由。答案的下注会同时影响投票者的投票权(投票者为-1,投票者为-2)。但是,请查看我的个人资料,我也投票赞成;)

#1 楼

说明
连接中断是由于调用了ntdllDbgUiRemoteBreakinDbgBreakPoint函数。如果检查调试器OllyDbg或ImmunityDebugger调用的kernel32函数,则会看到对DebugActiveProcessCreateRemoteThreadCreateRemoteThreadEx函数的调用,具体取决于您的操作系统。
所以,我想一种绕过中断的方法是:

调试器本身进行调试
转到ZwCreateThreadEx函数并发现对创建远程线程的函数的调用。
如果将DbgUiIssueRemoteBreakin / lpStartAddress更改为CreateRemoteThread,请更改CreateRemoteThreadEx参数+ 1个DbgBreakPoint


插件
我创建了一个OllyDbg v1.10插件,该插件在选择的PID的过程中RETN 0xC3NOP中的INT3。它仅在Windows 7上经过测试。
用法
将SilentAttach.dll放在OllyDbg目录中,启动OllyDbg,按Alt + F12,然后输入要静默附加的进程的进程ID。 br /> NB
因为没有中断,所以OllyDbg不会提取很多信息。例如加载模块的列表。因此,您必须通过类似Alt + E然后Alt + C
的方式来激活上下文。

评论


这可能是最好的解决方案,因为它不会与DbgBreakPoint混淆。只需在要附加的过程中NOP调用DbgUiRemoteBreakin中的DbgBreakPoint。

–彼得·安德森(Peter Andersson)
13年4月12日在18:20

插件的链接已消失,是否有机会得到它?

–尼古拉斯B.
15年1月20日在16:11

#2 楼

一种方法是让OllyDbg插件执行一个

WriteProcessMemory(hDebuggee, GetProcAddress(GetModuleHandle("ntdll"), "DbgBreakPoint"), &mynop, 1, NULL)

其中hDebuggee是要调试的进程的句柄(我相信OllyDbg具有一个API来检索此值),而mynop是一个变量,它保存一个0x90字节(nop指令)。这是一种常见的反调试技巧。

评论


我收回之前说过的话。这是通常的OllyDbg附加冻结错误。这按预期工作。可能是最容易实现的一种!

–彼得·安德森(Peter Andersson)
13年4月12日在18:23

#3 楼

我认为如果不做一些极具侵略性的事情,这是不可能的。修补OllyDbg以使用替代的ZwXX / NtXX函数(该函数接受一些标志)或修补内核。最初的中断是由操作系统完成的,因此调试器可以收集有关其附加到的进程的信息。

我还没有验证,但我猜测OllyDbg正在调用DebugActiveProcess以便附加到它。它的文档指出:系统检查进程标识符并确定正在创建有效的调试附件后,该函数将返回TRUE。然后,期望调试器通过使用WaitForDebugEvent函数来等待调试事件。系统会挂起进程中的所有线程,并发送代表进程当前状态的调试器事件。


随后是


完成所有这些操作后,系统将恢复该进程中的所有线程。当进程中的第一个线程恢复时,它将执行一个断点指令,该指令使EXCEPTION_DEBUG_EVENT调试事件发送到调试器。使用正常的机制和规则,所有将来的调试事件都将发送到调试器。


评论


臭虫我以为Windows上的本地内核调试不能以相同的方式工作?

–多项式
13年4月12日在14:32