扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
说明:只翻译原资料的所有技术相关部分, 忽略了一小部分冗余信息。
-----------------------------------------------------------------------------------------------------
核心区域与用户区域
I386体系支持4种访问权限,也就是通常所说的特权级别。Windows NT 使用了其中的两个权限,使得NT操作系统可以在不完全支持这四种特权级别的体系中运行。
用户区域代码例如应用程序和系统服务运行在3级,用户模式的进程只能访问分配给他们的20亿字节的内存,并且用户代码是可以被分页和上下文切换的。
核心级代码运行在0级,硬件抽象层、设备驱动程序、IO、内存管理和图形接口都是运行在0级。在0级执行的代码,运行时拥有系统的所有权限,可以访问所有内存且能使用特权指令。
Native API
由于设计,用户模式进程不能任意切换权限登记,这个功能会牵涉到整体Windows NT的安全模型。当然,这个安全模型是由多时段所构成的。
有时候用户态的作业没有核心级函数功能无法完成,这就是引入Native API的原由。Native API是未被文档化的内部函数集,运行在内核模式。Native API之所以存在,就是为了提供一些能够在用户模式下安全地调用内核模式服务的途径。
一个用户应用程序可以调用由NTDLL.DLL导出的Native API。NTDLL.DLL导出大量函数用于封装相应的内核函数。如果你反汇编其中一个函数,你会发现结果与下面相似:
Windows 2000:
mov eax, 0x0000002f
lea edx, [esp+04]
int 0x2e
每个由NTDLL导出的Native API都可以被反编译成能够把执行环境切换到内核模式的代码段(stub).首先寄存器载入一个指向系统服务表的索引值,随后在NTOSKRNL对应偏移位置访问所需要的函数。
Windows XP:
mov eax, 0x0000002f
mov edx, 7ffe0300
call edx
At offset 0x7ffe0300:
mov edx, esp
sysenter
ret
如果你的配置是奔腾II或者更高,那么在Windows XP中情况会有些不同。Windows XP是通过SYSENTER/SYSEXIT指令对来实现内核模式与用户模式的切换,这给创建shell code增加了一些困难,稍后再详细解释。
为了成功的创建内核模式的shell code,你必须忘记所有用户级的API,且只使用内核级函数Native API。关于Native API的更多文档资料可以参考Gary Nebbett的《The Windows NT/2000 Native API Referce》。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。