russinovich和cogswell的独具特色的方法是:通过简单的向kiservicetable数组中放入一个不同的处理例程来hook所有api调用。这个处理例程最终会调用位于ntoskrnl.exe中的原始处理例程,但它有机会察看一下被调用函数的输入/输出参数。这个方法非常强大却又如此简单。因为所有用户模式的线程必须经过这个“针眼”才能获得native api的服务,安装一个全局hook来简单的替换一个函数指针的方法,在启动一个新的进程和线程的情况下,也能很稳定的工作。这并不需要一种通讯机制来通知新加入或将要移除的进程/线程。
不幸的是,系统服务表在不同windows nt版本上不相同。表5-1比较了windows nt/2000的kiservicetable。很显然,不仅是处理例程的号码从211增加到了248,而且新的处理例程并不是直接添加到列表的末尾,而是被插入到了各个地方!因此,一个服务函数索引,如0x20在windows 2000中指向ntcreatefile(),而在windows nt中却指向ntcreateprofile()。所以,通过操作服务函数表进行hook的api调用监控器必须小心的检查它所在的windows nt的版本。这可以通过如下几个方式来完成: