WEB开发网
开发学院软件开发VC Win32 调试接口设计与实现浅析 阅读

Win32 调试接口设计与实现浅析

 2006-07-17 11:08:57 来源:WEB开发网   
核心提示: 不过此种方法很容易被调试器直接修改PEB内存结构所欺骗,故而有另外一种直接通过检查EPROCESS->DebugPort字段是否被使用,Win32 调试接口设计与实现浅析(3),来判断此进程是否正在被调试的方法,以前水木上也有过几次讨论,DebugActiveProcess的伪代码如

不过此种方法很容易被调试器直接修改PEB内存结构所欺骗,故而有另外一种直接通过检查EPROCESS->DebugPort字段是否被使用,来判断此进程是否正在被调试的方法。以前水木上也有过几次讨论,如blowfish的《检测debugger的方法补遗》一文给出的代码。Windows XP/2003开始由Win32 API提供的 CheckRemoteDebuggerPresent 函数也是使用相同的思路,通过调用 NtQueryInformationProcess 函数查询调试端口实现的,伪代码如下:

以下为引用:
BOOL CheckRemoteDebuggerPresent(HANDLE hProcess, PBOOL pbDebuggerPresent)
{
 enum PROCESS_INFO_CLASS { ProcessDebugPort = 7 };
 if(hProcess && pbDebuggerPresent)
 {
  HANDLE hPort;
  *pbDebuggerPresent = NT_SUCCESS(NtQueryInformationProcess(hProcess, ProcessDebugPort, &hPort, sizeof(hPort), NULL)) ? TRUE : FALSE;
  return *pbDebuggerPresent;
 }
 return FALSE;
}

与直接创建被调试程序的新进程不同,调试已启动进程的 DebugActiveProcess 函数首先连接到Win32 系统调试服务器的端口上,然后激活当前正在运行的被调试进程的调试端口。DebugActiveProcess的伪代码如下:

以下为引用:
BOOL DebugActiveProcess(DWORD dwProcessId)
{
 if(DbgUiConnectToDbg())
 {
  HANDLE hProcess = ProcessIdToHandle(dwProcessId);
  if(hProcess)
  {
   DbgUiDebugActiveProcess(hProcess);
   NtClose(hProcess);
  }
 }
 return FALSE;
}

DbgUiConnectToDbg函数(ntos\dll\dlluistb.c:27)尝试连接核心提供的调试子系统端口(名为"\DbgUiApiPort"),如果成功连接会获得一个端口对象(保存在DbgUiApiPort NtCurrentTeb()->DbgSsReserved[1]),和一个调试状态转换的信号灯句柄(保存在DbgStateChangeSemaphore NtCurrentTeb()->DbgSsReserved[0])用于等待调试事件。伪代码如下:

上一页  1 2 3 4  下一页

Tags:Win 调试 接口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接