关于令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;
}
...全文
114 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfdream 2000-05-25
  • 打赏
  • 举报
回复
怎么回事, 我试过的,正常。没有出现蓝屏现象。
用BCB 4企业版(BCC32命令)编译。
pwindows98第二版4.10.2222 A

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