Windows系统服务调用Word文档下载推荐.docx
《Windows系统服务调用Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Windows系统服务调用Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
但是对于讨论一个因商业策略而出现的个人桌面操作
系统的确没有太大的价值。
所以我们将主要介绍一些关于NT系统内部结构的细节。
Windo
ws2000在实现其自身目标的过程中,我们有必要讲解一些它的特性。
1.可扩展性(Extensibility)
Windows2000操作系统是一个面向未来的系统,所以它非常注重自身的扩展性,因
为在将来可能有许多市场等方面的原因导致我们必须添加或删除目前操作系统的一些组
件,这就必须要求操作系统有较强的可扩展性。
为了满足扩充/删除的各种需求,Window
s2000提供了一个重要的设计思想就是子系统(Subsystem)。
我们可以将一些需要扩展的
操作系统功能作为一个子系统添加到Windows2000内,就像OS/2,POSIX等一样。
当然还
有一个特性就是,我们可以通过为系统服务调用添加钩子来修改系统的各项行为,这就
为我们提供了一个了解系统内部并扩展系统功能的机会。
2.可靠性和健壮性(ReliabilityandRobust)
一个系统存在的最基本的要求就是它的稳定性,没有稳定的环境就做不出任何满意
的产品。
为了满足这项要求,Windows2000提出了基于对象的访问控制权限的措施。
现
代的大多数微处理器都支持两种模式:
用户模式(User/Normal)和内核模式(Kernel/Priv
ileged)。
操作系统组件和关键的系统组件处于内核模式,而一般用户模式的程序只能访
问私有地址空间和执行非特权等级的指令。
如果用户要调用一些内核组件的功能,就得
通过系统服务调用来实现。
3.兼容性(Compatibility)
Intel和Microsoft能够做到今天的一个很重要的因素就是他们支持对过去存在系统
的兼容。
这一点非常的关键,没有人愿意三天两头的更换系统,当然也很少有人有这个
经济实力。
Windows2000为了实现对其他系统的兼容,如Dos,16位Windows等,出现了
环境子系统。
而在Windows2000中必须存在的环境子系统是Win32,它是其他子系统的基
础,其他子系统都是一些表面的接口,而实际上是调用了Win32提供的接口,而Win32最
终也是通过系统服务调用来与内核联系的。
虽然操作系统为各种环境子系统提供了不同
的动态链接库,而且其中的API函数名称往往也是不同的,不过这个函数的最终都是通过
相同的系统服务调用进入内核来实现的。
4.易维护性(Maintainability)
作为一个大型的项目,Windows2000的维护也成为了一个大型的工程。
而如此巨大
的项目没有很好的维护性是无法发展下去的。
为此,Windows2000使用了分层的思想,
这也是一种操作系统体系结构模型。
其中,系统服务调用将系统的内核模式代码和用户
模式代码隔离开来,子系统使用系统服务调用为用户提供应用程序编程接口(API),而系
统服务调用向下调用执行体实现各项功能。
就像在上文我们提到的操作系统存在的两种模式,这是建立在处理器的基础之上的
。
按理说,一般处理器可以提供从Ring0到Ring3的四种处理器模式,但是它们必须提供
至少两种,那就是Ring0和Ring3。
而一些特殊处理器指令只能在内核模式执行,而一些
地址空间必须在内核模式才可以被访问。
Windows2000就利用了这个特点,将操作系统
和其他关键组件保护起来,只有在内核模式才可以访问执行,而一般的用户程序就只能
在用户态执行咯,这样就可以避免一些用户程序对操作系统代码的破坏,也就是大家看
到的Windows2000明显比Windows9x稳定得多的主要原因。
下面我们给出了Windows
2000的体系结构简图:
系统支持进程,服务进程,应用程序,环境子系统
应用程序编程接口
基于NTDLL.dll的本地系统服务(用户模式)
-----------------------------------------
系统服务调用(内核模式)
执行体
系统内核,设备驱动程序
硬件抽象层
三>
Windows2000本机系统服务(NativeAPI)
Windows2000本机系统服务又称为Windows本机应用程序编程接口,它是由执行体(E
xecutive)为用户模式和内核模式的程序提供的系统服务集。
它包含两种类型的函数:
Wi
ndows执行系统服务的系统服务调度占位程序;
子系统,子系统DLL和其他本机映像使用
的内部支持函数。
从用户模式调用本机系统服务是通过NTDLL.dll来实现的。
表面上,Win32函数为编
程人员提供了很多接口来实现我们想要的功能,但是这些Win32函数只不过是本机应用程
序编程接口的一个包装器而已,它们将本机API包装起来,调用本机系统服务来实现用户
期望的功能。
也就是说NTDLL.dll只是系统服务调用接口在用户模式下的一个外壳。
关于
用户模式下的Windows本机系统服务的相关信息,请参见我以前写的一篇文章《探测Wind
ows2K/XP/2003本机系统信息》。
我们再谈谈从内核模式调用系统服务吧,这时就不是由NTDLL.dll导出系统服务调用
的函数接口了,而是由ntoskrnl.exe来实现的,它会提供两种形式的函数:
ZwXxx和NtXx
x,在此我们就不多说了。
大家应该注意到了,在上面我们介绍的Windows2000系统体系
结构中的系统服务调用,执行体和内核都是存在于ntoskrnl.exe(在多处理器中为ntkrnl
mp.exe)之中,并且是分层的。
四>
Windows2000系统服务调用机制
Windows2000的陷阱调度(TrapDispatching)机制包括了:
中断(Interrupt),延迟
过程调用(DeferredProcedureCall),异步过程调用(AsynchronousProcedureCall)
,异常调度(ExceptionDispatching)和系统服务调用。
在Intelx86的Windows2000系
统中,处理器执行int0x2e指令来激活Windows系统服务调用;
在Intelx86的Windows
XP系统中处理器却是通过执行sysenter指令使系统陷入系统服务调用程序中;
而在AMD的
WindowsXP中使用了指令syscall来实现同样的功能。
我们暂时使用x86的Windows2000
为例来演示。
我们先给出一个系统服务调用的模型:
moveax,ServiceId
leaedx,ParameterTable
int2eh
retParamTableBytes
其中,ServiceId清楚的说明了传递给系统服务调用的系统服务号,内核使用这个标
识符来查找系统服务调度表(SystemServiceDispathTable)中的对应系统服务信息。
在系统服务调度表中的每一项包含了一个指向系统服务程序的指针,我们Hook时就是修
改这个指针使其指向我们自定义的系统服务的地址。
ParameterTable是传递的参数,系
统服务调用程序KiSystemService必须严格校验传递的每一个参数,并将其参数从线程的
用户堆栈中复制到系统的核心堆栈以备使用。
由于执行int指令会导致陷阱发生,所以在
Windows2000内的中断描述表(IDT=InterruptDescriptorTable)中的0x2e项指向了
系统服务调用程序。
最后返回的ParamTableBytes是关于参数个数的信息。
现在我们已经看得出来了,系统服务调用只是一个接口,它提供了将用户模式下的
请求转发到Windows2000内核的功能,并引发处理器模式的切换。
在用户看来,系统服
务调用接口就是Windows内核组件功能实现对外的一个界面。
系统服务调用接口定义了Wi
ndows内核提供的大量服务。
五>
Windows2000系统服务调用类型
在Windows2000中默认存在两个系统服务调度表,它们对应了两类不同的系统服务
这两个系统服务调度表分别是:
KeServiceDescriptorTable和KeServiceDescriptorTa
bleShadow。
Windows2000执行程序服务对应于NTDLL.dll为我们提供的系统服务调用。
子系统通
过调用NTDLL.dll中的函数接口来实现它们需要的功能。
系统服务调度表KeServiceDescr
iptorTable定义了在ntoskrln.exe中实现的系统服务,通常在kernel32.dll/advapi32.d
ll中提供的函数接口均是调用的这个系统服务调度表中。
同时存在于Windows2000操作系统中还有在Win32k.sys中实现的相关Win32USER和GD
I函数,它们是属于另一类系统服务调用。
与之对应的系统服务调度表为KeServiceDescr
iptorTableShadow,它提供了内核模式实现的USER和GDI服务。
函数KeAddSystemService
Table允许Win32.sys和其他设备驱动程序添加系统服务表。
除了Win32k.sys服务表外,
使用KeAddSystemServiceTable添加的服务表会被同时复制到KeServiceDescriptorTable
和KeServiceDescriptorTableShadow中去。
我们可以看出这两类函数实现在服务调度上的区别:
Win32内核API经过Kernel32.dl
l/advapi32.dll进入NTDLL.dll后使用int0x2e中断进入内核,最后在Ntoskrnl.exe中实
现了真正的函数调用;
Win32USER/GDIAPI直接通过User32.dll/Gdi32.dll进入了内核
,最后却是在Win32k.sys中实现了真正的函数调用。
在此我们只讨论与NTDLL.dll相关的
函数,也就是我们例子中处理的函数。
六>
Hook系统服务调用的作用
钩子(Hooking)是一种拦截/监听可执行代码在执行过程中相关信息的一种通用机制
它使我们了解系统内部结构,运作机制甚至修改系统行为的想法成为可能。
在一个像M
$存在的世界里,Windows的很多内部信息我们都是无法得知的,因为Windows不是Linux
,但这并不意味着我们就此放弃!
只要开动你的大脑,很多事情都会变成可能。
1.事件追踪
你想知道Windows在什么时候会打开一个进程吗?
你想知道Window