文章目录
网上很多帖子讲解调试器的理论、架构与实现,但是很少有帖子涉及到调试器与被调试进程的拆离以及如何结束被调试进程(换了百度、谷歌、必应均没有搜到相关的帖子)
我在这里简单说一下实现
拆离调试器与被调试进程
调用windowsAPI DebugActiveProcessStop 停止调试器调试指定的进程
BOOL DebugActiveProcessStop(
DWORD dwProcessId
);
参数进程ID 可以在调试器创建进程时调用 CreateProcess 的最后一个参数 lpProcessInformation 中记录
创建完成调试进程后,别忘记调用 CloseHandle 关闭 lpProcessInformation 中的 进程与线程句柄
BOOL CreateProcessW(
LPCWSTR lpApplicationName,
LPWSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
拆离调试器与被调试进程别忘记修复断点,调用 ContinueDebugEvent 继续执行被调试线程
BOOL ContinueDebugEvent(
DWORD dwProcessId,
DWORD dwThreadId,
DWORD dwContinueStatus
);
调试器退出时拆离被调试进程
windows默认调试器退出时终止被调试进程,
我们可以调用 DebugSetProcessKillOnExit 参数传入FALSE,来修改调试器退出时要执行的操作
可以多次调用此函数以根据需要更改操作
BOOL DebugSetProcessKillOnExit(
BOOL KillOnExit
);
KillOnExit 如果为TRUE,则线程将在退出时终止所有附加进程(请注意,这是默认设置);
KillOnExit 如果为FALSE,线程将与退出时正在调试的所有进程分离。
结束被调试进程
被调试进程只有与被调试进程拆离后,才可以正常的结束
调用 TerminateProcess 终止指定的进程及其所有线程
BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
/* 例:*/
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID), 0);