我正在尝试调试处于挂起状态的子进程。问题是,当我尝试这样做时,应用程序不会启动(它会启动,但会立即退出)。这有助于反对逆向工程,但我无法做到这一点。

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:我按照你的建议编辑了代码,除了调试过程,因为它停止了整个过程,我甚至不能通过任务管理器来终止它,唯一的方法就是重启电脑。也许,我做错了什么,但我不知道。所以消息框的显示顺序是:debugactiveprocess executed->waitfordebugevent executed->create_process_debug_event executed->last continuedebugevent executed。那就等等……->关闭句柄->继续缺陷…

最佳答案

1)如果希望通过CreateProcess创建调试进程,请在dwcreationflags中设置DEBUG_PROCESS
2)在这种情况下永远不要调用DebugActiveProcess-这个api内部在进程中创建远程线程-DbgUiRemoteBreakIn-所以进程开始初始化不是在它的主线程中而是在这个线程上。在xp上说,这导致进程初始化总是失败。后者(从win7开始?)这是固定的。
3)ContinueDebugEvent每次调试事件后都需要调用。在EXIT_PROCESS_DEBUG_EVENT之后-还需要了解此消息在退出时发送给您的最后一个线程。他会等待你的呼叫-当你接到呼叫后,进程仍然有效且没有终止-所以你必须在swith之后有一个公共呼叫
4)使用ContinueDebugEvent尝试执行的操作必须使无限的EXIT_PROCESS_DEBUG_EVENT异常。所以,即使不看更多,“保护”的主要逻辑是无效的
5)handleContinueDebugEvent是必需的-必须关闭handle(hFile到加载的dll)
6)在VirtualProtectEx上,还必须关闭文件句柄
7)当我们用STATUS_GUARD_PAGE_VIOLATION标记调用LOAD_DLL_DEBUG_EVENT时-使用CREATE_PROCESS_DEBUG_EVENT绝对没有意义-为了什么??通常此标志用于在进程开始以用户模式执行之前和此调用之后对进程执行某些任务。但是当我们在进程中使用CreateProcess初始线程时,当它开始执行(在内核模式下)时,发送给我们DEBUG_PROCESS并等待回复(直到调试器不调用CREATE_SUSPENDED。因此,我们可以在ResumeThread处理程序中完成所有具有流程的特殊任务。对windows内部工作方式的误解会导致严重错误

08-05 14:33