调试器与被调试进程的拆离以及结束被调试进程的实现

网上很多帖子讲解调试器的理论、架构与实现,但是很少有帖子涉及到调试器与被调试进程的拆离以及如何结束被调试进程(换了百度、谷歌、必应均没有搜到相关的帖子)
我在这里简单说一下实现

拆离调试器与被调试进程

调用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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值