Windows95应用程序直接进入0特权级的实现_第1页
Windows95应用程序直接进入0特权级的实现_第2页
Windows95应用程序直接进入0特权级的实现_第3页
Windows95应用程序直接进入0特权级的实现_第4页
Windows95应用程序直接进入0特权级的实现_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、浙江丝绸工学院学报 , 第 16 卷 , 第 1 期 , 1999 年 3 月Journal of Zhejiang Sichou Institute of TechnologyVol . 16 , No . 1 , Mar1 1999Window s 95 应用程序直接进入 0 特权级的实现周华王先忧(浙江丝绸工学院)(浙江丝绸工学院纤维分院 , 杭州 310033)摘要介绍了一个在 Windows95 应用程序中 , 无需通过传统的 VxD , 直接进入系统 0 特权级的方法 。从而方便地实现了诸如物理内存读写 、实时的 I/ O 访问 、DMA 控制 、中断处理 、I/ O 的拦截 等许

2、多操作 。关键词 : Windows95 特权级 虚拟设备驱动程序中图分类号 : TP311152前言0Win95 是一个运行在 386 保护模式下的操作系统 , 在 Win95 下运行的程序 , 被赋予 0 特权级和 3 特权级 。在 0 特权级下运行的程序 , 具有最大的权限 , 可不受限制地做它想做的任 何事情 , 如 CPU 控制 、系统资源和硬件资源的管理等 。Win95 的系统内核以及许多 VxD ( 虚拟设备驱动程序) 运行在 0 特权级下 。所有的 Windows32 位的应用程序 (以下简称应用程序) 被限制在第 3 特权级下 。这些应 用程序要访问硬件资源须通过 VxD 进

3、行 。在多任务环境下 , 为了满足多个进程同时共享一个硬件设备时 , VxD 是必要的 。但在许多场合 , 如开发自己的硬件驱动 (数据采集卡 、控制卡 、加密卡) 、编制硬件仿真 、加解密 等应用软件 , 想进行物理内存和 I/ O 的读写 、拦截 I/ O 、处理中断时 , 编写 VxD 有诸多不便 。一是编程困难 , 要开发 VxD 程序 , 需使用微软的 DDK 工具 , 并要求开发者具备扎实的汇编语言功底 , 精通 386 保护模式的编程 , 熟悉系统的内核结构 , 其 VxD 的调试更犹如恶梦 一般 , 因此许多程序员视 VxD 编程为畏途 。二是 VxD 程序和应用程序是分开的

4、, 常常可以 看到许多应用软件产品 , 仅仅需要一些简单的系统或硬件的访问 , 就不得不带上一个 VxD模块的尴尬现象 。特别是一些加密产品 , 外加一个 VxD 模块就破坏了加密环境的密闭性 ,给解密者提供了有乘之机 。VxD 的使用也很不便 , 在程序中要使用 VxD 只能用 Device IoCon2trol函数通过调用号间接地访问 。()因此 , 在不考虑多任务共享代码的场合 , 常希望在 Win95 的应用程序中能够不通过 VxD而直接进入 0 特权级 。本文将通过对 Win95 的系统分析 , 给出了一种用 VC + + 实现直接进本文收到日期 : 1998211205入 0 特权

5、级方法 , 实现了 VxD 的许多功能 。原理和方法1111 386 的保护实现在 386 保护模式下运行的每个进程 ( 在多任务环境下每一个在内存中运行的程序和任 务 , 可以理解为一个进程) , 都有各自的内存空间和权限 。进程的任何超出内存空间和权限的访问企图 , CPU 都会产生一个硬件异常 , 通知操作系统进行相关处理以阻止未授权的事件 发生 , 保证系统和其它进程的安全运行 。进程的内存空间和其权限限制 , 是由程序装入时的段寄存器决定的 。在 8086 模式下 ,段寄存器的内容是地址的一部分 , 只要用段寄存器值和偏移量进行简单运算就能得到具体地 址 。而在 386 保护模式下

6、, 段寄存器内容被称之为 “选择符”, 它用来从描述符表中获得描 述符 , 其格式如图 1 。图 1 中 , Index 是描述符表的索引 ;TI 为描述符表类型 ;0 为 GDT (全局描述符表) ;1 为 LDT (局部描述符表) ;RPL为请求者的 03 特权级 。1573210图 1选择符结构实际上 , 选择符 (段寄存器) 的值 AND0xFFF8 就是描 述符在描述符表 ( GDT、LDT)中的偏移地址 。描述符表中的 描述符是一种 8 字节的数据结构 (图 2 ) , 具有系统描述符 ( S = 0) 和段描述符 ( S = 1) ; 类型 , S = 0 时为 LDT、TSS、

