如何建立Ring 0级Hook监控EXE文件的运行,普通文件的打开?(100分)

  • 主题发起人 主题发起人 zqw0117
  • 开始时间 开始时间
Z

zqw0117

Unregistered / Unconfirmed
GUEST, unregistred user!
Hi,大家新年好!<br><br>我很想知道像杀毒软件的监控程序是如何运作的,同时我也想试着编写一下,可是我遇到<br>了一个问题,只好请教各位大虾:<br><br>我需要建立一个Ring 0级的系统Hook,用以监控EXE文件的运行(执行一些操作,当然不是<br>干坏事,然后决定是否运行该文件),同时还要监控其它类型文件的打开。不过由于本人<br>技术太有限了,也找不到有关Hook的文章或书籍,而且我还听说某些Hook用vxd技术比较好,<br>可是我同时又听说vxd技术不能被所有操作系统(我是指WindowsNT)支持,更要命的是,我<br>根本不知道怎样制作这样的Hook,只好请教大家了。<br><br>如果那位大虾知道如何创建能在Windows各个版本都适用的Ring 0级的钩子,请告诉我,谢<br>谢!(最好详细一点或举例,小弟感激不尽)
 
没有人知道吗?<br>:(
 
vxd是在9x下面用的<br>2k下面用wdm<br>杀毒软件的监控程序都是用的驱动
 
现在好象wdm要取代vxd,但是两个是兄弟关系,<br>利用cpu出错,可以将ring 3改到ring 0级运行<br>不要问我why,how,<br>因为我是看的文章,没有实践过!
 
可以讲的具体一点吗?因为我对vxd和wdm都不懂,也不知道哪中工具可以编写它们。<br>有例子的话最好,谢谢!!!
 
我这当了一份资料里有,不过没试过,贴给你看看吧,vc++5.0的代码,也许对你有用:)<br>这 是 一 个Win32 Console Program( 控 制 台 应 用 程 序), 虽 然 运 行 中 看 <br>起 来 很 像DOS 筐 中 运 行 的 实 模 式DOS 程 序, 但 它 是 货 真 价 实 的 运 行<br>&nbsp;在Ring3 下 的Win32 程 序。 用Visual C + + 5.0 AppWizard 创 建 一 个Win32 <br>Console Program &nbsp;项 目, 添 加 以 下.CPP 文 件, 编 译 即 可。 &nbsp;<br>&nbsp;<br>&nbsp;#include <br>&nbsp;#include <br>&nbsp;#include <br>&nbsp;#include &nbsp;<br>&nbsp; // 若 无DDK 带 下 划 线 的 可 略 去, <br>&nbsp; 这 些 语 句 演 示 了 调 用VMM/VXD 服 务 <br>DWORDLONG IDTR,SavedGate; <br>WORD OurGate[4]={0,0x0028,0xee00,0x0000}; <br>// 中 断 门 描 述 符 格 式 如 下: <br>&nbsp;<br>&nbsp;<br>&nbsp;<br>DWORD _eax,_ecx,_cr0; <br>WORD vmmver; <br>HVM sysvm; <br>&nbsp;<br>void nothing() <br>{ <br>&nbsp; &nbsp; &nbsp; //Used to test call in Ring0 <br>&nbsp; &nbsp; &nbsp; sysvm=Get_Sys_VM_Handle(); <br>} <br>&nbsp;<br>void __declspec( naked ) Ring0Proc(void) <br>&nbsp; // 中 断 例 程, 运 行 在Ring0 <br>{ <br>&nbsp; &nbsp; &nbsp; _asm{ <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; _eax,eax &nbsp; &nbsp;// <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; _ecx,ecx &nbsp; &nbsp;// <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; eax, CR0 &nbsp; &nbsp; <br>&nbsp; &nbsp;// 测 试Ring3 中 不 能 执 行 的 特 权 指 令 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; _cr0,eax &nbsp; &nbsp;// <br>&nbsp; &nbsp; &nbsp; } <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VMMCall(Get_VMM_Version); &nbsp;<br>&nbsp; // 调 用VMM 服 务 <br>&nbsp; &nbsp; &nbsp; _asm{ <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov vmmver,ax <br>&nbsp; &nbsp; &nbsp; } <br>&nbsp; &nbsp; &nbsp; nothing(); &nbsp; <br>&nbsp; // 测 试 在 运 行 于Ring0 的 &nbsp;<br>&nbsp; &nbsp; 中 断 例 程 中 调 用 子 <br>&nbsp;    &nbsp;_asm &nbsp;iretd &nbsp; &nbsp;<br>&nbsp; // 中 断 返 回, 与 在 实 模 式 &nbsp;<br>&nbsp; &nbsp; 编 程 无 本 质 区 别 <br>} <br>void main() // 主 程 序 <br>{ <br>&nbsp; &nbsp; &nbsp; _asm{ <br>&nbsp; &nbsp; &nbsp; mov &nbsp; eax, offset Ring0Proc <br>&nbsp; &nbsp; &nbsp; mov &nbsp; [OurGate], ax &nbsp;// 将 中 断 函 数 的 地 址 <br>&nbsp; &nbsp; &nbsp; shr &nbsp; eax, 16 &nbsp; // 填 入 新 造 的 中 断 门 <br>&nbsp; &nbsp; &nbsp; mov &nbsp; [OurGate +6], ax // 描 述 符 <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; sidt &nbsp;fword ptr IDTR &nbsp; &nbsp; <br>&nbsp; // 将 中 断 描 述 符 表 寄 存 器(IDTR) <br>&nbsp; &nbsp; &nbsp;的 内 容 取 出 <br>&nbsp; &nbsp; &nbsp; mov &nbsp; ebx, dword ptr [IDTR +2] <br>&nbsp; // 取 出 中 断 描 述 符 表(IDT) 基 地 址 <br>&nbsp; &nbsp; &nbsp; add &nbsp; ebx, 8 *9 &nbsp; <br>&nbsp; &nbsp;// 计 算Int 9 的 描 述 符 应 放 置 的 地 址 选 用 <br>&nbsp; &nbsp; Int9 是 因 为 它 在Win32 保 护 模 式 下 未 占 用 <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp; &nbsp;edi, offset SavedGate <br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp; &nbsp;esi, ebx <br>&nbsp; &nbsp; &nbsp; movsd &nbsp; // 保 存 原 来 的Int 9 描 述 符 到 <br>&nbsp; &nbsp; &nbsp; movsd &nbsp;//SavedGate 以 便 恢 复 <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp; &nbsp;edi, ebx <br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp; &nbsp;esi, offset OurGate <br>&nbsp; &nbsp; &nbsp; movsd &nbsp;// 替 换 原 来 的 中 断 门 描 述 符 <br>&nbsp; &nbsp; &nbsp; movsd &nbsp;// 以 安 装 中 断 服 务 例 程 <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; mov &nbsp; eax,0x6200 &nbsp;<br>&nbsp; &nbsp;// 用 以 测 试 放 在EAX 中 的 数 据 <br>&nbsp; &nbsp; &nbsp;能 否 正 确 传 到Ring0 中 断 <br>&nbsp; &nbsp; &nbsp; mov &nbsp; ecx,0 &nbsp;<br>&nbsp; &nbsp;// 用 以 测 试 放 在ECX 中 的 数 据 &nbsp;<br>&nbsp; &nbsp; &nbsp;能 否 正 确 传 到Ring0 中 断 <br>&nbsp; &nbsp; &nbsp; mov &nbsp; ecx,0 &nbsp;<br>&nbsp; &nbsp;// 用 以 测 试 放 在ECX 中 的 数 据 &nbsp;<br>&nbsp; &nbsp; &nbsp;能 否 正 确 传 到Ring0 中 断 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 因 为 很 多VxD 服 务 都 用 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;此 二 寄 存 器 传 递 参 数 <br>&nbsp; &nbsp; &nbsp; int &nbsp;9h &nbsp; <br>&nbsp; &nbsp; &nbsp;// 人 为 触 发 中 断, 平 时 会 出 现 <br>&nbsp; &nbsp; &nbsp; &nbsp;保 护 错 误 蓝 屏 或 非 法 操 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 作 对 话 框, 现 在 安 装 了 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 中 断 服 务 例 程 后, 就 会 通 过 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//VMM 在Ring0 调 用 中 断 服 务 例 程 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - -Ring0Proc <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp;edi, ebx <br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp;esi, offset SavedGate <br>&nbsp; &nbsp; &nbsp; movsd // 恢 复 原 来 的 中 断 门 描 述 符 <br>&nbsp; &nbsp; &nbsp; movsd <br>&nbsp; &nbsp; &nbsp; } <br>&nbsp; &nbsp; &nbsp; cout&lt;&lt;"CR0="&lt;&lt;_cr0&lt; <br>&nbsp;运 行 结 果: <br>&nbsp;<br>&nbsp;<br>&nbsp;<br>----此 方 法 的 好 处 一 是 回 避 了 奇 特 的VxD &nbsp;<br>文 件 格 式, 不 用 使 用 汇 编 语 言 编 程, 二 是 应 用 程 序 不 用 带 一 个 <br>单 独 的VxD 文 件, 干 净 利 索。 <br>
 
