我发现了一篇发表在1999.11.29   b13版的   
  《令win32应用程序跳入系统层》东南大学   卢威   luwei@126.com   
  是用vc++嵌汇编做的,   
  很接近了,可试试   
    
  BCB或DELPHI进入Ring0   
  东南大学卢威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();   
  }   
  ***********************************************   
    
  编译是通过了,你自己调试一下吧。   
  lea         esi,   MyInt;   一句语法应该有逻辑错误,要在Debug中仔细看一下。   
    
  procedure   MyInt;   
  asm   
      //   这里面的内容可要你自己写哦。   
  end;   
    
  const   HookExceptionNumber   =   3;   
    
  procedure   GetRing0;   
  asm   
  //   连续压入8个字节作为缓冲区   
  push         eax   
  push         eax;   
    
  //   取得idt偏移,共6字节,含段选择子2字节,偏移4字节。   
  sidt         [esp-02h];   //   Get   IDT   Base   Address   
    
  //   弹出4字节偏移   
  pop         ebx;   
    
  //   每个中断门8字节,所以偏移是HookExceptionNumber*08h   
  //   另外的4字节是定位到中心,因为中断门的4字节偏移分开放在8字节的0、1、6、7中。   
  //   0、1存放偏移低16位,6、7存放高16位。2,3是段选择子。4、5是门属性。   
  add         ebx,   HookExceptionNumber*08h   +   04h;   
    
  //   关中断,准备修改idt。   
  cli   
    
  //   取得中断门的4、5、6、7字节,其中6、7字节在ebp高16位   
  mov         ebp,   [ebx];   //   Get   Exception   Base   
    
  //   取得中断门的0、1字节到bp(实际上是ebp的低16位)。   
  mov         bp,   [ebx-04h];   //   Entry   Point   
  //   这样就合成了完整的32位偏移。   
    
  //   取得自己中断函数入口地址,放入esi中。   
  lea         esi,   MyInt;       
    
  //   压入堆栈   
  push         esi   
    
  //   填充入口低16位到中断门0、1字节。   
  mov         [ebx-04h],   si;   
    
  //   将高16位移动到低16位。   
  shr         esi,   16;   //   Modify   Exception   
    
  //   填充入口高16位到中断门6、7字节。   
  mov         [ebx+02h],   si;   //   Entry   Point   Address   
    
  //   idt修改完毕。   
    
  //   调整堆栈   
  pop         esi   
    
  //   此时堆栈比初始状态多压8字节。估计是在引发的中断中处理。   
  //   ebp的初始中断入口估计也是在自己的中断函数中用于恢复现场。   
    
  //   后面的就是引发软中断,取得ring0权力。   
  //   不过说句老实话。CIH的创意是不错,不过CIH的汇编的水平其实很一般。   
    
  int         HookExceptionNumber;   //   GenerateException   
    
  //   ReadyRestoreSE:   
  sti   
    
  end;   
  ----------------------------------   
  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;//在Delphi中应该改成:lea   ebx,   idtr;           sidt   [ebx]   
                          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;   
  ********************************   
  const   IntNo=3;   
    
  //var   
  //IDTR,SavedGate:int64;   
    
  procedure   Ring0Proc;     //   在Ring0中执行你自已的代码   
  begin   
          //   .......   
  //         showmessage('kfsdj;fk');   
          asm   
          mov   eax,CR0;     //   试验一下Ring3不能执行的特权指令   
          end;   
  end;   
  //   =====================================================   
  procedure       NewInt();   //新中断   
  begin   
              Ring0Proc();   
              asm   
              iretd;   
              end;   
  end;   
    
  procedure     GotoRing0;   
  begin   
              asm   
                          mov     edi,offset   buf;   
                          sidt   [edi];         //Get   IDT-->buf;   
                          mov   ebx,[edi+2]       //求中断门基址   
                          add   ebx,IntNo*8;   
                          mov   esi,ebx;   
                          push   edi;   
                          push   esi;   
                          movsd;   
                          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;   
                  end;   
  end;

http://blog.csdn.net/diligentcatrich/article/details/5493254

