(C#)WaitForDebugEvent在没有异常或原因的情况下失败

时间:2017-09-25 02:22:26

标签: c# multithreading debugging winapi memory

Hello工程师大家好。

我正在编写一个反调试器,试图保护通过进程挖空创建的进程。我的进程是使用CreateProcess创建的,我传递的进程创建标志是0x00000004(CREATE_SUSPENDED)。我在内存中手动映射PE的部分和头部并分配必要的内存,然后运行ResumeThread()然后,我启动一个新的线程,使用WinAPI的调试方法在进程上运行反调试器

执行反调试的代码如下:

    public void StartProtection(Win32Api.ProcessInformation processInfo, int sizeOfHeaders, int imageBase)
    {
        Win32Api.DEBUG_EVENT debugEvent = default(Win32Api.DEBUG_EVENT);

        int processId = Win32Api.GetProcessId(processInfo.ProcessHandle);
        if (processId == 0) return;

        if (!Win32Api.DebugActiveProcess(processId))
            return;

        Win32Api.DebugSetProcessKillOnExit(true);

        int oldProtection = 0;
        bool flag = true;
        while (flag)
        {
            if (Win32Api.WaitForDebugEvent(ref debugEvent, -1))
            {
                switch (debugEvent.dwDebugEventCode - (Win32Api.DebugEventType)1)
                {
                    case 0:
                        if (debugEvent.Exception.ExceptionRecord.ExceptionCode == 0x80000001)
                        {
                            Win32Api.ContinueDebugEvent(processId, (int)processInfo.ThreadId, 65538);
                            if (!VirtualProtectEx(processInfo.ProcessHandle, imageBase, sizeOfHeaders, 320,
                                ref oldProtection))
                                return;
                        }
                        break;
                    case 2:
                        if (VirtualProtectEx(processInfo.ProcessHandle, imageBase, sizeOfHeaders, 320,
                            ref oldProtection))
                        {
                            Api.ResumeThread(processInfo.ThreadHandle);
                            CloseHandle(debugEvent.LoadDll.hFile);
                        }
                        break;
                    case 4:
                        flag = false;
                        Win32Api.DebugActiveProcessStop(processId);
                        break;

                }
                Win32Api.ContinueDebugEvent(processId, (int)processInfo.ThreadId, 65538);
            }
        }
    }

在逐步调试时,当我输入以下行时,它会在意外停止之前继续进行几次:

if (Win32Api.WaitForDebugEvent(ref debugEvent, -1))

我像这样调用反调试器线程:

                ThreadStart threadStart = ctx.RunAntiDebugger;
                Thread thread = new Thread(threadStart) { IsBackground = true };
                thread.Start();
                thread.Join();

(RunAntiDebugger只是一个包装函数,使用正确的参数调用上面的StartProtection函数)

上述线程启动代码后面的行是:

            if (Api.ResumeThread(ctx.ProcessInformation.ThreadHandle) == -1)
                return false;

如果我删除了thread.Join();调用,中空进程正常运行,但反调试器似乎无法阻止任何调试器。但是,如果我加入线程,反调试工作和调试消息都会正确处理,但进程最终不会运行(永远保持挂起状态)。

任何可能导致此问题的想法?我已经试图解决这个问题几天,但到目前为止我的努力都没有结果。任何意见都将非常感激。

提前谢谢。

0 个答案:

没有答案