我正在尝试在处理暂停状态时调试子进程。问题是,当我尝试这样做时,应用程序不会启动(它会启动但会立即退出)。这有助于逆向工程,但是我无法管理它。
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 ...
答案 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内部工作如何导致严重错误