简介

将详细分析Windows调试的内核模式接口。希望读者对C和通用NT内核体系结构和语义有一些基本的了解。此外,这并不是介绍什么是调试或如何编写调试器。它可以作为经验丰富的调试器编写人员或好奇的安全专家的参考。

内核用户模式调试支持

最后一块拼图以内核模式存在,并提供了我们到目前为止看到的事件和结构,以便调试可以工作。Dbgk不依赖KD,它是一个完全不同的组件,因为Windows XP提供了自己的对象和系统调用来管理它。以前的Windows版本没有这样的对象,而是依赖于静态数据结构,该结构将在内存中进行分析,然后用于通过Windows的本地过程调用(LPC)机制发送的各种通知。

这些系统调用的可用性和调试对象的存在的一个好处是内核模式驱动程序也可以参与用户模式调试。虽然这可能不是这个新设计的目标之一,但它是一些人应该感兴趣的特性。虽然没有导出实际的Nt*调用,但是它们仍然可以被知道其系统调用ID的驱动程序访问。即使这个数字在每个OS版本之间发生变化,在驱动程序中保留一个表还是相对容易的。通过将TDI接口添加到这样的驱动程序中,可以开发一个高速远程调试器驱动程序,它将完全没有用户模式组件,从而允许远程调试机器上的每个进程。

我们要做的第一件事是查看实现用户模式调试的实际对象,DEBUG_OBJECT:

//
//Debug Object//typedef struct_DEBUG_OBJECT
{
KEVENT EventsPresent;
FAST_MUTEX Mutex;
LIST_ENTRY EventList;
union
{
ULONG Flags;
struct{
UCHAR DebuggerInactive:
1;
UCHAR KillProcessOnExit:
1;
};
};
} DEBUG_OBJECT,
*PDEBUG_OBJECT;

标签: none

添加新评论