文章目录
网上很多帖子讲解调试器的理论、架构与实现,但是很少有帖子涉及到调试器与被调试进程的拆离以及如何结束被调试进程(换了百度、谷歌、必应均没有搜到相关的帖子)
我在这里简单说一下实现
拆离调试器与被调试进程
调用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);
标签:拆离,BOOL,进程,DWORD,调试,调试器 来源: https://blog.csdn.net/weixin_43956962/article/details/106720214
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。