中断门

合集下载

2-保护模式-2.3

2-保护模式-2.3
微机接口技术
微机接口技术
第二模块 保护模式
微机接口技术
任务
多任务环境,是指其硬件允许软件系统 中存在多个任务,并能够以分时的方式使各 程序轮流执行。 当运行一个应用程序后,操作系统就为 这个程序创建一个任务。
微机接口技术
任务寄存器(TR)
• 在保护模式下,在任何时刻都有一个当 前任务,当前任务由TR寄存器指定,CPU在 这个任务的环境下执行。因此,系统中至 少存在一个任务。 • TR为16位选择符,选中TSS描述符.
微机接口技术
Privilege – check
16-bit visible selector CS Target Segment Selector INDEX RPL Invisible Descriptor CPL
Privilege check by CPU
Data Segment Descriptor
微机接口技术
由任务寄存器TR取得TSS的过程
Physical Memory ③ TR 16 15 0 LIMIT ⑤ TSS TSS descriptor GDT ①② 47 BASE

①和②步由GDTR确定了GDT表在存储器中的位 臵和限长。TR是一个选择符,这个选择符中包含了 TSS描述符在GDT中的索引。③步依据TR在GDT中取
出TSS描述符。在第④和⑤步中,在TSS描述符中取
得TSS的基址和限长。
微机接口技术
任务执行环境
每个任务都由两个部分组成:任务执行 环境TES(Task Executation Space)和任务 状态段TSS(Task State Segment)。任务执 行环境包括一个代码段、堆栈段和数据段等, 任务在每一个特权级上执行时都有一个堆栈 段。 图2-26

PS2键盘保护的另一种方法

PS2键盘保护的另一种方法

PS2键盘保护的另一种方法By Mixmix#为了保障用户输入帐号密码的安全性,各种安全控件、密码保险箱产品比比皆是,衍生出了很多保护键盘的方法。

就笔者了解的,纠结到系统底层国内的资料大部分都是落在了直接I/O端口读写上,再往上一点就是IDT中断了,本文将逐步探讨和中断有关的攻防技术,这也是笔者一次学习和小结的过程。

一、基础知识有不少内容其实大学的课程里面都有,只是当时听讲的时候大都觉得枯燥无味,刚走出大学校门时更是觉得那时候学的那些东西在实际工作中几乎完全用不到,但是在深入学习和研究过程中才发现原来那些东西居然真的需要被了解和掌握。

所谓中断,就是指在CPU执行过程中出现了某些突发事件时,CPU需要停止当前程序转去处理突发事件,处理完成后返回原处继续之前的工作。

那么系统中每个中断对应的哪段处理代码(即中断门),就需要一份对应的表以供查找,这个表被称为中断描述符表InterruptDescriptor Table(即IDT)。

对于IDT的存放和使用,按照程序员的逻辑来说就是在一片连续内存中依次存放着0xFF个P2C_IDTENTRY结构,结构描述如下:--code-------------------------------------------------------------------------typedefstruct P2C_IDT_ENTRY_ {P2C_U16 offset_low;//中断门所在地址的底位P2C_U16 selector;P2C_U8 reserved;P2C_U8 type:4;P2C_U8 always0:1;P2C_U8 dpl:2;P2C_U8 present:1;P2C_U16 offset_high; //中断门所在地址的高位} P2C_IDTENTRY, *PP2C_IDTENTRY;-------------------------------------------------------------------------------在WindowsXP默认的IDT中,第0x93个结构就是被用来描述键盘的中断门。

Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类

Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类

Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类相关学习资料《深⼊理解计算机系统(原书第2版)》.pdf/zh/%E4%B8%AD%E6%96%B7独辟蹊径品内核:Linux内核源代码导读李云华著中⽂ PDF版https:////orange_os/article/details/7485069/sunnybeike/article/details/6958473/di_yang@yeah/blog/static/861184922012124105030284//content/13/0829/21/7377734_310810291.shtm⽬录1. 从异常控制流开始说起2. 中断类型3. 中断的初始化4. 门描述符5. IDT中断描述符表6. 异常控制类型1. 从异常控制流开始说起0x1: 异常控制流简介从给处理器加电开始,知道断电为⽌,程序计数器假设⼀个值的序列:A0, A1, ...., An-1其中,每个Ak是某个相应的指令Ik的"地址"。

每次从Ak到Ak+1的过渡称为控制转移(control transfer)。

这样的控制转移序列叫作处理器的控制流(flow of control或control flow)控制流可以⼤致分为:1. "平滑的"序列(即顺序执⾏)其中每个Ik和Ik+1在存储器中都是相邻的,CPU按照计数器进⾏逐条指令的依次执⾏2. ⾮平滑控制流Ik+1与Ik不相邻,是由诸如跳转、调⽤、和返回这样⼀些程序指令造成的。

这样⼀些指令都是必要的机制,使得程序能够对由程序变量表⽰的内部状态中的变化做出反应。

但是系统也必须能够对系统状态变化做出反应,这些系统状态不是被内部程序变量捕获的,⽽且也不⼀定和程序的执⾏相关。

⽐如:但是系统也必须能够对系统状态变化做出反应,这些系统状态不是被内部程序变量捕获的,⽽且也不⼀定和程序的执⾏相关。

硬件中断

硬件中断

硬件中断硬件中断概述中断可以用下面的流程来表示:中断产生源 --> 中断向量表 (idt) --> 中断入口 ( 一般简单处理后调用相应的函数) --->do_IRQ--> 后续处理(软中断等工作)如图:具体地说,处理过程如下:1.中断信号由外部设备发送到中断芯片(模块)的引脚2.中断芯片将引脚的信号转换成数字信号传给CPU,例如8259主芯片引脚0发送的是0x203.CPU接收中断后,到中断向量表IDT中找中断向量4.根据存在中断向量中的数值找到向量入口5.由向量入口跳转到一个统一的处理函数do_IRQ6.在do_IRQ中可能会标注一些软中断,在执行完do_IRQ后执行这些软中断。

下面一一介绍。

8259芯片本文主要参考周明德《微型计算机系统原理及应用》和billpan的相关帖子1.中断产生过程(1)如果IR引脚上有信号,会使中断请求寄存器(Interrupt Request Register,IRR)相应的位置位,比如图中, IR3, IR4, IR5上有信号,那么IRR的3,4,5为1(2)如果这些IRR中有一个是允许的,也就是没有被屏蔽,那么就会通过INT 向CPU发出中断请求信号。

屏蔽是由中断屏蔽寄存器(Interrupt Mask Register,IMR)来控制的,比如图中位3被置1,也就是IRR位3的信号被屏蔽了。

在图中,还有4,5的信号没有被屏蔽,所以,会向CPU发出请求信号。

(3)如果CPU处于开中断状态,那么在执行指令的最后一个周期,在INTA上做出回应,并且关中断.(4)8259A收到回应后,将中断服务寄存器(In-Service Register)置位,而将相应的IRR复位:8259芯片会比较IRR中的中断的优先级,如上图中,由于IMR中位3处于屏蔽状态,所以实际上只是比较IR4,I5,缺省情况下,IR0最高,依次往下,IR7最低(这种优先级可以被设置),所以上图中,ISR被设置为4.(5)在CPU发出下一个INTA信号时,8259将中断号送到数据线上,从而能被CPU接收到,这里有个问题:比如在上图中,8259获得的是数4,但是CPU需要的是中断号(并不为4),从而可以到idt找相应的向量。

计算机三级(PC技术)笔试149

计算机三级(PC技术)笔试149

[模拟] 计算机三级(PC技术)笔试149一、选择题(每题1分,共60分) 在下列各题的[A]、[B]、[C]、[D] 四个选项中,只有一个选项是正确的。

第1题:在数据传送过程中,数据由串行变为并行,或并行变为串行,这种转换是通过接口电路中的______实现的。

A.数据寄存器B.移位寄存器C.锁寄存器D.地址寄存器参考答案:B第2题:下列关于批处理操作系统的描述,错误的是( )。

A.它属于单用户操作系统B.它属于多用户操作系统C.它的两大特点是多道运行和成批处理D.它可以脱机操作参考答案:A第3题:RAID是一种提高键盘存储速度、容量和可靠性的技术。

下面有关RAID的叙述中,错误的是______。

A.RAID的中文名称是磁盘冗余阵列B.条块技术可以提高磁盘存储器的传输性能C.为了提高可靠性,RAID中采用了镜像冗余技术和校验冗余技术D.RAID只能用SCSI磁盘驱动器来实现参考答案:D第4题:假设某汇编语言源程序的代码段的段名是CSEG,启动地址为START,下面可用来预置CS寄存器的语句是( )。

A.ASSUME CS:CSEGB.END STARTC.MOV CS,CSEGD.MOV AX,CSEG和MOV CS,AX参考答案:B第5题:网卡的功能是将PC机或服务器连接到网络上,下面关于以太网网卡的叙述中,不正确的是( )。

A.百兆速率的以太网网卡采用BNC细同轴电缆接口B.以太网网卡采用CSMA/CD介质访问控制方法C.每块网卡都有一个全球惟一的网络地址(网卡的物理地址)D.目前使用最多的以太网网卡是10/100M自适应网卡参考答案:A网卡(Network Interface Card,NIC)作为局域网中最基本的部件之一,又可以称之为网络卡或网络接口卡。

网卡的工作原理,就是整理计算机上发往网络上的数据,并将数据分解为适当大小的数据包之后向网络发送。

第6题:下面关于PC机键盘的叙述中,不正确的是( )。

保护模式详解

保护模式详解

保护模式详解在ia32下,cpu有两种⼯作模式:实模式和保护模式。

在实模式下,16位的寄存器⽤“段+偏移”的⽅法计算有效地址。

段寄存器始终是16位的。

在实模式下,段值xxxxh表⽰的以xxxx0h开始的⼀段内存。

但在保护模式下,段寄存器的值变成了⼀个索引(还有附加信息)这个索引指向了⼀个数据结构的表(gdt/ldt)项,表项(描述符)中详细定义了段的其实地址、界限、属性等内容。

保护模式需要理解:描述符,选择⼦描述符包括,存储段描述符(代码段,数据段,堆栈段),系统描述符(任务状态段TSS,局部描述符表LDT),门描述符(调⽤门,任务门,中断门,陷阱门),下⾯以存储段描述符位例我们看⼀下描述符的结构:描述符共8个字节:0,1字节是段界限(2字节)2,3,4字节是段基址的低24位(3字节)5,6字节是段基址的属性(2字节)7字节是段机制的⾼8位(1字节)属性:(1) P:存在(Present)位。

P=1 表⽰描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中;P=0 表⽰描述符对地址转换⽆效,即该段不存在。

使⽤该描述符进⾏内存访问时会引起异常。

(2) DPL: 表⽰描述符特权级(Descriptor Privilege level),共2位。

它规定了所描述段的特权级,⽤于特权检查,以决定对该段能否访问。

(3) DT:说明描述符的类型。

对于存储段描述符⽽⾔,DT=1,以区别与系统段描述符和门描述符(DT=0)。

(4) TYPE: 说明存储段描述符所描述的存储段的具体属性。

数据段类型类型值说明----------------------------------0只读1只读、已访问2读/写3读/写、已访问4只读、向下扩展5只读、向下扩展、已访问6读/写、向下扩展7读/写、向下扩展、已访问选择⼦的结构:RPL(Requested Privilege Level): 请求特权级,⽤于特权检查。

操作系统学习(十三)、中断和异常

操作系统学习(十三)、中断和异常

操作系统学习(⼗三)、中断和异常⼀、中断和异常中断何和异常是指明系统、处理器或当前执⾏程序(或任务)的某处出现⼀个事件,该事件需要处理器进⾏处理。

通常,这种事情会导致执⾏控制器被强迫从当前运⾏程序转移到被称为终端处理程序或异常处理程序的特殊软件函数或任务中。

处理器响应中断或异常所采取的⾏动称为中断/异常服务(处理)。

通常中断发⽣在程序执⾏的随机时刻,以响应硬件发出的信号。

系统硬件使⽤中断来处理外部事件,例如要求为外部设备提供服务。

当然,软件也能通过执⾏ INT n 指令产⽣中断。

异常发⽣在处理器执⾏⼀条指令时,检测到⼀个出错条件时发⽣,例如被0除出错条件。

处理器可以检测到各种出错条件,包括违反保护机制。

页错误以及机器内部错误。

对应⽤程序来说,80x86的中断和异常处理机制可以透明地处理发⽣的异常和中断事件。

当收到⼀个中断或检测到⼀个异常时,处理器会⾃动把当前正在正在执⾏的程序或任务挂起,并开始运⾏中断或异常处理程序。

当处理程序执⾏完毕,处理器就会恢复并继续执⾏被中断的程序或任务。

被中断程序的恢复过程并不会失去程序执⾏的连贯性,除⾮从异常中恢复是不可能的或者中断异常导致当前运⾏程序被终⽌。

⼆、异常和中断向量为了有助于处理异常和中断,每个需要被处理器进⾏特殊处理的处理器定义的异常和中断条件都被赋予了⼀个标识号,称为向量。

处理器把赋予异常或中断的向量⽤作中断描述符表IDT中的⼀个索引号,来定位⼀个异常或中断的处理程序⼊⼝点位置。

允许的向量号范围是0到255.其中0到31保留⽤作80x86处理器定义的异常和中断,不过⽬前该范围内的向量号并⾮每个都已定义了功能,未定义功能的向量号将留在以后使⽤。

范围在32到255的向量号⽤于⽤户定义的中断。

这些中断通常⽤于外部I/O设备,使得这些设备可以通过外部硬件中断机制向处理器发送中断。

三、中断源和异常源(⼀)、中断源处理器从两种地⽅接收终端:外部(硬件产⽣)的中断。

中断门和陷阱门的区别

中断门和陷阱门的区别
中断门和陷阱门的区别
通过中断门的转移和通过陷阱门的转移之间的差别只是对IF标志的处理。对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断(当然,在中断处理程序中可以人为设置IF标志打开中断,以使得在处理程序执行期间允许响应可屏蔽中断);对于陷阱门,在转移过程中保持IF位不变,即如果IF位原来是1,那么通过陷阱门转移到处理程序之后仍允许INTR中断。因此,中断门最适宜于处理中断,而陷阱门适宜于处理异常。

中断门是x86的一种指向(code,data,stack)段描述符的一种特殊的段描述符,也就是system segment,而code,data,stack则为user segment. 当中断产生的时候,中断向量在IDT表中获得中断门,然后根据中断门中对应的segment selector定位获得GDT或LDTห้องสมุดไป่ตู้的code segment,获得中断服务历程的entry地址。

2017年FM350-1功能模块使用说明(word版本)

2017年FM350-1功能模块使用说明(word版本)

FM350-1功能模块
使




FM350-1概述
单通道智能计数模板,可连接5V增量编码器、24V增量编码器、带方向信号的脉冲传感器, 5V信号最大500Hz, 24V 信号最大200Hz,具有软件门和硬件门控制计数和测量,带比较值输出。

FM350-1可以在IM153-1、IM153-2、S7-300系统中使用。

安装和接线
在选择好计数传感器后需要确认模板侧面的跳线块, A对应5V信号,D对应24V信号。

操作方式
首先安装FM350-1软件,在SIMATIC Manager中打开库FMx50LIB。

复制所有的块进入自己的项目。

仅仅6ES7 350-1AH03-0AE0具有测量功能。

下面描述几个功能块的性能和区别
FC0 计数和测量功能,使用UDT1生成的数据块
FC1 诊断FM模板
FC2 计数和测量功能,支持等时模式,能够在操作中改变参数和置位、复位输出。

使用UDT2生成的数据块。

FC3 功能和FC2基本一样,但仅仅使用在等时模式,对等时模式进行了优化,运算速度在等时模式比FC2快
计数模式
首先生成应用程序数据块。

单片机中断机制原理与应用

单片机中断机制原理与应用

单片机中断机制原理与应用单片机中断机制是指在单片机运行过程中,当外部事件发生时,中断信号能够打断当前的程序执行,转而执行与该中断相关的程序。

中断机制通过提供一种异步的、及时响应外部事件的方式,提高了单片机的运行效率和处理能力。

一、中断机制的原理中断机制主要由中断请求、中断响应和中断处理三个部分组成。

1. 中断请求:中断请求是由外部设备向单片机发送的信号,用来表示某个事件发生了。

例如,外部设备需要向单片机传输数据或者有紧急事件需要处理时,就会发送中断请求。

中断请求一般通过引脚来传递,当中断请求信号为高电平时,表示中断请求发生。

2. 中断响应:当单片机接收到中断请求信号后,会检查是否允许中断发生。

单片机通常有一个或多个中断允许位,用来控制各个中断源的优先级和响应情况。

如果中断允许位为1,则表示允许该中断发生,单片机将进入中断响应的状态。

3. 中断处理:中断处理是指单片机在接收到中断请求后,暂停当前程序的执行,转而执行与该中断相关的程序。

中断处理过程包括保存当前程序的现场状态、执行中断服务程序、最后恢复现场并返回到原来的程序继续执行。

二、中断机制的应用中断机制在单片机的应用中起到了重要的作用,主要体现在以下几个方面:1. 外部设备的数据传输:当外部设备需要与单片机进行数据传输时,可以利用中断机制来实现。

通过中断请求信号触发单片机的中断响应,使得单片机能够及时响应外部设备的数据传输请求。

这种方式可以减少对单片机的轮询,提高系统的响应速度和效率。

2. 定时器应用:单片机中一般都内置了定时器模块,可以通过中断机制实现定时器的应用。

通过设置定时器中断允许位和初始化定时器计数值,可以实现在特定的时间间隔触发中断请求。

这个特性在实时系统中具有很重要的意义,可以及时响应并处理一些实时任务。

3. 外部事件的处理:一些外部事件,如按键输入、传感器检测等,需要及时响应并进行处理。

通过中断机制,可以实现对这些外部事件的即时检测和响应。

中断机制和中断描述符表、中断和异常的处理

中断机制和中断描述符表、中断和异常的处理

中断机制和中断描述符表、中断和异常的处理注:本分类下⽂章⼤多整理⾃《深⼊分析linux内核源代码》⼀书,另有参考其他⼀些资料如《linux内核完全剖析》、《linux c 编程⼀站式学习》等,只是为了更好地理清系统编程和⽹络编程中的⼀些概念性问题,并没有深⼊地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友⾃⼰参考相关资料。

此书出版较早,分析的版本为2.4.16,故出现的⼀些概念可能跟最新版本内核不同。

此书已经开源,阅读地址1、中断向量Intel x86 系列微机共⽀持256 种向量中断,为使处理器较容易地识别每种中断源,将它们从0~255 编号,即赋予⼀个中断类型码 n,Intel 把这个8 位的⽆符号整数叫做⼀个向量,因此,也叫中断向量。

所有256 种中断可分为两⼤类:异常和中断。

异常⼜分为故障(Fault)、陷阱(Trap)和夭折(Abort),它们的共同特点是既不使⽤中断控制器,⼜不能被屏蔽。

中断⼜分为外部可屏蔽中断(INTR)和外部⾮屏蔽中断(NMI),所有I/O 设备产⽣的中断请求(IRQ)均引起屏蔽中断,⽽紧急的事件(如硬件故障)引起的故障产⽣⾮屏蔽中断。

⾮屏蔽中断的向量和异常的向量是固定的,⽽屏蔽中断的向量可以通过对中断控制器的编程来改变。

Linux 对256 个向量的分配如下。

• 从0~31 的向量对应于异常和⾮屏蔽中断。

• 从32~47 的向量(即由I/O 设备引起的中断)分配给屏蔽中断。

• 剩余的从48~255 的向量⽤来标识软中断。

Linux 只⽤了其中的⼀个(即128 或0x80向量)⽤来实现系统调⽤。

当⽤户态下的进程执⾏⼀条int 0x80 汇编指令时,CPU 就切换到内核态,并开始执⾏system_call() 内核函数。

2、外设可屏蔽中断、异常及⾮屏蔽中断Intel x86 通过两⽚中断控制器8259A 来响应15 个外中断源,每个8259A 可管理8 个中断源。

三、中断和异常

三、中断和异常

三、中断和异常1.中断 同步中断:由当前CPU执⾏完⼀条指令之后产⽣,intel处理器⼿册也将同步中断称为异常。

异步中断:由其他硬件设备依照CPU时钟信号随机产⽣,intel处理器⼿册将异步中断称为中断。

中断处理需要满⾜的约束: 1.中断处理必须尽可能的快和短,关键紧急和跟硬件相关的操作内核应⽴即执⾏,其余推迟的部分由内核稍后执⾏。

2.中断处理程序必须能够嵌套执⾏(针对不同类型的中断)。

3.内核代码的临界区中应该禁⽌中断。

但是必须尽可能的限制这样的临界区,否则会⼤⼤降低内核的运⾏效率。

2.中断和异常 Intel⽂档对中断和异常的分类: 中断: 可屏蔽中断(IRQ)、⾮屏蔽中断  异常: 处理器探测异常:当CPU执⾏指令时探测到的⼀个反常条件所产⽣的异常,可以进⼀步分为三组,取决于产⽣异常时eip寄存器的值。

故障,陷阱,异常中⽌,编程异常3.IRQ和中断 每个能发出中断请求的硬件设备控制器都有⼀条名为IRQ的输出线。

所有的IRQ线都与⼀个名为可编程中断控制器(PIC)的硬件电路的输⼊引脚相连。

IRQ线从0开始顺序编号。

可以有选择的禁⽌每条IRQ线,通过对PIC编程禁⽌和激活IRQ。

禁⽌的中断是丢失不了的,⼀旦中断被激活,PIC会将之前的中断信号发送到CPU,这样中断处理程序可以逐次地处理同⼀类型的IRQ。

⾼级可编程中断控制器: I/O⾼级可编程控制器(APIC),每个CPU都有⼀个本地APIC,每个APIC都有32位寄存器,所有本地APIC都连接到⼀个外部I/O APIC,形成⼀个多APIC的系统。

I/O APIC的组成:⼀组24条IRQ线、⼀张24项的中断重定向表。

中断优先级不与引脚号相关联,中断重定向表中的每⼀项都可以被单独编程以指明中断向量和优先级、⽬标处理器和选择处理器的⽅式。

来⾃外部硬件设备的中断请求以两种⽅式在可⽤CPU之间分发: 静态分发: IRQ信号传递给重定向表相应项中所列出的本地APIC。

80x86的进程管理与切换、描述符(表)

80x86的进程管理与切换、描述符(表)

80x86的进程管理与切换、描述符(表)【说明】1、 这是网友的资料,本人觉得很好,只是对其稍加整理与补充。

整理时间:2012年11月26日20:58:432、 这并不是针对具体的操作系统的,这只是80x86 CPU 对操作系统进程管理与切换的硬件支持。

80386保护模式下的程序需要经常用到如下一些数据结构·选择符(selector )·描述符表 (descriptor table )·段描述符(segment descriptor )·门描述符(gate descriptor )他们之间的关系如下:1.80386段管理机制80386分段机制需要用到以下数据结构:·段描述符(segment descriptor )·段描述符表 (descriptor table )·选择符(selector )1.1 段80386有两种类型的段。

存储段是存放可由程序直接进行访问的代码和数据的段。

系统段是为了实现存储管理机制所使用的一种特别的段。

在80386中,有两种系统段:任务状态段TSS 和局部描述符表LDT 段。

存储段没有特定的格式,存放的是简单的代码或者数据。

系统段有特殊的格式,LDT 段存放的是局部描述符表,整个段就是一张表,每个表项是8字节的段描述符号。

TSS 段存放的是任务状态,它有特定的数据结构,下面会有介绍。

LDT TSS ⎧⎧⎪⎪⎨⎪⎪⎩⎨⎧⎪⎪⎨⎪⎪⎩⎩代码段存储段数据段80386的段局部描述符表段系统段任务状态段入口 入口1.2 段描述符80386的描述符类型一共两种,除了段描述符还有一种是门描述符,门描述符一共四种类型:任务门、中断门、陷阱门和调用门。

门描述符和段描述符差别很大,很多字段意义完全不同。

80386描述符如下:门描述符后面介绍,本节介绍段描述符。

在保护方式下,每一个段都有一个相应的8字节描述符来描述。

段描述符中保存了段的所有属性,如段基地址,段限长,段特权级等。

计算机系统基础:IA-32中的异常、中断机制及处理单元测试与答案

计算机系统基础:IA-32中的异常、中断机制及处理单元测试与答案

一、单选题1、以下关于x86实地址模式下异常/中断机制的叙述中,错误的是()。

A.中断向量表固定在0~3FFH的内存区域B.中断服务程序首地址占8个字节C.中断向量地址为中断类型号乘以4D.采用向量中断方式识别中断源正确答案:B解析: B、实地址模式下,每个中断向量占4个字节,由16位段地址和16位段内偏移量组成,通过对段地址左移4位然后加上段内偏移量,以得到20位的中断服务程序首地址。

2、以下关于x86系统启动过程的叙述中,错误的是()。

A.BIOS程序在主存中设置中断向量表B.进入保护模式后中断向量表中被填入新的中断向量C.与输入/输出相关的操作通过执行int指令由中断服务程序实现D.开机后系统首先在实地址模式下工作正确答案:B解析: B、系统启动结束时进入保护模式,此时,不再使用主存0~3FFH区域内的中断向量表,而是通过专门的中断描述符表来获得中断服务程序或异常处理程序的入口地址。

3、以下关于IA-32的异常/中断机制的叙述中,错误的是()。

A.在实地址模式下使用中断向量表保存异常处理程序和中断服务程序的首地址B.在保护模式下通过中断描述符表获取异常处理程序和中断服务程序的首地址C.中断向量表和中断描述符表中都有256个表项,每个表项都占8个字节D.最多可以有256种异常和中断类型,每种类型有一个中断号i(0≤i≤255)正确答案:C解析: C、实地址模式下,每个中断向量表的表项占4个字节,由16位段地址和16位段内偏移量组成。

4、以下选项中,不属于中断描述符表中表项内容的是()。

A.调用门描述符B.任务门描述符C.陷阱门描述符D.中断门描述符正确答案:A5、以下关于IA-32的中断门描述符的叙述中,错误的是()。

A.包含对应中断服务程序首地址(段选择符和偏移地址)B.包含存在位(字段P),用于表示对应中断类型是否存在C.包含DPL字段,用于表示访问本段时的CPL所要求的最低特权级D.每个中断门描述符占64位,与一个中断类型号对应解析: B、存在位P用于表示对应段(即异常处理程序或中断服务程序所在的段,通常就是指内核代码段)是否存在,而不是表示对应中断类型是否存在。

Windows内核—保护模式

Windows内核—保护模式

Windows内核—保护模式本⽂只是个⼈的学习笔记,作为个⼈复习⾃⽤,侵删1、段机制概述段机制就是把虚拟地址空间中的虚拟内存组织成⼀些长度可变的内存块单元。

2、段机制基础——段寄存器2.1 段每个段由3部分参数定义:段基地址、段限长和段属性需要8个字节(64bit)存储这些信息。

2.2 段寄存器要想知道内存单元是如何组织的,就得先来认识段寄存器。

段寄存器其实因内存的分段管理机制⽽起,计算机需要对内存分段,以分配给不同的程序使⽤。

如 2.1 所述的只需要64位存储这些信息,⽽段寄存器只有16位,因此段寄存器中只能存储段选择符,再由段号映射到内存的GDT表中,读取段的信息。

8个96位的段寄存器1、CS 代码段寄存器存放当前正在运⾏的程序代码所在段的段基址,表⽰当前使⽤的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供。

2、DS 数据段寄存器指出当前程序使⽤的数据所存放段的最低地址,即存放数据段的段基址。

3、SS 堆栈段寄存器指出当前堆栈的底部地址,即存放堆栈段的段基址。

4、ES 附加段寄存器指出当前程序使⽤附加数据段的段基址,该段是串操作指令中⽬的串所在的段。

5、FS 标志寄存器在ring0中指向KPCR,在ring3中的程序,fs:[0] 指向TEB6、GS 全局段寄存器⽤于管理线程特定的内存7、LDTR 段选择⼦记录局部描述符表的起始位置,LDTR的内容是⼀个段选择⼦。

由于LDT本⾝同样是⼀段内存,也是⼀个段,所以它也有个描述符描述它,这个描述符就存储在GDT中,对应这个表述符也会有⼀个选择⼦,LDTR装载的就是这个⼀个选择⼦。

LDTR可以在程序中随时改变,通过使⽤lldt指令。

8、TR 任务寄存器⽤于寻址⼀个特殊的任务状态段(TSS),TSS包含当前执⾏任务的重要信息。

TR寄存器⽤于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。

它引⽤GDT表中的⼀个TSS类型的描述符。

IA32上Linux内核中断机制分析

IA32上Linux内核中断机制分析
426movl%esp,%eax;\
427callsmp_/**/name;\
428jmpret_from_intr;
其中,SAVE_ALL宏就是用来保存寄存器的。
内核书籍中经常提到的中断上下文,指的是内核正在运行中断服务程序或softirq,无法代表当前进程的情形。中断上下文没有自己专有的堆栈,相反,它借用被中断进程的内核堆栈──IA-32上的Linux默认这个堆栈只有8k大小,而且很可能在处理中断的过程中又被另一个中断源中断。因此如果你自己编写中断处理程序,递归层次太深或者函数局部变量太大,都有可能导致栈溢出。(i386有一个4KStacks补丁,如果编译时打开该选项,则中断上下文使用独立的栈,而不占用被中断进程的。)
2)陷阱(Trap)。陷阱处理返回时,不重新执行引发陷阱的那条指令。
3)中止(Abort)。中止是严重的异常,将导致任务的中止而不会返回。
还有一种是程序产生的异常,如INT3指令、BOUND指令等。CPU把这种异常当作是陷阱来处理。
5,中断描述表IDT
异常与中断发生时,都需要到IDT中查找相关信息,以找到对应的处理程序以及其他动作。需要注意的是,保护模式下发生权限提升时,中断穿越的是中断门,而异常穿越的是陷阱门。二者的区别是:当CPU穿越中断门时,是自动关中断的;而穿越异常门则不会。
return1;
}
spin_lock(&desc->lock);
desc->handler->ack(irq);/*给i8259A或APIC应答信号*/
/*
*REPLAYiswhenLinuxresendsanIRQthatwasdroppedearlier
*WAITINGisusedbyprobetomarkirqsthatarebeingtested

CPU工作模式:执行程序的三种模式

CPU工作模式:执行程序的三种模式

CPU⼯作模式:执⾏程序的三种模式1)CPU 的⼯作模式有哪三种?实模式、保护模式、长模式2)如果下⾯这段应⽤程序代码能够成功运⾏,会有什么后果?int main(){int* addr = (int*)0;cli(); //关中断,什么信号来都不能终⽌CPUwhile(1){*addr = 0;addr++;}return 0;}在实模式下,这段代码确实能运⾏。

3)什么是实模式?实模式⼜称实地址模式,实,即真实,这个真实分为两个⽅⾯⼀是运⾏真实的指令,对指令的动作不作区分,指令让⼲什么就⽼⽼实实⼲什么。

另⼀⽅⾯是发往内存的地址是真实的,对任何地址不加限制地发往内存。

4)实模式下的寄存器有哪些?5)实模式下访问内存需要获取地址值,这个值是如何计算的呢?6)分段内存管理模型是什么样的?所有的内存地址都是由段寄存器左移 4 位,再加上⼀个通⽤寄存器中的值或者常数形成地址,然后由这个地址去访问内存7)代码段由哪两个寄存器确定?CS 和 IP8)栈段由哪两个寄存器确定?SS 和 SP9)分析下⾯代码?data SEGMENT ;定义⼀个数据段存放Hello World!hello DB 'Hello World!$' ;注意要以$结束data ENDScode SEGMENT ;定义⼀个代码段存放程序指令ASSUME CS:CODE,DS:DATA ;告诉汇编程序,DS指向数据段,CS指向代码段start:MOV AX,data ;将data段⾸地址赋值给AXMOV DS,AX ;将AX赋值给DS,使DS指向data段LEA DX,hello ;使DX指向hello⾸地址MOV AH,09h ;给AH设置参数09H,AH是AX⾼8位,AL是AX低8位,其它类似INT 21h ;执⾏DOS中断输出DS指向的DX指向的字符串helloMOV AX,4C00h ;给AX设置参数4C00hINT 21h ;调⽤4C00h号功能,结束程序code ENDSEND startLEA 是取地址指令,MOV 是数据传输指令10)什么是中断?停下当前⼿头上⼲的事,转⽽跳转到另⼀个特定的地址上,去运⾏特定的代码。

总结进入RING0的方法-电脑资料

总结进入RING0的方法-电脑资料

总结进入RING0的方法-电脑资料by wowocock1/CVC.GB关于进入RING0层的方法,大家一定听说过不少,我在复习保护模式编程中将一些进RING0的方法;总结了一下,包括调用门,任务门,中断门,陷阱门等,这些方法都是直接利用IA32的方法,所以和操作系统应该没有多大关系,当然由于NT 内核对GDT,IDT,的保护所以我们不能用这些方法,不过如果一旦突破了NT的保护,那么所有的方法就都可以使用了,其他的还有SEH等方法,我在前面的文章中也有介绍,。

-----------------Code---;====================================== ==; WOWOCOCK 编写;;====================================== ==.586p.model flat, stdcalloption casemap :none ; case sensitiveinclude \masm32\include\windows.incinclude \masm32\include\kernel32.incinclude \masm32\include\user32.incincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\user32.lib;;--------------TSS STRUCTRLink dw 0 ;链接字段dw 0 ;不使用,置为0TRESP0 dd 0 ;0级堆栈指针TRSS0 dw 0 ;0级堆栈段寄存器dw 0 ;不使用,置为0TRESP1 dd 0 ;1级堆栈指针TRSS1 dw 0 ;1级堆栈段寄存器dw 0 ;不使用,置为0TRESP2 dd 0 ;2级堆栈指针TRSS2 dw 0 ;2级堆栈段寄存器dw 0 ;不使用,置为0TRCR3 dd 0 ;CR3TREIP dd 0 ;EIPTREFlag dd 0 ;EFLAGS TREAX dd 0 ;eaxTRECX dd 0 ;ecxTREDX dd 0 ;edxTREBX dd 0 ;ebxTRESP dd 0 ;espTREBP dd 0 ;ebpTRESI dd 0 ;esiTREDI dd 0 ;ediTRES dw 0 ;ESdw 0 ;不使用,置为0TRCS dw 0 ;CSdw 0 ;不使用,置为0TRSS dw 0 ;ssdw 0 ;不使用,置为0TRDS dw 0 ;DSdw 0 ;不使用,置为0TRFS dw 0 ;FSdw 0 ;不使用,置为0TRGS dw 0 ;GSdw 0 ;不使用,置为0TRLDTR dw 0 ;LDTRdw 0 ;不使用,置为0TRTrip dw 0 ;调试陷阱标志(只用位0)TRIOMap dw $+2 ;指向I/O许可位图区的段内偏移TSS ENDS.datasztit db "Gate Test",0CTEXTCall db "call gate to Ring0!继续?",0CTEXTInt db "int gate to Ring0 By int 5 !继续?",0CTEXTIntx db "int gate to Ring0 By int X !继续?",0CTEXTTrap db "Trap gate to Ring0 By int 1!继续?",0CTEXTFault db "Fault gate to Ring0!继续?",0CTEXTTask db "Task gate to Ring0!继续?",0temp1 db "Cr3的内容是:%8X",0temp2 db 100 dup(?)Freq db 08h ;发声频率gdtR df 0idtR df 0ldtR dw 0trR dw 0 ;the contents of GDTR,IDTR,LDTR,TRldtDes dw 0dw 0 ;LDT Limitdd 0 ;LDT BaseCallgt dq 0 ;call gate's selffTrDes dw 0dw 0 ;TR Limitdd 0 ;TR BaseTss1Sel dw ? ;TSSCall32 dd 0Tss1Gate dw ? ;任务门TSS1 TSS <>Tss1Limit equ $-TSS1TSS2 TSS <>TestCR3 dd 4MyCall MACRO Selector,Offsetvdb 09ahdd Offsetvdw SelectorENDM;;-----------------------------------------.code__Start:sgdt fword ptr gdtRsidt fword ptr idtRsldt word ptr ldtRstr word ptr trR ;save them for later use;-----------------------; get the ldt mes;-----------------------movzx esi,ldtRadd esi,dword ptr [gdtR+2] ;esi->ldt descriptor mov ax,word ptr [esi]mov word ptr [ldtDes],axmov ax,word ptr [esi+6]and ax,0fhmov word ptr [ldtDes+2],ax ;get ldt Limit mov eax,[esi+2]and eax,0ffffffhmov ebx,[esi+4]and ebx,0ff000000hor eax,ebxmov dword ptr [ldtDes+4],eax ;get ldt Base;-----------------------; get the tr mes;-----------------------movzx esi,trRadd esi,dword ptr [gdtR+2]mov ax,word ptr [esi]mov word ptr [TrDes],axmov ax,word ptr [esi+6]and ax,0fhmov word ptr [TrDes+2],ax ;get tr Limit mov eax,[esi+2]and eax,0ffffffhmov ebx,[esi+4]and ebx,0ff000000hor eax,ebxmov dword ptr [TrDes+4],eax;get tr Base;-------------------------------------; 这里演示在GDT中寻找空白表项来制造调用门;-------------------------------------mov esi,dword ptr [gdtR+2] ;esi->gdt basemovzx eax,word ptr [gdtR] ;eax=gdt limitcall Search_XDT;esi==gdt Basemov esi,dword ptr [gdtR+2]push offset myring0_prc_callgt ;set callgate in gdtpop word ptr [esi+eax+6] ;offsetmov word ptr [esi+eax+2],28hmov word ptr [esi+eax+4],0EC00h;sel=28h,dpl=3,and attribute ->386 call gate!and dword ptr Callgt,0or al,3hmov word ptr [Callgt+4],axcall fword ptr [Callgt] ;use callgate to Ring0!;--------------------------------------------; 这里演示在Ldt中制造调用门;--------------------------------------------invoke MessageBoxA,0, addr CTEXTCall,addr sztit,MB_YESNOcmp eax,IDNOjz @xit000 ;继续演示?mov esi,dword ptr [ldtDes+4] ;esi->ldt basemov eax,dword ptr [ldtDes] ;eax=ldt limitcall Search_XDT ;eax返回找到的空白选择子mov esi,dword ptr [ldtDes+4]push offset myring0_prc_callgt ;set callgate in ldtpop word ptr [esi+eax+0]pop word ptr [esi+eax+6] ;offsetmov word ptr [esi+eax+2],28hmov word ptr [esi+eax+4],0EC00h;sel=28h,dpl=3,and attribute ->386 call gate!and dword ptr Callgt,0or al,7h ;所以选择子一定要指向LDTcall fword ptr [Callgt] ;use callgate to Ring0!; *通过中断门进入ring0,像在Dos下一样,我们只要替换中断向量表的地址以指向我们; *自己的程序就可以了,不过在win下中断向量表变为IDT(中断描述符表),其第0~1保存; *中断处理程序偏移的低16位,6~7字节保存偏移的高16位,我们必须使用描述符具有DPL=3; *的中断门以便在ring3下转入中断程序,而int 03h,04h,05h,10h,13h,30h等本来就是; *DPL=3,我们可以方便地利用之,注意中断处理程序返回用iretd ;---------------------------; 下面利用int 5进入ring0;---------------------------invoke MessageBoxA,0,addr CTEXTInt,addr sztit,MB_YESNOcmp eax,IDNOjz @xit000 ;继续演示?mov esi,dword ptr [idtR+2] ;esi->idt basepush dword ptr [esi+8*5+0]push dword ptr [esi+8*5+4] ;保存INT 5,中断描述符push offset myring0_prc_Intgt ;替换原来INT5的入口地址pop word ptr [esi+8*5]pop word ptr [esi+8*5+6]int 5 ;进入ring0!;int 3 ;//可选择利用int 3;db 0CCh ;//则保存和恢复就改为8*3;为了增强反跟踪效果;当然也可以利用int 1,方法一致不过可能在某些处理器上冲突pop dword ptr [esi+8*5+4] ;恢复,int 5,中断描述符pop dword ptr [esi+8*5+0]; *当然,上面使用的全部是DPL=3的int如1,3,5等,如果我们准备使用任意int 来达到; *目的该怎么办?这就需要自己改int descriptor 的属性值,使DPL=3,sel=28h; *如下面使用int 255; *__________________________________________invoke MessageBoxA,0,addr CTEXTIntx,addr sztit,MB_YESNOcmp eax,IDNOjz @xit000 ;继续演示?movzx ebx,word ptr [idtR] ;ebx=idt limitsub ebx,7push dword ptr [esi+ebx+0] ; save IDT entrypush dword ptr [esi+ebx+4]push offset myring0_prc_Intgtpop word ptr [esi+ebx+0]mov word ptr [esi+ebx+2],28h ;ring0 Selmov word ptr [esi+ebx+4],0EE00h ;P=1,386中断门,DPL=3 pop word ptr [esi+ebx+6];mov eax,ebx;shl eax,5;add eax,90C300CDh;push eax;call ss:esp ; 在堆栈中形成指令 int 5Fh ret直接转入执行!int 5fh;pop eax ; int调用,酷吧!pop dword ptr [esi+ebx+4]; 恢复pop dword ptr [esi+ebx+0]; *; *还有其他的方法进入ring0,如陷阱门,与中断门基本一致,只不过是让硬件自己产生中断; *我们则自己置TF=1引发之,注意在中断处理中关闭TF,否则会造成死循环,不断单步,还有故,; *障门产生故障之后注意cs:eip已经压入堆栈,如果不改指令的话,就得自己修改eip指向安全; *地址故障门的好处在于不必自己置sel为28h,也不必担心DPL=0,操作系统为我们准备好了一; *切我们只要替换int处理地址就行了,以下是简单例子; *__________________________________________invoke MessageBoxA,0,addr CTEXTTrap,addr sztit,MB_YESNOcmp eax,IDNOjz @xit001 ;继续演示?;---------------------------------; int1 单步陷阱或者int4 除法溢出陷阱; 这里演示int 1,int 4类似; 这个和上面的有不同吗,有!就是int 1; 是由CPU而不是我们显式用int 1指令引发;---------------------------------push dword ptr [esi+(8*1)+0] ; 保存原int 1push dword ptr [esi+(8*1)+4]push offset myring0_prc_Trapgtpop word ptr [esi+(8*1)+0]pop word ptr [esi+(8*1)+6]pushfdpop eaxor ah,1push eaxpopfd ; set TF=1nop ; ring0!pop dword ptr [esi+(8*1)+4]; restore IDT entrypop dword ptr [esi+(8*1)+0];--------------------------------------------; 这里演示故障门,除法错误;--------------------------------------------@xit001:invoke MessageBoxA,0,addr CTEXTFault,addr sztit,MB_YESNOcmp eax,IDNOjz @xit000 ;继续演示?push dword ptr [esi+(8*0)+0] ;push dword ptr [esi+(8*0)+4]push offset Ring0Code_divpop word ptr [esi+(8*0)+0]pop word ptr [esi+(8*0)+6]xor eax,eaxdiv eax ; 除法错误,进入故障门ring0!;-----------------------------------------invoke MessageBoxA,0,addr CTEXTTask,addr sztit,MB_YESNOcmp eax,IDNOjz @xit000;-------------------------------------; 这里演示在GDT中寻找空白表项来制造TSS;-------------------------------------mov esi,dword ptr [gdtR+2]movzx eax,word ptr [gdtR]call Search_XDTand ax,0fff8hmov Tss1Sel,ax ;save Tss1 selector ,esi==gdt Basemov esi,dword ptr [gdtR+2]mov ebx,offset TSS1mov word ptr [esi+eax+0],Tss1Limitmov dword ptr [esi+eax+2],ebx ;offsetmov word ptr [esi+eax+5],89hshr ebx,24mov byte ptr [esi+eax+7],bl ;set mytss;--------------------------------------------; 这里演示在Ldt中制造任务门;--------------------------------------------mov esi,dword ptr [ldtDes+4]mov eax,dword ptr [ldtDes]call Search_XDT ;eax返回找到的空白选择子push eaxor ax,7hmov Tss1Gate,axpop eaxmov esi,dword ptr [ldtDes+4]mov word ptr [esi+eax+0],0mov word ptr [esi+eax+6],0 ;offsetpush word ptr Tss1Selpop word ptr [esi+eax+2]mov word ptr [esi+eax+4],0E500h ;Tss Gatemov esi,dword ptr [TrDes+4]assume esi:ptr TSSpush word ptr ldtRpop word ptr[esi].TRLDTR ;设置LDT SELECTOR(WINDOWS98的TSS中LDT 为0)lea edi,TSS1assume edi:ptr TSSpush word ptr trRpop word ptr [edi].TRLink ;返回TSS选择子,设置联接字push dword ptr[esi].TRESP0 ;设置SP0pop dword ptr[edi].TRESP0push word ptr[esi].TRSS0 ;设置SS0pop word ptr[edi].TRSS0push dword ptr[esi].TRCR3;设置CR3寄存器,即设置好转换以后所有的段及页转换相关寄存器pop dword ptr[edi].TRCR3push offset Ring0pop dword ptr[edi].TREIPmov word ptr[edi].TRCS,28h ;CS=28mov word ptr[edi].TRSS,30h ;ss=30push word ptr ldtR ;设置LDTRpop word ptr[edi].TRLDTRpush dspop dword ptr[edi].TRDSmov word ptr[edi+54h+2],0call fword ptr Call32mov ebx,dword ptr [TestCR3]@xit000:invoke wsprintf,addr temp2,addr temp1,TestCR3invoke MessageBoxA,0,addr temp2,addr sztit,0mov eax,dword ptr [ldtDes+4];恢复GDT,LDT中的空选择子,电脑资料《总结进入RING0的方法》(https://www.)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用汇编写个最小的WDM驱动程序进RING0
在WINDOWS 2000/XP/2003里进入RING0是很多人的梦想,但实现这个梦想并不容易,因为基于NT内核的WINDOWS 2000/XP/2003对自己保护得非常好,这与WINDOWS 9X 有很大不同,WINDOWS 9X的GDT,IDT,LDT等重要的系统表格是可以被RING3的代码
轻易修改的,因此在WINDOWS 9X里任何程序都可以在GDT,IDT,LDT里构造自己的调用门/中断门/陷阱门而进入RING0。

在WINDOWS 2000/XP/2003里似乎只有写驱动
才能进入RING0了,当然还可以利用系统漏洞进入RING0,本人就发现了2个漏洞可
进入RING0,但本文只讨论写驱动的方式。

现在介绍用汇编语言写普通WINDOWS应用程序的书也不少,用汇编语言写WINDOWS 程序的程序员也越来越多,但遗憾的是这些书介绍的程序都是运行在RING3上的,
我等技术追求者怎能受制于RING3而无所作为?为了写出令人惊叹的程序(比如病毒,反病毒,防火墙等等),就必须要进入RING0。

但是有关用汇编语言写WDM驱动程序
的书和例子非常少,我找到的绝大多数都是用C写的,而且编译也很麻烦,对于汇编
语言这种最适合写系统程序的语言来说是很遗憾的。

为此我特意用我所知道的知识
写出本文,意在抛砖引玉,共同进步。

好了,先来看看下面的例子:
.586p
.model flat,stdcall
option casemap:none
.code
start:
nop
nop
nop
nop
pushfd
pushad
push edx
sgdt [esp-2]
pop edx
mov eax,edx
mov ecx,3e0h
.if dword ptr [edx+ecx+2]!=0ec0003e8h
mov byte ptr [edx],0c3h
mov word ptr [edx+ecx],ax
shr eax,16
mov word ptr [edx+ecx+6],ax
mov dword ptr [edx+ecx+2],0ec0003e8h
mov dword ptr [edx+ecx+8],0000ffffh
mov dword ptr [edx+ecx+12],00cf9a00h
.endif
popad
popfd
xor eax,eax
ret 8
end start
把以上的汇编代码保存到文件mywdm.asm,然后用MASM 6.14按照下面的方法编译:
ml /c /coff /Cp mywdm.asm
link /subsystem:windows /driver:wdm /release /out:mywdm.sys mywdm.obj
就会在当前目录下生成一个mywdm.sys文件,这是一个没有导入导出和资源的纯代码
驱动程序,非常短小精悍。

如果导入了ntoskrnl.exe和hal.dll里的函数,或者导出
给别人调用的函数,它将是一个功能全面的WDM驱动。

mywdm.sys的功能是在GDT中创建一个3级调用门和一个0级32位代码段描述符,3级调用
门的选择子是3E3,0级32位代码段的选择子是3E8。

好了,现在执行mywdm.sys,但驱动程序是不能直接执行的,所以要构造它的执行环境。

先在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services中建立一个mywdm
子键,然后建立3个DWORD型的键值:
ErrorControl=0
Start=3 (如果Start=1,mywdm.sys会随电脑启动而自动装入)
Type=1
再把mywdm.sys复制到system32\drivers目录里,然后重新启动(好象不重新启动也可以,对这个我不太清楚),运行net start mywdm,结果屏幕上显示:
“发生系统错误1058。

无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。


如果你轻信微软的这句话的话,你就到此为止了!别被微软欺骗,因为我们的代码已经
执行过了,3级调用门和0级32位代码段描述符已经被建立在GDT中,而错误提示是在我们
的代码执行后弹出来的,此时不管是成功提示还是错误提示对我们来说都已太晚了。

不信,你可以用SOFT ICE看一看GDT就知道我所言不虚!如果Start=1,系统不会提示错误而运行
mywdm.sys。

好了,既然GDT中已经有了我们的调用门,那么意味着我们写的应用程序可以自由地在RING3和RING0之间切换,但如何使用这个调用门还是有讲究的,它的使用方法是:
...
call 3e3:00000000 ;机器码9A 00 00 00 00 E3 03
;此时已经进入RING0,CS=3E8,跟着要切换堆栈
mov eax,esp
mov esp,[esp+4]
push eax
;这里加入你要在RING0里执行的代码
;准备返回RING3
pop esp
push offset ring3
retf
ring3:
;此时回到RING3
...
为什么要切换堆栈?为什么要建立我们自己的0级32位代码段?直接使用操作系统的0级32位
代码段(选择子=8)不可以吗?在这里我要说明一下:WINDOWS 2000/XP/2003对自己保护得
非常好,就算普通应用程序能进入RING0,但还是在用户区(代码和数据的地址都小于80000000H),
所以WINDOWS 2000/XP/2003会认为是非法进入RING0的,就有可能产生页故障,表现是调用子程序
或访问内存时就会触发页故障,解决的方法是切换堆栈;不用操作系统的0级32位代码段(选择子
为8),用我们建立的0级32位代码段(选择子=3E8)。

本文例子生成的mywdm.sys大小是1536字节,如果你对PE文件很了解,可以手工给mywdm.sys减肥,
但要注意的是减肥后要把正确的CHECKSUM值填入PE头的CHECKSUM字段中,否则操作系统是不会装入
mywdm.sys执行的。

我就把mywdm.sys减肥到只有368字节(只有DOS头,PE头+节表,60H字节的重定
位表和代码,应该是世界上最小的驱动程序了)。

完全可以把这个只有368字节的驱动程序包含在
自己的程序中,在需要是把它还原到SYSTEM32\DRIVERS目录里。

计算CHECKSUM的方法是:把PE文件的所有字用ADC相加,然后得到的结果再和文件大小ADC相加,
这个结果就是CHECKSUM值。

网上也可以找到计算CHECKSUM的工具。

RING3测试程序如下:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
szExceptionCaused db Exception Caused - could not switch to ring 0,0
szError db Error,0
MsgCaption db Test,0
MsgBoxText db cr0=%8x,0
tmp db 50 dup(90)
Callgt dd 0
dw 3e3h
.code
ExceptCallBack PROC
invoke MessageBoxA, 0, addr szExceptionCaused,addr szError, 0
invoke ExitProcess, -1
ret
ExceptCallBack ENDP
start:
push offset ExceptCallBack
call SetUnhandledExceptionFilter
call fword ptr [Callgt] ;use callgate to Ring0!
Ring0:
mov eax,esp ;save ring0 esp
mov esp,[esp+4];->ring3 esp
push eax
mov eax,cr0
pop esp ;restore ring0 esp
push offset Ring3
retf
Ring3:
invoke wsprintfA,addr tmp,addr MsgBoxText,eax
invoke MessageBox, NULL,addr tmp, addr MsgCaption, MB_OK
Exit:
invoke ExitProcess,NULL
end start
嘿嘿,大家以后就可以方便的写2K/XP/2003下的RING0病毒了。

相关文档
最新文档