关于令Win32程序跳入Ring0层的实践(in BCB5.0)
hk318 2000-05-21 07:19:00 大家好:
看了有篇报道介绍如何令Win32程序跳入Ring0层后。
小弟使用BCB5.0实践了一下,仍然使用DOS控制台模式。但未获成功!仍然出现蓝屏现象。大家探讨一下好吗?
使用环境(Pwin98 2版,C++BUILDER 5。0 Enterprise)
若干疑惑:
1。使用VC可以通过?没试过
2。操作系统环境问题?不好说
3。本人代码有误?最有可能!!!
4。关于中断门的结构有误???
(即 WORD OurGate[4]={0,0x0028,0xee00,0x0000};)
本人跟踪以后,发现到 int 9h 以前都基本正常.
以下是本人的冤代码:(去掉DDK代码)
#include <windows.h>
#include <iostream.h>
DWORDLONG IDTR,SavedGate;
DWORD _eax,_ecx,_cr0;
WORD OurGate[4]={0,0x0028,0xee00,0x0000};
void __declspec( naked ) Ring0Proc(void) // 中 断 例 程, 运 行 在Ring0
{
_asm{
mov _eax,eax //
mov _ecx,ecx //
mov eax, CR0 // 测 试Ring3 中 不 能 执 行 的 特 权 指 令
mov _cr0,eax //
iretd // 中断返回,与在实模式编程无 本 质 区 别
}
}
int main(int argc, char* argv[])
{
_asm{
mov eax, offset Ring0Proc
mov word ptr [OurGate], ax // 将 中 断 函 数 的 地 址
shr eax, 16 // 填 入 新 造 的 中 断 门
mov word ptr [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 描 述 符 到 SavedGate 以 便 恢 复
movsd
mov edi, ebx
mov esi, offset OurGate
movsd // 替 换 原 来 的 中 断 门 描 述 符
movsd // 以 安 装 中 断 服 务 例 程
mov eax,0x6200 //用以测试放在EAX 中的数据能否正确传到Ring0中断
mov ecx,0// 用以测试放在ECX中的数据能否正确传到Ring0 中断
// 因为很多VxD 服 务 都 用 此 二 寄 存 器 传 递 参 数
int 9h // 人为触发中断, 平时会出现保护错误蓝屏或非法操
// 作对话框,现在安装了中断服务 例 程 后, 就 会 通 过
//VMM 在Ring0 调 用 中 断 服 务 例 程 Ring0Proc
mov edi, ebx
mov esi, offset SavedGate
movsd // 恢 复 原 来 的 中 断 门 描 述 符
movsd
}
cout<<"CR0="<<uppercase<<hex<<_cr0<<" EAX="<<hex<<_eax<<" EBX="<<hex<<_ecx<<endl;
return 0;
}