当我将 OllyDbg 或 ImmunityDebugger 附加到进程时,它会自动中断执行。我附加到以 SYSTEM 身份运行的用户模式服务,只需要捕获异常,所以这并不理想。有没有办法禁用断开连接行为?
如何防止 Immunity Debugger / OllyDbg 在附加时中断?
解释
attach 中断是由于调用了ntdll
DbgUiRemoteBreakin
和DbgBreakPoint
函数。如果检查kernel32
DebugActiveProcess
调试器,OllyDbg的或ImmunityDebugger调用的函数,你会看到在一个电话CreateRemoteThread
,CreateRemoteThreadEx
或者ZwCreateThreadEx
根据您的操作系统的功能。
所以,我想绕过破坏的一种方法是:
- 调试调试器本身
- 转到该
DbgUiIssueRemoteBreakin
函数并找到对创建远程线程的函数的调用。 - 将/ 的
lpStartAddress
情况下的参数更改为+1CreateRemoteThread
CreateRemoteThreadEx
DbgBreakPoint
RETN 0xC3
插入
我创建了一个OllyDbg的1.10版的插件,其NOP
S中INT3
在DbgBreakPoint
与您选择的PID的进程。它仅在 Windows 7 上进行过测试。
用法
将 SilentAttach.dll 放在 OllyDbg 目录下,启动 OllyDbg,按Alt+ F12,然后输入您要静默附加的进程的进程 ID。
NB 由于没有中断发生,OllyDbg 不会提取很多信息。例如加载模块列表。因此,您必须通过Alt+E然后Alt+ 之类的方式激活上下文C
一种方法是使用 OllyDbg 插件来执行
WriteProcessMemory(hDebuggee, GetProcAddress(GetModuleHandle("ntdll"), "DbgBreakPoint"), &mynop, 1, NULL)
其中 hDebuggee 是被调试进程的句柄(我相信 OllyDbg 有一个用于检索这个值的 API),而 mynop 是一个保存 0x90 字节(nop 指令)的变量。
这将清除导致中断的 int3 指令,允许立即继续执行。这是一个常见的反调试技巧。
我认为如果不做一些极具侵入性的事情,这是不可能的。要么修补 OllyDbg 以使用接受某些标志的替代 ZwXX/NtXX 函数,要么修补内核。初始中断由操作系统完成,以便调试器可以收集有关它所附加到的进程的信息。
我还没有验证,但我的猜测是 OllyDbg 正在调用DebugActiveProcess以附加到它。它的文档指出:
在系统检查进程标识符并确定正在制作有效的调试附件后,该函数返回 TRUE。然后,调试器应使用 WaitForDebugEvent 函数等待调试事件。系统挂起进程中的所有线程,并发送代表进程当前状态的调试器事件。
后来
完成所有这些后,系统将恢复进程中的所有线程。当进程中的第一个线程恢复时,它执行断点指令,导致将 EXCEPTION_DEBUG_EVENT 调试事件发送到调试器。所有未来的调试事件都使用正常的机制和规则发送到调试器。