关于令Win32程序跳入Ring0层的实践

hk318 2000-05-21 07:18: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;
}
...全文
341 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
BCB 2000-12-29
  • 打赏
  • 举报
回复

void Ring0Proc() // 在Ring0中执行你自已的子程序
{
asm mov eax,CR0; // 测验Ring3不能执行的特权指令
}
// =====================================================
void __declspec(naked) NewInt() //新中断
{
Ring0Proc();
asm iretd;
}
#define IntNo 3

void GotoRing0()
{
static DWORDLONG Buf; //静态或全局变量
asm
{
mov edi,offset Buf;
sidt [edi]; // 取IDT->Buf
mov ebx,[edi+2]; // 求中断门基址
add ebx,IntNo*8;
mov esi,ebx;
push edi;
push esi;
movsd; //保存原中断门->Buf
movsd;

cli;
mov eax,offset NewInt;
mov [ebx],ax;
shr eax,16;
mov [ebx+6],ax; // 修改新中断门
mov ax,0ee00h;
mov [ebx+4],ax; // 设置门属性

int IntNo;

pop edi;
pop esi;
movsd; // 恢复原中断门
movsd;
sti;
}
}
// ===================================================

NowCan 2000-05-23
  • 打赏
  • 举报
回复
我用C++Builder3 的命令行编译器BCC32编译通过,程序运行后结果:
CR0=80000013 EAX=6200 EBX=0
mach 2000-05-22
  • 打赏
  • 举报
回复
像 jmp far next:
next:
这样的的操作一般有两种用途:
1清除cpu中的指令预取队列,这一般是用在一些加/解密软件或病毒中,由于程序动态修改代码,所以要清除cpu中的指令预取队列.
2由实模式进入保护模式时,通过该操作来装入cs.
在该程序中既不修改自身代码,也无需再装入(调用中断时,已经装入cs了),所以不用jmp far.
"I know the processing of CPU load the mechine code
is different between the ring0 and ring3. so same mechine
code array means the different code in the ring0 and ring3."
这里的不同应该是在实模式与保护模式之间,而不是保护模式下的ring0和ring3之间.
win9x下的主控台程序仍是保护模式下的32位程序.
出现蓝屏现象应该是另有原因.
lu0 2000-05-22
  • 打赏
  • 举报
回复
经典的CIH手段运用.:)
http://lu0.126.com
茂奇软件 2000-05-22
  • 打赏
  • 举报
回复
Hi,
I know the processing of CPU load the mechine code
is different between the ring0 and ring3. so same mechine
code array means the different code in the ring0 and ring3.
So we need write a jmp far code in the ring0 mode. Would you
please reference i386p asm book.
I guess vc++ compiler have solve the problem. but c++builder
still do not know it, you need do it by yourself.
I can not assure whether my solution will help you.
Would you please let me know the result, whatever
it can solve it or not.

Regards
Jansen Zhu


void __declspec( naked ) Ring0Proc(void) // 中 断 例 程, 运 行 在Ring0
{
_asm{
mov _eax,eax //
mov _ecx,ecx //
mov eax, CR0 // 测 试Ring3 中 不 能 执 行 的 特 权 指 令
mov _cr0,eax //
jmp far next:
next:
iretd // 中断返回,与在实模式编程无 本 质 区 别
}
}
hotbaby 2000-05-22
  • 打赏
  • 举报
回复
VC可以通过
lqjin 2000-05-22
  • 打赏
  • 举报
回复
1。使用VC可以通过,我试过
2。与操作系统环境无关!
3。此代码在VC中无误!
4。中断门的结构没有错误。
注意:Ring0Proc程序中不能设断点,不能跟踪Ring0级程序
sunsetyang 2000-05-22
  • 打赏
  • 举报
回复
可能是由于Cbuilder优化的问题,试一下将编译开关中的优化选项去掉后再试一下。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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