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();调用,中空进程正常运行,但反调试器似乎无法阻止任何调试器。但是,如果我加入线程,反调试工作和调试消息都会正确处理,但进程最终不会运行(永远保持挂起状态)。
任何可能导致此问题的想法?我已经试图解决这个问题几天,但到目前为止我的努力都没有结果。任何意见都将非常感激。
提前谢谢。