Delphi 能不能从Ring 3进入Ring 0的更多相关文章

  1. delphi vlc 安装bug 处理编译错误"0" is an invalid value for the "DebugInformation" parameter of the "DCC"

    处理编译错误"0" is an invalid value for the "DebugInformation" parameter of the "DCC" [摘要:http://blog.csdn ...

  2. 问题-[Delphi]用LoadLibrary加载DLL时返回0的错误

    问题现象:用LoadLibrary加载DLL一直返回0句柄,无法进行下一步操作,但同样的代码可以访问到别的DLL.问题处理:1.你加载的路径是不对的,一定要看好路径.2.你是在虚拟机中操作的DLL,因 ...

  3. Delphi中,FALSE 和 nil ,true 和 nil,0的区别

    True和False是布尔型(Boolean)的值,就是"是"或"否"的意思.nil就是空,一般用于指针或对象变量,指对针或对象对象一般初始化为nil或者释放后 ...

  4. uva 524 prime ring problem——yhx

      Prime Ring Problem  A ring is composed of n (even number) circles as shown in diagram. Put natural ...

  5. Lockless Ring Buffer Design

    https://www.kernel.org/doc/Documentation/trace/ring-buffer-design.txt Lockless Ring Buffer Design == ...

  6. OpenStack_Swift源代码分析——创建Ring及加入�设备源代码算法具体分析

    1 创建Ring 代码具体分析 在OpenStack_Swift--Ring组织架构中我们具体分析了Ring的具体工作过程,以下就Ring中添加�设备,删除设备,已经又一次平衡的实现过程作具体的介绍. ...

  7. OpenStack_Swift源代码分析——Ring基本原理及一致性Hash算法

    1.Ring的基本概念 Ring是swfit中最重要的组件.用于记录存储对象与物理位置之间的映射关系,当用户须要对Account.Container.Object操作时,就须要查询相应的Ring文件( ...

  8. UVa 524 Prime Ring Problem(DFS , 回溯)

    题意  把1到n这n个数以1为首位围成一圈  输出全部满足随意相邻两数之和均为素数的全部排列 直接枚举排列看是否符合肯定会超时的  n最大为16  利用回溯法 边生成边推断  就要快非常多了 #inc ...

  9. Segment,Path,Ring和Polyline对象

    Segment几何对象   Segment对象是一个有起点和终点的“线“,也就是说Segement只有两个点,至于两点之间的线是直的,还是曲的,需要其余的参数定义.所以Segment是由起点,终点和参 ...

随机推荐

  1. web Listener

    在web应用内部会不断地发生各种事件例如,web应用被启动,web应用停止,用户session开始,用户session 结束,用户请求到达,通常这些事件对开发者而言是透明的.实际上ServletAPI ...

  2. 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】

    Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...

  3. dotnet tools 运行 dotnet run

    dotnet tools 运行 dotnet run dotnet run 命令介绍 前言 本篇主要介绍 asp.net core 中,使用 dotnet tools 运行 dotnet run 之后 ...

  4. Delphi语言最好的JSON代码库 mORMot学习笔记1

    mORMot没有控件安装,直接添加到lib路径,工程中直接添加syncommons,syndb等到uses里 --------------------------------------------- ...

  5. ASP.NET MVC 5 学习教程:修改视图和布局页

    原文 ASP.NET MVC 5 学习教程:修改视图和布局页 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  6. commoncrawl 源码库是用于 Hadoop 的自定义 InputFormat 配送实现

    commoncrawl 源码库是用于 Hadoop 的自定义 InputFormat 配送实现. Common Crawl 提供一个示例程序 BasicArcFileReaderSample.java ...

  7. python读取文件内容方法

    1) readline 每次读一行,返回序列 2) readlines 一次全部读出,返回序列 3) numpy 的genfromtxt,返回为np的矩阵格式 import numpy as np f ...

  8. 文件打包bundle

    做项目时,经常会有一些资源拷来拷去会很麻烦,打包这些文件到项目里会方便很多! 首先把文件放到一个文件夹里                然后重命名文件夹为iToast.bundle 拖到项目里 如何访 ...

  9. JAVA序列化在IO中读写对象的使用

    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是为了解决在对对象流进行读写操作时所引发的问题. 序列 ...

  10. Wireshark安装、简单使用、过滤器简介

    1.简介 Wireshark是一款非常著名的网络嗅探器,它的前身是Ethereal.Wireshark是一款免费的软件,只需要从官网下根据不同的系统(window,linux等)下载其对应的安装文件即 ...