CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

BCB或DELPHI进入Ring0

楼主BCB(天下三分明月夜,二分无赖是扬州)2000-12-14 21:22:00 在 Delphi / VCL组件开发及应用 提问

东南大学卢威1999.12发表在<<计算机世界>>报上的一篇  
  <<WIN32跳入系统0层>>,原采用VC++编程,现改成C++Builder  
  供诸位参考,DELPHI类似;    
   
   
  void   Ring0Proc()     //   在Ring0中执行你自已的代码  
  {  
            //   .......  
            asm   mov   eax,CR0;     //   试验一下Ring3不能执行的特权指令  
            //   .......  
  }  
  //   =====================================================  
  void     __declspec(naked)   NewInt()   //新中断  
  {  
              Ring0Proc();  
              asm     iretd;  
  }  
  #define       IntNo       9  
  DWORDLONG       IDTR,SavedGate;  
  WORD   OurGate[4]={0,0x0028,0xee00,0x0000};  
  void     GotoRing0()  
  {  
              asm  
                    {  
                          mov     eax,offset   NewInt;  
                          mov     [OurGate],ax;  
                          shr     eax,16;  
                          mov     [OurGate+6],ax;  
                          sidt   fword   ptr   IDTR;  
                          mov     ebx,dword   ptr   [IDTR+2];  
                          add     ebx,IntNo*8;  
                          mov     edi,offset   SavedGate;  
                          mov     esi,ebx;  
                          movsd;  
                          movsd;  
                          mov     edi,ebx;  
                          mov     esi,offset   OurGate;  
                          movsd;  
                          movsd;  
                          int     IntNo;  
                          mov     edi,ebx;     //   开始恢复原中断门  
                          mov     esi,offset   SavedGate;  
                          movsd;  
                          movsd;  
                    }  
  }  
  //   ===================================================  
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
            GotoRing0();  
  }  
  问题点数:10、回复次数:21Top

1 楼Kingron(单身走我路……)回复于 2000-12-15 14:58:00 得分 0

呵呵,谢谢了,我测试一下试,准备收分吧!Top

2 楼Kingron(单身走我路……)回复于 2000-12-15 15:49:00 得分 0

我翻译成Delphi的。我测试过你的程序在BCB中可以通过,但是在Delphi中,sidt   指令却不能编译,那位高手知道如何修改?我可以单独开贴子送分!  
  const   IntNo=9;  
   
  var  
  IDTR,SavedGate:int64;  
  OurGate:array[0..3]   of   word=(0,$0028,$ee00,$0000);  
   
  procedure   Ring0Proc;     //   在Ring0中执行你自已的代码  
  begin  
          //   .......  
          asm  
          mov   eax,CR0;     //   试验一下Ring3不能执行的特权指令  
          end;  
  end;  
  //   =====================================================  
  procedure       NewInt();   //新中断  
  begin  
              Ring0Proc();  
              asm  
              iretd;  
              end;  
  end;  
   
  procedure     GotoRing0;  
  begin  
              asm  
                          mov     eax,offset   NewInt;  
                          mov     word   ptr[OurGate],ax;  
                          shr     eax,16;  
                          mov     word   ptr[OurGate+6],ax;  
                          sidt   fword   ptr   IDTR;//此处不能通过!如何修改?  
                          mov     ebx,dword   ptr   [IDTR+2];  
                          add     ebx,IntNo*8;  
                          mov     edi,offset   SavedGate;  
                          mov     esi,ebx;  
                          movsd;  
                          movsd;  
                          mov     edi,ebx;  
                          mov     esi,offset   OurGate;  
                          movsd;  
                          movsd;  
                          int     IntNo;  
                          mov     edi,ebx;     //   开始恢复原中断门  
                          mov     esi,offset   SavedGate;  
                          movsd;  
                          movsd;  
                  end;  
  end;  
  //   ===================================================  
   
   
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
    gotoring0;  
  end;  
  Top

3 楼zyb()回复于 2000-12-15 16:28:00 得分 0

关注Top

4 楼gjq2000(小兵)回复于 2000-12-15 16:56:00 得分 0

好问题!!!!!Top

5 楼lixiaolei(快乐)回复于 2000-12-16 15:50:00 得分 0

关注!  
  Top

6 楼GoodHope(好望角)回复于 2000-12-16 16:24:00 得分 0

换成  
  lea   ebx,   idtr;  
  sidt   [ebx]Top

7 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-17 13:23:00 得分 0

出去3天參加婚宴剛回,  
  準備再改一下.  
   
   
  Top

8 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-17 16:26:00 得分 0

为了优化,对原程序改动,取消OurGate数组,    
  直接修改原中断门,程序就出错,原来数组中  
  第三项0ee00h是门属性,不能不设,不太明白;  
  IDTR与SavedGate可以合二为一成Buf,注意:  
  此Buf可以须是全局或静态变量,不能是栈中  
  分配的动态变量,原因可能是传送指令movsd的  
  操作数不是相对于栈段;  
   
   
  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;  
                    }  
  }  
  //   ===================================================  
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
            GotoRing0();  
  }  
   
  改动后的程序,若有新问题,请再贴!!!!!!  
   
  Top

9 楼Anoa(寂寞小野)回复于 2000-12-17 16:45:00 得分 0

关注Top

10 楼saxash(还在想)回复于 2000-12-17 17:36:00 得分 0

关注Top

11 楼GoodHope(好望角)回复于 2000-12-17 19:06:00 得分 0