To 不懂编程<br>首先感谢你贴出这些代码,不过我看得!@#@$@#$#%^&amp;&amp;&amp;*<br>对不起,我不懂汇编,上面的代码我看不懂,不知道那位朋友有Delphi的代码,我很急。
 
如果仅仅监视是否运行程序,只要拦截api的CreateProcess便可.<br>上面贴出的ring0代码,使代码调进ring0,且只能在win9x使用,无法监视文件读写。<br>否则,使用vxd的ifsinstallfilehook(好象)函数安装钩子。<br>在nt platform上,有另一套钩子,不过写的是wdm。<br><br>提一句,写vxd和wdm只能用c &amp; asm
 
VToolsD是一个用来写VXD的工具软件(当然还有DDK),可以使用C,C++写,编译<br>采用VC或BC,我用的是VC,它有一个例子是关于文件钩子的,文件的操作一目了然,<br>你下载看一下就知道了
 
To 陈礼泉<br>哪里有下载的?<br><br>另外,可以绕过vxd和wdm吗?我需要一个方法能在所有Windows平台上运行的,因为我的<br>机器的CPU是celeron300还不带A的那种,所以没有安装任何基于NT的平台,但是我又想<br>制作能在NT上运行的程序,苦于无法测试,所以希望得到一种既能在NT又能在9x下都正常<br>的方法,麻烦大家了!
 
McAfee 防毒软件早期是利用现在众所周知的文件关联的方式来监视文件的打开和执行的。<br>打开注册表,查一下exefile文件类型和txtfile文件的键值,看看它们有什么不同,<br>很容易明白的。<br><br>不过McAfee早已不用这种办法了。前些时候在MSDN上看到关于IShellExecuteHook接口,<br>不过没仔细看,估计差不多也是拿来做这种事儿的,试一下吧:)
 
这样不行,只能监控运行EXE文件,不能监控打开其它文件,和防止文件写入。
 
用Dll可以建立Ring 0级的Hook
 
用Dll可以建立Ring 0级的Hook吗?
 
在这个卧虎藏龙的地方,没有人能帮帮我吗?
 
我刚上传了一个,我想没有比这个更合适的了。<br>http://delphi.mychangshu.com/dispdoc.asp?id=604
 
上面那位的程序在nt下面只能显示<br>不能拦截<br>因为它是用过滤服务来做的<br><br>通用的不可能<br><br>9x下面可以用vxd的服务Hook_Service<br>nt下面可以用ifs开发包来做,里面有一个例子
 
看看这篇文章吧:<br><br>众 所 周 知, 在Windows95/98 的Win32 on Intel x86 体 系 中 利 用 了 处 理 器 的 三 环 保 护 模 型 中 的 零 环(Ring0, 最 高 权 限 级 别) 和 三 环(Ring3, 最 低 权 限 级 别)。 一 般 应 用 程 序 都 运 行 在Ring3 下, 受 到 严 格 的" 保 护", 只 能 规 &nbsp;<br>矩 地 使 用Win32API。 如 果 我 们 想 进 行 一 些 系 统 级 的 操 作, 例 如 在 嵌 入 汇 编 中 使 用 诸 如"Mov EAX,CR0", 或 像 在DOS 下 那 样 调 用 一 些 必 不 可 少 的 系 统 服 务( 如BIOS,DPMI 服 务) 而 用"Int xx", 都 会 导 致" 非 法 操 作"。 但 &nbsp;<br>这 种 能 力 有 时 是 必 不 可 少 的, 一 到 这 种 时 候Microsoft 就 " 建 议 编 写 一 个VxD"。VxD 大 家 早 有 所 闻 了, 在VxD 里, 不 但 可 以 执 行CPU 的 所 有 指 令, 而 且 可 以 调 用VMM( 虚 拟 机 管 理 器) 和 其 他VxD 提 供 的 上 千 个 系 统 级 服 &nbsp;<br>务。 获 得 这 一 能 力 的 最 本 质 原 因 在 于 它 运 行 在Ring0, 与 系 统 内 核 同 一 级 别。 但 是 它 体 系 的 复 杂 性、 开 发 工 具 的 不 易 获 得、 帮 助 文 档 的 不 完 备, 使Microsoft 排 除 了 一 大 批 程 序 员 和 竞 争 对 手。 而 将 &nbsp;<br>在Windows2000(Windows98 也 开 始 支 持) 中 取 代VxD 的WDM 对Win95 程 序 员 也 是 个 噩 梦, 它 需 要 了 解Windows NT 核 心 驱 动 模 型。 &nbsp;<br>&nbsp;<br>----有 没 有 简 单 一 些 的 办 法 呢 ? 我 们 可 以 令 一 个 普 通Win32 应 用 程 序 运 行 在Ring0 下, 从 而 获 得VxD 的 能 力 吗 ? 答 案 是 肯 定 的。 下 面 我 们 就 简 述 一 下 这 一 技 巧, 有 关Intel x86 保 护 模 式 的 基 础 知 识 请 大 家 看 有 &nbsp;<br>关 书 籍。 &nbsp;<br>&nbsp;<br>----首 先 此 技 巧 基 于 以 下 理 论 根 据: &nbsp;<br>&nbsp;<br>----一、SIDT 指 令( 将 中 断 描 述 符 表 寄 存 器 IDTR - -64 位 宽,16 ~47Bit 存 有 中 断 描 述 符 表IDT 基 地 址 - - 的 内 容 存 入 指 定 地 址 单 元) 不 是 特 权 指 令, 就 是 说 我 们 可 以 在Ring3 下 执 行 该 指 令, 获 得IDT 的 基 地 址, &nbsp;<br>从 而 修 改IDT, 增 加 一 个 中 断 门 安 置 我 们 的 中 断 服 务, 一 旦Ring3 程 序 中 产 生 此 中 断,VMM 就 会 调 用 此 中 断 服 务 程 序, 而 此 中 断 服 务 程 序 就 运 行 在Ring0 下 了。 这 一 点 与 在DOS 下 非 常 相 似。 &nbsp;<br>&nbsp;<br>----二、Windows95 Win32 应 用 程 序 运 行 一 个 映 射 到 全 部4G 内 存 的 段 中, 选 择 子 为0137h,Ring0 中 的VxD 运 行 在 另 一 个 映 射 到 全 部4G 内 存 的 段 中, 选 择 子028h, 这 两 个 段 除 了 选 择 子 决 定 的 访 问 权 限 不 同 外, 没 什 么 不 &nbsp;<br>同, 各 自 段 中 相 同 的 偏 移 量 对 应 了 相 同 的 线 性 地 址。 所 以 我 们 放 在Win32 应 用 程 序 中 的 中 断 服 务 程 序 可 以 以Ring3 的 段 偏 移 量 被Ring0 中 的VMM 寻 址。 &nbsp;<br>&nbsp;<br>----下 面 我 们 以 具 体 例 子 进 一 步 说 明, 程 序 中 有 详 细 注 释。 &nbsp;<br>&nbsp;<br>----这 是 一 个Win32 Console Program( 控 制 台 应 用 程 序), 虽 然 运 行 中 看 起 来 很 像DOS 筐 中 运 行 的 实 模 式DOS 程 序, 但 它 是 货 真 价 实 的 运 行 在Ring3 下 的Win32 程 序。 用Visual C + + 5.0 AppWizard 创 建 一 个Win32 Console Program &nbsp;<br>项 目, 添 加 以 下.CPP 文 件, 编 译 即 可。 &nbsp;<br>&nbsp;<br>&nbsp;#include <br>&nbsp;#include <br>&nbsp;#include <br>&nbsp;#include &nbsp;<br>&nbsp; // 若 无DDK 带 下 划 线 的 可 略 去, <br>&nbsp; 这 些 语 句 演 示 了 调 用VMM/VXD 服 务 <br>DWORDLONG IDTR,SavedGate; <br>WORD OurGate[4]={0,0x0028,0xee00,0x0000}; <br>// 中 断 门 描 述 符 格 式 如 下: <br>&nbsp;<br>&nbsp;<br>&nbsp;<br>DWORD _eax,_ecx,_cr0; <br>WORD vmmver; <br>HVM sysvm; <br>&nbsp;<br>void nothing() <br>{ <br>&nbsp; &nbsp; &nbsp; //Used to test call in Ring0 <br>&nbsp; &nbsp; &nbsp; sysvm=Get_Sys_VM_Handle(); <br>} <br>&nbsp;<br>void __declspec( naked ) Ring0Proc(void) <br>&nbsp; // 中 断 例 程, 运 行 在Ring0 <br>{ <br>&nbsp; &nbsp; &nbsp; _asm{ <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; _eax,eax &nbsp; &nbsp;// <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; _ecx,ecx &nbsp; &nbsp;// <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; eax, CR0 &nbsp; &nbsp; <br>&nbsp; &nbsp;// 测 试Ring3 中 不 能 执 行 的 特 权 指 令 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; _cr0,eax &nbsp; &nbsp;// <br>&nbsp; &nbsp; &nbsp; } <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VMMCall(Get_VMM_Version); &nbsp;<br>&nbsp; // 调 用VMM 服 务 <br>&nbsp; &nbsp; &nbsp; _asm{ <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mov vmmver,ax <br>&nbsp; &nbsp; &nbsp; } <br>&nbsp; &nbsp; &nbsp; nothing(); &nbsp; <br>&nbsp; // 测 试 在 运 行 于Ring0 的 &nbsp;<br>&nbsp; &nbsp; 中 断 例 程 中 调 用 子 <br>&nbsp;    &nbsp;_asm &nbsp;iretd &nbsp; &nbsp;<br>&nbsp; // 中 断 返 回, 与 在 实 模 式 &nbsp;<br>&nbsp; &nbsp; 编 程 无 本 质 区 别 <br>} <br>void main() // 主 程 序 <br>{ <br>&nbsp; &nbsp; &nbsp; _asm{ <br>&nbsp; &nbsp; &nbsp; mov &nbsp; eax, offset Ring0Proc <br>&nbsp; &nbsp; &nbsp; mov &nbsp; [OurGate], ax &nbsp;// 将 中 断 函 数 的 地 址 <br>&nbsp; &nbsp; &nbsp; shr &nbsp; eax, 16 &nbsp; // 填 入 新 造 的 中 断 门 <br>&nbsp; &nbsp; &nbsp; mov &nbsp; [OurGate +6], ax // 描 述 符 <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; sidt &nbsp;fword ptr IDTR &nbsp; &nbsp; <br>&nbsp; // 将 中 断 描 述 符 表 寄 存 器(IDTR) <br>&nbsp; &nbsp; &nbsp;的 内 容 取 出 <br>&nbsp; &nbsp; &nbsp; mov &nbsp; ebx, dword ptr [IDTR +2] <br>&nbsp; // 取 出 中 断 描 述 符 表(IDT) 基 地 址 <br>&nbsp; &nbsp; &nbsp; add &nbsp; ebx, 8 *9 &nbsp; <br>&nbsp; &nbsp;// 计 算Int 9 的 描 述 符 应 放 置 的 地 址 选 用 <br>&nbsp; &nbsp; Int9 是 因 为 它 在Win32 保 护 模 式 下 未 占 用 <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp; &nbsp;edi, offset SavedGate <br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp; &nbsp;esi, ebx <br>&nbsp; &nbsp; &nbsp; movsd &nbsp; // 保 存 原 来 的Int 9 描 述 符 到 <br>&nbsp; &nbsp; &nbsp; movsd &nbsp;//SavedGate 以 便 恢 复 <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp; &nbsp;edi, ebx <br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp; &nbsp;esi, offset OurGate <br>&nbsp; &nbsp; &nbsp; movsd &nbsp;// 替 换 原 来 的 中 断 门 描 述 符 <br>&nbsp; &nbsp; &nbsp; movsd &nbsp;// 以 安 装 中 断 服 务 例 程 <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; mov &nbsp; eax,0x6200 &nbsp;<br>&nbsp; &nbsp;// 用 以 测 试 放 在EAX 中 的 数 据 <br>&nbsp; &nbsp; &nbsp;能 否 正 确 传 到Ring0 中 断 <br>&nbsp; &nbsp; &nbsp; mov &nbsp; ecx,0 &nbsp;<br>&nbsp; &nbsp;// 用 以 测 试 放 在ECX 中 的 数 据 &nbsp;<br>&nbsp; &nbsp; &nbsp;能 否 正 确 传 到Ring0 中 断 <br>&nbsp; &nbsp; &nbsp; mov &nbsp; ecx,0 &nbsp;<br>&nbsp; &nbsp;// 用 以 测 试 放 在ECX 中 的 数 据 &nbsp;<br>&nbsp; &nbsp; &nbsp;能 否 正 确 传 到Ring0 中 断 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 因 为 很 多VxD 服 务 都 用 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;此 二 寄 存 器 传 递 参 数 <br>&nbsp; &nbsp; &nbsp; int &nbsp;9h &nbsp; <br>&nbsp; &nbsp; &nbsp;// 人 为 触 发 中 断, 平 时 会 出 现 <br>&nbsp; &nbsp; &nbsp; &nbsp;保 护 错 误 蓝 屏 或 非 法 操 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 作 对 话 框, 现 在 安 装 了 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 中 断 服 务 例 程 后, 就 会 通 过 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//VMM 在Ring0 调 用 中 断 服 务 例 程 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - -Ring0Proc <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp;edi, ebx <br>&nbsp; &nbsp; &nbsp; mov &nbsp; &nbsp;esi, offset SavedGate <br>&nbsp; &nbsp; &nbsp; movsd // 恢 复 原 来 的 中 断 门 描 述 符 <br>&nbsp; &nbsp; &nbsp; movsd <br>&nbsp; &nbsp; &nbsp; } <br>&nbsp; &nbsp; &nbsp; cout&lt;&lt;"CR0="&lt;&lt;_cr0&lt; <br>&nbsp;运 行 结 果: <br>&nbsp;<br>&nbsp;<br>&nbsp;<br>----此 方 法 的 好 处 一 是 回 避 了 奇 特 的VxD &nbsp;<br>文 件 格 式, 不 用 使 用 汇 编 语 言 编 程, 二 是 应 用 程 序 不 用 带 一 个 单 &nbsp;<br>独 的VxD 文 件, 干 净 利 索。 <br>----值 得 一 提 的 是, 许 多 文 章 描 述 著 名 的 <br>CIH 病 毒 都 说 其 利 用 了VxD 技 术, 是 说 它 带 一 个 单 独 的VxD 文 件 &nbsp;<br>吗 ? 显 然 不 可 能, 实 际 上CIH 病 毒 使 用 的 就 是 以 上 技 巧, 进 入Ring0 &nbsp;<br>后 调 用VMM 服 务 分 配 一 块 内 存, 把 自 身 拷 贝 进 去, 然 后 用IFS VxD 的 <br>IFSMgr_InstallFileSystemApiHook 服 务 安 装 文 件 系 统 监 视 以 感 染 其 他 文 &nbsp;<br>件, 只 不 过CIH 病 毒 安 装 的 是Int 3 中 断, 这 跟 在DOS 下 没 什 么 两 样。 &nbsp;<br>我 们 也 可 以 对 此 了 解 以 更 好 地 防 范CIH 病 毒。 <br>----最 后 还 要 指 出 其 缺 陷, 这 个 技 巧 仅 能 用 &nbsp;<br>在Windows95/97/98 下, 在Windows NT 下 行 不 通。 不 过 听 说CIH 病 毒 的 作 者 &nbsp;<br>已 经 开 发 了NT 版 的CIH 病 毒, 说 明NT 中 也 有 类 似 的" 后 门"。 <br>
 
谢谢,请问您知道NT的“后门”吗?有谁知道?
 
后退
顶部