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

叶落无声costa

叶落无声costa

2016-02-19 15:06

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

  众 所 周 知, 在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 保 护 模 式 的 基 础 知 识 请 大 家 看 有 关 书 籍。

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

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

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

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

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

  ----这 是 一 个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://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
令Win32应用程序跳入系统零层

不是有效的win32应用程序怎么解决

windows
不是有效的win32应用程序怎么解决

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

不是有效Win32应用程序的解决方法

电脑入门
不是有效Win32应用程序的解决方法

解决Office报错提示“不是有效的win32应用程序”

电脑网络
解决Office报错提示“不是有效的win32应用程序”

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Win7打开软件提示“不是有效的Win32应用程序”如何解决

电脑网络
Win7打开软件提示“不是有效的Win32应用程序”如何解决

iis 7启用32位应用程序

服务器
iis 7启用32位应用程序

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Jquery 弹出层插件实现代码

Jquery 弹出层插件实现代码

罗云彬VxD教程--VxD 程序设计入门

罗云彬VxD教程--VxD 程序设计入门
下拉加载更多内容 ↓