to   BCB:  
          $EE00代表:已经映射到物理内存的访问等级为3的386中断门。  
          我在2K下,没有调试。不过,不觉得你这样写程序有什么好。虽然是少用了4字节的存储空间,且不说代码却多了2条。而且使得程序流程晦涩难懂,这在汇编程序中是致命的问题。Top

12 楼yoci(阿呸)回复于 2000-12-17 23:49:00 得分 0

                                                push       eax                                                                        
                                                  sidt         [esp-02h]                
                                                  pop           ebx    
  这样如何?Top

13 楼lixiaolei(快乐)回复于 2000-12-18 10:18:00 得分 0

在Ring3能执行API函数吗?,难道又只能用汇编?Top

14 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-18 10:55:00 得分 0

非常感谢GoodHope等热心的网友指点!  
  对于门属性,未改前好象是8e00h,要改成0ee00h,才能成功,不知为什么?  
  代码重改的理由,不是针对几个字节或指令,主要是针对OurGate   数组:  
          OurGate[1]是选择子,它设成0028h,没有必要;所以取消  
  OurGate数组是应该的,改动后的流程还能算符合常理:  
        取IDT->取中断门地址->保存旧中断门(且暂存源、目)->   修改中断门->  
  执行中断->取出源、目且恢复旧门  
        修改后如果仍能正常,就满意了!  
  最后一个问题:  
        取得了特权ring0,我们能搞些什么应用????看了原文章,主要:  
      1.能执行特权指令了;  
      2.能执行BIOS了;  
      3.能执行VMM(虚拟管理器)管理了;  
      4.能执行DPMI服务了;  
  除了共知的CIH外,似乎“用处”大得“狠”,请高手解释!!!!!!!!!  
   
   
   
   
     
  Top

15 楼Kingron(单身走我路……)回复于 2000-12-18 11:27:00 得分 0

能不能封装两个函数出来?EnableRing0();DisableRing0();我在Delphi中测试,一运行就重新启动,或者出现蓝屏!Top

16 楼GoodHope(好望角)回复于 2000-12-18 11:38:00 得分 10

$8e00是已经映射到物理内存的访问等级为0的386中断门。自己的应用初始等级是3,是无法访问这段内存的。  
  Win9x下所有的选择子的基址像都一样,所以修改了也没关系。不然,你只修改了入口地址,却没有把门的段选择子改为自己代码段选择子,也是有问题的。如果要保险起见,可以将CS也填入到OurGate中去。  
   
  取得Ring0其实最重要的作用是执行特权指令,以便随意访问硬件资源(主要是内存),从而可以修改Windwos的核心。  
   
  2~3的内容在NT下都废除了,用处不大。  
   
  另外,Ring0下CLI然后HLT,可就真的死机了,只能Reset了^_^。Top

17 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-18 11:42:00 得分 0

to   Kingron:  
  是你“改进”后出现“兰屏”,还是本人提供的程序就出现“兰屏”?  
  在RING0下,也就是一会儿,又回到Ring3,象你用“开关”式的切换  
  可能较困难.  
  Top

18 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-18 11:48:00 得分 0

to   GoodHope:  
    经测试:选择子,修改前后,都是0028H,我原想就不设定了;  
    另外,你的意思int   3前加一条   STI,  
  ok!  
   
  Top

19 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-18 12:16:00 得分 0

to   Kingron:  
        你要常调用GotoRing0(),可将原Ring0Proc   稍改到一下,用函数名  
  做参数如:  
          GotoRing0(Ring0Proc1);  
          .....  
          GotoRing0(Ring0Proc2);  
          .....  
  就没必要做成“开关”式的切换了,拥有  
  “特权”的时间不宜太长.  
   
   
   
   
  Top

20 楼GoodHope(好望角)回复于 2000-12-18 13:57:00 得分 0

这段代码只是在自己中断处理程序中拥有RING0权限,出来了就没了。要想长期拥有Ring0,必须在中断中趁拥有Ring0权限,修改原程序段的属性,这个操作就复杂了。  
   
  to:BCB  
      我的意思是只有Ring0下才能轻易让机器彻底死掉。所以一般不要切过来,在Ring0下,程序错误的后果会非常严重。Top

21 楼Kingron(单身走我路……)回复于 2000-12-18 14:11:00 得分 0

哦,IC。  
  ***********************************************  
  你要常调用GotoRing0(),可将原Ring0Proc   稍改到一下,用函数名  
  做参数如:  
          GotoRing0(Ring0Proc1);  
                              ~~~~~~~~~~  
          .....  
          GotoRing0(Ring0Proc2);  
                              ~~~~~~~~~~~  
          .....  
  就没必要做成“开关”式的切换了,拥有  
  “特权”的时间不宜太长.  
  ****************************************  
  Top

相关问题

  • Delphi-->BCB
  • delphi->BCB,谢谢!
  • bcb 和delphi
  • Delphi 还是 BCB?
  • bcb代码转delphi
  • 讨论,bcb & delphi?????-----(bcb讨论)
  • BCB比DELPHI更难使唤!!
  • delphi程序改为bcb?
  • 拜师! (Delphi or BCB) +sql server 2000。
  • 几个Delphi->BCB的问题

关键词

  • 中断
  • 执行
  • 修改
  • 指令
  • 函数
  • 代码
  • bcb
  • asm
  • ourgate
  • gotoring

得分解答快速导航

  • 帖主:BCB
  • GoodHope

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo