DebugActiveProcess崩溃

我试图debugging一个subprocess,而它处于暂停状态。 问题是,当我尝试这样做时,应用程序无法启动(它启动,但立即退出)。 这有助于防止逆向工程,但是我无法做到这一点。

static void DebuggingTest(PROCESS_INFORMATION pi, int imageBase, int sizeOfHeaders) { int oldProtection = 0; const uint STATUS_GUARD_PAGE_VIOLATION = 0x80000001; const int DBG_CONTINUE = 0x00010002; DEBUG_EVENT evt = new DEBUG_EVENT(); if (!DebugActiveProcess(Convert.ToInt32(pi.dwProcessId))) throw new Win32Exception(); else MessageBox.Show(pi.dwProcessId + " process is being debugged.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); while (true) { if (!WaitForDebugEvent(out evt, -1)) throw new Win32Exception(); else MessageBox.Show("WaitForDebugEvent executed.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); switch (evt.dwDebugEventCode) { case DebugEventType.CREATE_PROCESS_DEBUG_EVENT: //if (!VirtualProtectEx(pi.hProcess, imageBase, sizeOfHeaders, 320, ref oldProtection)) // throw new Exception(); ResumeThread(pi.hThread); MessageBox.Show("CREATE_PROCESS_DEBUG_EVENT executed.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); break; case DebugEventType.EXCEPTION_DEBUG_EVENT: if (evt.Exception.ExceptionRecord.ExceptionCode == STATUS_GUARD_PAGE_VIOLATION) { if (!VirtualProtectEx(pi.hProcess, imageBase, sizeOfHeaders, 320, ref oldProtection)) throw new Exception(); } MessageBox.Show("EXCEPTION_DEBUG_EVENT executed.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); break; case DebugEventType.EXIT_PROCESS_DEBUG_EVENT: if (!DebugActiveProcessStop(Convert.ToInt32(pi.dwProcessId))) throw new Win32Exception(); if (!TerminateProcess(pi.hProcess, 0)) throw new Win32Exception(); MessageBox.Show("EXIT_PROCESS_DEBUG_EVENT executed.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); break; case DebugEventType.LOAD_DLL_DEBUG_EVENT: if (CloseHandle(evt.LoadDll.hFile)) MessageBox.Show("CloseHandle executed.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); break; } if (ContinueDebugEvent(evt.dwProcessId, evt.dwThreadId, DBG_CONTINUE)) MessageBox.Show("Last ContinueDebugEvent executed.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); } } 

编辑:VirtualProtectEx调用失败,他们是实际的问题。 如果我注释他们的行,应用程序执行。 也可能是因为debugging循环而滞后。 有没有解决scheme?

Edit2:除了DEBUG_PROCESS之外,我编辑了代码,因为它停止了整个过程,我甚至无法通过任务pipe理器杀死它,杀死它的唯一方法就是重新启动PC。 也许,我做错了什么,但我不知道是什么。 所以消息框的顺序出现:DebugActiveProcess执行 – > WaitForDebugEvent执行 – > CREATE_PROCESS_DEBUG_EVENT执行 – >最后ContinueDebugEvent执行。 然后等待… – > CloseHandle – > ContinueDebug …

1)当你想通过CreateProcess创建调试过程时,在DEBUG_PROCESS中设置DEBUG_PROCESS

2)在这种情况下,从来没有调用DebugActiveProcess – 这个API内部创建远程线程正在进行 – DbgUiRemoteBreakIn – 所以进程开始初始化不在它的主线程,而是在这个线程。 对xp说这导致进程初始化总是失败。 后者(开始形式win7?)这个固定的。

3)每次调试事件后, ContinueDebugEvent需要始终调用。 EXIT_PROCESS_DEBUG_EVENT之后 – – 需要明白,这个消息发送给你最后一个线程在退出时处理。 并等待您的调用ContinueDebugEvent – 进程仍然活着,并没有终止,当你有EXIT_PROCESS_DEBUG_EVENT – 所以你必须有一个普通的调用后,开始ContinueDebugEvent 开关

4)您尝试使用VirtualProtectEx必须做出无限的STATUS_GUARD_PAGE_VIOLATION例外。 所以即使看不到更多 – “保护”的主要逻辑是无效的

5)句柄LOAD_DLL_DEBUG_EVENT强制性的 – 你必须关闭句柄( hFile到加载的DLL)

6)在CREATE_PROCESS_DEBUG_EVENT你也必须关闭文件句柄


7)当我们用DEBUG_PROCESS标志调用CreateProcess时 – 使用CREATE_SUSPENDED绝对没有意义 – 为什么? 通常这个标志用于在进程执行一些任务之前,在线程开始在用户模式下执行并在此之后调用ResumeThread 。 但是当我们在进程中使用DEBUG_PROCESS初始线程时,当它开始执行(在内核模式下)时,发送给我们CREATE_PROCESS_DEBUG_EVENT并等待回复(直到调试器没有调用ContinueDebugEvent为止,结果所有的具有特殊任务的进程都可以在CREATE_PROCESS_DEBUG_EVENT处理程序中完成。内部如何工作导致严重的错误