令Win32应用程序跳入系统零层

2016-02-19 15:06 18 1 收藏

今天图老师小编给大家展示的是令Win32应用程序跳入系统零层,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】

  众 所 周 知, 在Windows95/98 的Win32 on Intel x86 体 系 中 利 用 了 处 理 器 的 三 环 保 护 模 型 中 的 零 环(Ring0, 最 高 权 限 级 别) 和 三 环(Ring3, 最 低 权 限 级 别)。 一 般 应 用 程 序 都 运 行 在Ring3 下, 受 到 严 格 的" 保 护", 只 能 规 矩 地 使 用Win32API。 如 果 我 们 想 进 行 一 些 系 统 级 的 操 作, 例 如 在 嵌 入 汇 编 中 使 用 诸 如"Mov EAX,CR0", 或 像 在DOS 下 那 样 调 用 一 些 必 不 可 少 的 系 统 服 务( 如BIOS,DPMI 服 务) 而 用"Int xx", 都 会 导 致" 非 法 操 作"。 但 这 种 能 力 有 时 是 必 不 可 少 的, 一 到 这 种 时 候Microsoft 就 " 建 议 编 写 一 个VxD"。VxD 大 家 早 有 所 闻 了, 在VxD 里, 不 但 可 以 执 行CPU 的 所 有 指 令, 而 且 可 以 调 用VMM( 虚 拟 机 管 理 器) 和 其 他VxD 提 供 的 上 千 个 系 统 级 服 务。 获 得 这 一 能 力 的 最 本 质 原 因 在 于 它 运 行 在Ring0, 与 系 统 内 核 同 一 级 别。 但 是 它 体 系 的 复 杂 性、 开 发 工 具 的 不 易 获 得、 帮 助 文 档 的 不 完 备, 使Microsoft 排 除 了 一 大 批 程 序 员 和 竞 争 对 手。 而 将 在Windows2000(Windows98 也 开 始 支 持) 中 取 代VxD 的WDM 对Win95 程 序 员 也 是 个 噩 梦, 它 需 要 了 解Windows NT 核 心 驱 动 模 型。

  ----有 没 有 简 单 一 些 的 办 法 呢 ? 我 们 可 以 令 一 个 普 通Win32 应 用 程 序 运 行 在Ring0 下, 从 而 获 得VxD 的 能 力 吗 ? 答 案 是 肯 定 的。 下 面 我 们 就 简 述 一 下 这 一 技 巧, 有 关Intel x86 保 护 模 式 的 基 础 知 识 请 大 家 看 有 关 书 籍。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  ----首 先 此 技 巧 基 于 以 下 理 论 根 据:

  ----一、SIDT 指 令( 将 中 断 描 述 符 表 寄 存 器 IDTR - -64 位 宽,16 ~47Bit 存 有 中 断 描 述 符 表IDT 基 地 址 - - 的 内 容 存 入 指 定 地 址 单 元) 不 是 特 权 指 令, 就 是 说 我 们 可 以 在Ring3 下 执 行 该 指 令, 获 得IDT 的 基 地 址, 从 而 修 改IDT, 增 加 一 个 中 断 门 安 置 我 们 的 中 断 服 务, 一 旦Ring3 程 序 中 产 生 此 中 断,VMM 就 会 调 用 此 中 断 服 务 程 序, 而 此 中 断 服 务 程 序 就 运 行 在Ring0 下 了。 这 一 点 与 在DOS 下 非 常 相 似。

  ----二、Windows95 Win32 应 用 程 序 运 行 一 个 映 射 到 全 部4G 内 存 的 段 中, 选 择 子 为0137h,Ring0 中 的VxD 运 行 在 另 一 个 映 射 到 全 部4G 内 存 的 段 中, 选 择 子028h, 这 两 个 段 除 了 选 择 子 决 定 的 访 问 权 限 不 同 外, 没 什 么 不 同, 各 自 段 中 相 同 的 偏 移 量 对 应 了 相 同 的 线 性 地 址。 所 以 我 们 放 在Win32 应 用 程 序 中 的 中 断 服 务 程 序 可 以 以Ring3 的 段 偏 移 量 被Ring0 中 的VMM 寻 址。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  ----下 面 我 们 以 具 体 例 子 进 一 步 说 明, 程 序 中 有 详 细 注 释。

  ----这 是 一 个Win32 Console Program( 控 制 台 应 用 程 序), 虽 然 运 行 中 看 起 来 很 像DOS 筐 中 运 行 的 实 模 式DOS 程 序, 但 它 是 货 真 价 实 的 运 行 在Ring3 下 的Win32 程 序。 用Visual C + + 5.0 AppWizard 创 建 一 个Win32 Console Program 项 目, 添 加 以 下.CPP 文 件, 编 译 即 可。

  

#include
#include
#include
#include
 // 若 无DDK 带 下 划 线 的 可 略 去,
 这 些 语 句 演 示 了 调 用VMM/VXD 服 务