7、635547393231150图 2 描述符结构调用门 、中断门等 , S = 1 时为代码/ 数据段及 R/ W 权 ; 段描述符提供了该段的基地址 ( 32位) , 限长 (20 位 , G = 0 时 , 1MB ; G = 1 时 , 可达 4 GB) , 特权级 (DPL = 0 3) , 段位数(D = 1 , 32 位 ; D = 0 , 16 位段) 等控制信息 。因此 , 进程运行时的 CS、DS 、SS 等段寄存器值 ( 实际上是它们所指的段描述符) , 就 限定了该进程所拥有的内存空间和权限 。描述符是由编译器 、连接器 、装入程序和在 0 特权 级下系统内核 、VxD

8、创建的 , 在第 3 特权级下的应用程序无权创建和改变 。Win95 以此实现 系统 、内存和设备的保护 , 保证应用程序能在自己的空间中安全运行 , 不会妨碍其它程序也 不受其它程序的破坏 。112进程特权级的转换在 386 保护模式下 , 不同特权级代码段之间的控制转换是通过门 ( Gate , 一种系统描述 符) 来实现的 。门分为中断门 、自陷门 、任务门和调用门 4 种 。门结构如图 3 。其中类型 :C 为 386 调用门 , E 为 386 中断门 , F 为自陷门 。并指定了可以访问该门的最低特权级 (DPL= 03) , 和进入过程的入口地址 (32 位) 。一般用调用门或中

9、断门 (自陷门) 进行特权转换 。调用门用“CALL 选择符 :偏移量”这一指基地址150限制150GDPSA基地址2316基地址3124限制1916DPL类型TIIndexRPL令使代码控制转移到另一特权级 ,其中选择符指向描述符表中的调用门描述符 ,而偏移量可以是任意值 ,因为在门描述符中已经指定了入口地址 。中断门则常用软中断 INTn 进行 。调用门驻留在 GDT/ LDT中 , 中断门驻留在 IDT ( 中断 描述符表) 之中 。通过门进入一个新过程 后 , CS 寄存器值为门描述符 中的选择符 , 使新过程具有新的特权级 , 同时发生了任务切 换 , SS 和 ESP 也 将 根

10、据 TSS描述符内容进行重载 。113实现方法635547393231150图 3 门描述符结构从上分析可知 : 只要有一个具有 0 特权级权限的代码段描述符和一个进入该段的调用门或中断门 , 就可以实现从应用程序 (第 3 特权级) 中直接进入 0 特权级 。以调用门为例 , 怎样在 Win95 的应用程序中创建段描述符和调用门呢 , 首先需要分析一 下 Win95 中应用程序的地址空间映象 。在 Win95 中 , 应用程序的地址空间被分成 : 从地址 01MB 为 MS2DOS 内存映象 ; 1MB4MB 未用 ; 4MB2 GB 为应用程序的私有地址空间 ; 23 GB 为共享的对象

11、( 应用程序可 读写) , 包括非系统的 DLL 空间 ; 34 GB 为系统 DLL 和系统 VxD 空间 。这种内存分布 , 应用程序对系统 DLL 的调用是直接的 , 没有特权级和环境的切换 , 使Win95 的性能 (速度) 得到了极大的提升 , 但由于应用程序可以通过指针访问 24 GB 的共 享和系统空间 , 在安全性方面却留下了一个漏洞 。试验发现 , Win95 的 GDT 和 IDT 驻留在 34 GB 的系统空间 , LDT 驻留在 23 GB 的共享空间 , 这使访问 GDT/ LDT、IDT 成为可能 。114步骤段描述符和调用门可以驻留在 GDT 或 LDT 中 ,

12、若 0 特权级下的代码仅是本程序私用 ,一般在 LDT 中创建比较合适 。下面以在 LDT 中创建描述符为例 。11411 LDT 基地址的获得用汇编指令 SGDT 获得 GDT 的基地址 , 用汇编指令 SLDT 获得 LDT 段描述符在 GDT 中的 偏移量 , 再根据 LDT 段描述符内容 , 可以求出 LDT 基地址和 LDT 的大小 。11412创建代码段描述符和调用门根据 LDT 基地址和大小 , 从中找出空白的表项 , 其偏移量 AND0xFFF8 + 4 ( TI = 1 , RPL= 0) 就是进入 0 特权级的代码段选择符 ( CS) 的值 。笔者创建的代码段描述符为 :表

13、示段基地址是 0x00000000 , 空Code32 8 = 0xFF , 0xFF , 0 , 0 , 0 , 0x9B , 0xCF , 0 ;间大小 0xFFFFFFFF (4 GB) , 0 特权级 , 32 位可读代码段 。再找一个空白的表项 , 其偏移量 AND0xFFF8 + 4 就是用“CALL 选择符 : 偏移量”进入 0特权级时的选择符 。笔者创建的调用门为 :表示是一个 DPL = 3 ( 允许第 3Call G32 8 = aa , aa , dd , dd , 0 , 0xEC , aa , aa ;特权级程序使用) 的调用门 。其中 aa 是进入 0 特权级的入口

