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])用于等待调试事件。伪代码如下:
更多精彩
赞助商链接