DebugActiveProcess崩溃

时间:2017-06-07 20:57:03

标签: c# windows api debugging

我正在尝试在处理暂停状态时调试子进程。问题是,当我尝试这样做时,应用程序不会启动(它会启动但会立即退出)。这有助于逆向工程,但是我无法管理它。

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调用失败,它们是实际问题。如果我评论他们的行,应用程序执行。它也是滞后的,可能是因为调试循环。有解决方案吗?

Edit2:我按照你的建议编辑了代码,除了DEBUG_PROCESS,因为它停止了整个过程,我甚至无法通过任务管理器杀死它,唯一的方法就是重启PC 。也许,我做错了什么,但我不知道是什么。所以消息框出现的顺序是:DebugActiveProcess执行 - > WaitForDebugEvent已执行 - >执行CREATE_PROCESS_DEBUG_EVENT - >最后一次ContinueDebugEvent已执行。等等...... - > CloseHandle - > ContinueDebug ...

1 个答案:

答案 0 :(得分:2)

1)当您希望通过CreateProcess创建的调试流程时,在 dwCreationFlags 中设置DEBUG_PROCESS

2)在这种情况下永远不要调用DebugActiveProcess - 这个api内部创建进程中的远程线程 - DbgUiRemoteBreakIn - 所以进程开始初始化不是在主线程中而是在这个线程上。在xp上说这导致进程初始化失败。后者(开始形式win7?)这个固定。

3)ContinueDebugEvent需要在每次调试事件后调用始终。在EXIT_PROCESS_DEBUG_EVENT - 之后 - 需要了解此消息会在退出时向您发送最后一个正在处理的帖子。并且他等待你的电话ContinueDebugEvent - 进程仍然有效且当你EXIT_PROCESS_DEBUG_EVENT时没有终止 - 所以你必须在 swith <之后对ContinueDebugEvent进行一次公共呼叫/ p>

4)您尝试使用VirtualProtectEx进行todo时必须提出无限STATUS_GUARD_PAGE_VIOLATION个例外。所以即使不是更多 - 保护的主要逻辑&#34;无效

5)句柄LOAD_DLL_DEBUG_EVENT 必需 - 你必须关闭句柄(hFile到加载的DLL)

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

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