14、地址 , dd 是上述进入 0 特权级选择符153TI入口地址150P0(参数个数)入口地址3116DPL类型的代码段选择符 ( CS) 的值 。LDT 的读写 , 用 Win32 API 的 ReadProcessMemory和 WriteProcessMemory进行 ( 这( )( )是从一进程对另一进程空间进行读写的后门函数) , 其中的 hProcess 参数用 GetCurrentProcess()获得 。在试验中发现 , 在应用程序中直接用指针居然也可对 LDT 甚至 GDT 读写 ( 这确是Win95 安全性的大漏洞 , NT 则不然 , 它对任何内存访问都作安全检查 , 故无

15、法实现本文方法) 。但用 ReadProcessMemory和 WriteProcessMemory函数的好处是 , 万一读写失败时它们能安静地返回一个参数告诉调用者 , 可避免应用程序突然被系统警告并终止运行 。( )( )创建中断门可以用 L IDT 得到 IDT 地址 , 在 IDT 中建立中断门 。WINCIH 病毒就是直接修改 IDT , 用 INT03 进入 0 特权级的 。应用2在实际应用中 , 将进入 0 特权级的方法用 C + + 编成一个 CRing0 类 , 创建和释放段描述符 、调用门工作在 C Ring 0 类的构造和析构函数中完成 。只要调用类成员函数 CRing0

16、 Call(int ( 3 PFunc) (int) , int) 就可以将 p Func 指向的任意应用程序中的 C 函数带入到 0 特权级 之中 。例 1 : 物理内存申请和物理地址与线性地址转换直接应用 VxDs API PageAllocate 可以申请到共享或系统的加锁的内存空间 , 应用 Map2physTolinear 可将物理地址转换成线性地址 , 而线性地址到物理地址则通过直接查系统页目录 和页表项实现 。Void main () CRing 0 r0 ;B YTE 3 pB = (LPB YTE)r0 . Call ( Phys2Linear , 0xc0000 , 0x1

17、00 , 0) ;物理地址 0x0C0000 转换到线性地址B YTE 3 pLaddr , 3 p Paddr ;pLaddr = r0 . Call ( Ring0Alloc , 0x10000) ; 在申请 64 K 系统内存 , 并加锁p Paddr = r0 . Call (Linear2Phys , pLaddr) ; 线性地址转换到物理地址r0 . Call ( Ring0Free , pLaddr) ; 释放内存例 2 : 中断处理在 0 特权级下 , 可以使用 VxDs API 的虚拟机中断处理服务来处理中断 。但更简单的方 法是在 0 特权级下直接修改 IDT (中断描述符

18、表) 。用 SIDT 得到 IDT 基地址 , 在 IDT 中创建 指向函数的中断门 。当考虑到要在不同进程中使用中断处理时 , 应把处理代码放到共享或系统内存空间中 去 。因为对于应用程序私有空间 , 当其它应用程序运行并发生中断时 , 该区域为其它程序代码而死机 。例 3 : I/ O 端口拦截拦截 I/ O 端口 , 也可用 VxD API 的 VMMcall Install IO Handler 安装 I/ O 处理程序 , 但它不 能拦截在 0 特权级中 (如其它 VxD) 发出的 I/ O 访问 。对于 586 及以上的 CPU , 其调试寄存器 DR0DR3 除了对代码 、数据断

19、点外 , 新增加了对 I/ O 端口的硬件断点 , 方法是调试控制寄存器 DR7 使其 R/ W0R/ W3 = 10 , 同时置新的系统寄存器 CR4 .mov mov mov mov mov ormovDE = 1 (允许硬件 I/ O 断点) , 代码如下 :eax ,dr0 , eax , dr7 , eax , eax ,cr4 ,378heax00020703h R/ W0 = 10 eaxcr48 CR4 . DE = 1 eax则无论什么程序发出的 378 H I/ O 访问 , CPU 都会产生调试 ( 01) 异常 , 将控制转移到设定的调试异常 (中断) 处理程序中去 。

20、结束语本文介绍的方法已在 Win95/ Win98 系统中安全通过 。用 VC 实现了本来只能用 VxD 才能 实现的诸如物理内存申请和读写 、物理地址与线性地址相互转换 、实时的 I/ O 访问 、中断处 理 、I/ O 的拦截等许多功能 , 并可以调用系统内核 (VMM) 提供的许多 VxD 功能调用 (VxD2 sAPI) 。参考文献1 美 King A 著 , 熊桂喜等译. Windows 95 技术内幕. 北京 : 清华大学出版社 , 1995 : 701062 孟昭光 , 李维星编译. 高档微机组成原理及接口技术. 北京 : 学苑出版社 , 1993 : 2392903 鹏 飞 , 晓 晖译. i48

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论