#1 楼
说明连接中断是由于调用了
ntdll
,DbgUiRemoteBreakin
和DbgBreakPoint
函数。如果检查调试器OllyDbg或ImmunityDebugger调用的kernel32
函数,则会看到对DebugActiveProcess
,CreateRemoteThread
或CreateRemoteThreadEx
函数的调用,具体取决于您的操作系统。所以,我想一种绕过中断的方法是:
调试器本身进行调试
转到
ZwCreateThreadEx
函数并发现对创建远程线程的函数的调用。如果将
DbgUiIssueRemoteBreakin
/ lpStartAddress
更改为CreateRemoteThread
,请更改CreateRemoteThreadEx
参数+ 1个DbgBreakPoint
插件
我创建了一个OllyDbg v1.10插件,该插件在选择的PID的过程中
RETN 0xC3
是NOP
中的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
评论
您想将调试器附加到程序上并立即执行“继续”,是否正确?差不多了我宁愿完全避免断点。我只希望调试器在发生异常时中断。
@Polynomial是否也可以选择反调试技术?
@DenisLaskov一个选项?我不确定是否要关注。
@Polynomial:嗯,为什么这么苛刻? a。)我可能只是投票而未告诉您原因,所以您永远不会知道b。)对问题的投票会影响您的代表(true)但对我的代表不利(因此即使您一直检查每个人的代表,您也无法告诉谁被否决了c)您可以简单地编辑您的问题以减少歧义,我很乐意收回我的被否决票-它甚至可能最终会被否决。最后但并非最不重要的一点是,我支持弃权票及其理由。答案的下注会同时影响投票者的投票权(投票者为-1,投票者为-2)。但是,请查看我的个人资料,我也投票赞成;)