DWORDLONG IDTR,SavedGate;
WORD OurGate[4]={0,0x0028,0xee00,0x0000};
// 中 断 门 描 述 符 格 式 如 下:
DWORD _eax,_ecx,_cr0;
WORD vmmver;
HVM sysvm;
void nothing()
{
   //Used to test call in Ring0
   sysvm=Get_Sys_VM_Handle();
}
void __declspec( naked ) Ring0Proc(void)
 // 中 断 例 程, 运 行 在Ring0
{
   _asm{
      mov  _eax,eax  //
      mov  _ecx,ecx  //
      mov  eax, CR0  
  // 测 试Ring3 中 不 能 执 行 的 特 权 指 令
      mov  _cr0,eax  //
   }
      VMMCall(Get_VMM_Version);
 // 调 用VMM 服 务
   _asm{
      mov vmmver,ax
   }
   nothing(); 
 // 测 试 在 运 行 于Ring0 的
  中 断 例 程 中 调 用 子
    _asm iretd  
 // 中 断 返 回, 与 在 实 模 式
  编 程 无 本 质 区 别
}
void main() // 主 程 序
{
   _asm{
   mov  eax, offset Ring0Proc
   mov  [OurGate], ax // 将 中 断 函 数 的 地 址
   shr  eax, 16  // 填 入 新 造 的 中 断 门
   mov  [OurGate +6], ax // 描 述 符
   sidt fword ptr IDTR  
 // 将 中 断 描 述 符 表 寄 存 器(IDTR)
   的 内 容 取 出
   mov  ebx, dword ptr [IDTR +2]
 // 取 出 中 断 描 述 符 表(IDT) 基 地 址
   add  ebx, 8 *9 
  // 计 算Int 9 的 描 述 符 应 放 置 的 地 址 选 用
  Int9 是 因 为 它 在Win32 保 护 模 式 下 未 占 用
   mov   edi, offset SavedGate
   mov   esi, ebx
   movsd  // 保 存 原 来 的Int 9 描 述 符 到
   movsd //SavedGate 以 便 恢 复
   mov   edi, ebx
   mov   esi, offset OurGate
   movsd // 替 换 原 来 的 中 断 门 描 述 符
   movsd // 以 安 装 中 断 服 务 例 程
   mov  eax,0x6200
  // 用 以 测 试 放 在EAX 中 的 数 据
   能 否 正 确 传 到Ring0 中 断
   mov  ecx,0
  // 用 以 测 试 放 在ECX 中 的 数 据
   能 否 正 确 传 到Ring0 中 断
   mov  ecx,0
  // 用 以 测 试 放 在ECX 中 的 数 据
   能 否 正 确 传 到Ring0 中 断
        // 因 为 很 多VxD 服 务 都 用
         此 二 寄 存 器 传 递 参 数
   int 9h 
   // 人 为 触 发 中 断, 平 时 会 出 现
    保 护 错 误 蓝 屏 或 非 法 操
       // 作 对 话 框, 现 在 安 装 了
       // 中 断 服 务 例 程 后, 就 会 通 过
       //VMM 在Ring0 调 用 中 断 服 务 例 程
        - -Ring0Proc
   mov  edi, ebx
   mov  esi, offset SavedGate
   movsd // 恢 复 原 来 的 中 断 门 描 述 符
   movsd
   }
    cout"CR0="_cr0 } _getch(); if(0="=_getch())" while(_kbhit()="=0);" do{} continue.?

来源:http://www.tulaoshi.com/n/20160219/1608849.html

延伸阅读
标签: windows10
Win10系统应用程序不兼容如何设置   作为新一代的win10操作系统,虽然在兼容性上有很大的升级提升,但难免会遇到一些游戏或应用程序不支持兼容的问题,遇到这种情况该如何解决呢?其实我们还可以利用win10系统自带的兼容性疑难解答功能来修复,下面给大家介绍下win10兼容性设置教程。 1、在桌面中打开这台电脑图标,并在磁盘文件...
标签: 电脑入门
Windows7系统下,不用借助第三方软件,通过控制面板就可以实现应用程序的轻松卸载,在Win10系统下,卸载应用程序可以用同样的方法,而且比Windows7系统下操作的还要简单。 Win10系统下卸载应用程序的步骤: 1、在Win10桌面左下角的Windows图标上右键鼠标,在弹出的菜单中选择程序和功能,如下图所示: 2、之后就可以快速打开Win10程序...
CNTService 类 当我创建 C++ 对象封装 Windows 函数时,我尝试为我封装的每个 Windows API 除了创建成员函数外,还做一些别的工作,我尝试让对象更容易使用,降低实现特定项目所需的代码行数。因此我的对象是基于我想让这个对象做什么?而不是Windows 用这些 APIs 做什么? CNTService 类包含一些用来解析命令行的成员函数,为了处理服...
标签: Web开发
始      首先我们从一个简单的XML文档开始。现在来看看我们最初的演示文档--CD 目录:          ?xml version="1.0"?    CATALOG    CD    TITLEEmpire Burlesque /TITLE    ARTISTBob Dylan /ARTIST &nb...
标签: windows 操作系统
这一次我们一同看看Vista中的几个重头捆绑程序:Sidebar(侧边拦)、IE 7.0、小游戏以及XPS文档的查看和制作。 1、Sidebar(侧边拦) 侧边栏程序并不是默认启动的,这个程序自从诞生时起就差评如潮。当时的侧边栏界面难看,功能及其匮乏,还占用了许多宝贵的桌面屏幕空间。 曾经一度这个程序再也不在Vista的各个build中出现了,但是微软并没有...

经验教程

126

收藏

50
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部