|
Windows服务调用机制(3) 五、Windows 2000系统服务调用类型
在Windows 2000中默认存在两个系统服务调度表,它们对应了两类不同的系统服务。这两个系统服务调度表分别是:KeServiceDescriptorTable和KeServiceDescriptorTableShadow。
Windows 2000执行程序服务对应于NTDLL.dll为我们提供的系统服务调用。子系统通过调用NTDLL.dll中的函数接口来实现它们需要的功能。系统服务调度表KeServiceDescriptorTable定义了在ntoskrln.exe中实现的系统服务,通常在kernel32.dll/advapi32.dll中提供的函数接口均是调用的这个系统服务调度表中。
同时存在于Windows 2000操作系统中还有在Win32k.sys中实现的相关Win32USER和GDI函数,它们是属于另一类系统服务调用。与之对应的系统服务调度表为KeServiceDescriptorTableShadow,它提供了内核模式实现的USER和GDI服务。函数KeAddSystemServiceTable允许Win32.sys和其他设备驱动程序添加系统服务表。除了Win32k.sys服务表外,使用KeAddSystemServiceTable添加的服务表会被同时复制到KeServiceDescriptorTable和KeServiceDescriptorTableShadow中去。
我们可以看出这两类函数实现在服务调度上的区别:Win32内核API经过Kernel32.dll/advapi32.dll进入NTDLL.dll后使用int 0x2e中断进入内核,最后在Ntoskrnl.exe中实现了真正的函数调用;Win32 USER/GDI API直接通过User32.dll/Gdi32.dll进入了内核,最后却是在Win32k.sys中实现了真正的函数调用。在此我们只讨论与NTDLL.dll相关的函数,也就是我们例子中处理的函数。
六、Hook系统服务调用的作用
钩子(Hooking)是一种拦截/监听可执行代码在执行过程中相关信息的一种通用机制。它使我们了解系统内部结构,运作机制甚至修改系统行为的想法成为可能。在一个像M$存在的世界里,Windows的很多内部信息我们都是无法得知的,因为Windows不是Linux,但这并不意味着我们就此放弃!只要开动你的大脑,很多事情都会变成可能。
1. 事件追踪
你想知道Windows在什么时候会打开一个进程吗?你想知道Windows任务管理器中进程相关信息的获取调用了哪些函数吗?我们都可以使用Hook技术来实现这些你想要的信息。我们可以追踪ZwOpenProcess的执行情况,我们同样也可以追踪ZwQueryInformationProcess的执行情况,包括传递的参数和返回的结果。大家可以看到本文相关的程序T-ProcMon就是一个进程监视工具,它会追踪系统中与进程相关的各种信息。在某些我们期望的事件发生时,程序会通知用户发生了什么,这也是我们期望看到的结果。
2. 修改系统行为
操作系统为我们提供了一些通用的功能,如查询系统进程信息ZwQuerySystemInformation(SystemInformationClass == 5),它会返回系统中当前所有进程/线程的相关信息。如果我们希望隐藏一些特殊的进程那该怎么办呢?那就是修改系统服务调用,也就是修改ZwQuerySystemInformation的行为。在查询系统进程时,系统会返回一个进程信息队列,每个单元对应一个进程,如果我们想隐藏其中的某个进程,只须修改队列中的某些数据,然后返回给上层函数,它们就不会发现Xxx.exe进程存在于系统之中了。
3. 研究系统内部机制
微软提供的Windows操作系统是一个“封闭”的系统,很多内部资料都没有公布,我们可以通过Hook技术来探测系统的内部数据结构和运行机制,学习操作系统内部的操作方式。基于Hook的Windows内核黑客技术(Kernel Hacking)是非常之流行和有效,在我们探测系统的一些未公开,未文档化的技术细节时我们都可以使用钩子技术。
4. 其他
其他如我们要调试一个非常麻烦的程序时就可以使用Hook技术,这样就可以更好的帮助我们追踪系统的行动,更好的了解程序内部的执行过程。同样,为了获取系统的一些特殊性能数据,我们也可以在特定的情况下使用Hook技术。
七、Hook系统服务调用的实现
|