用VisualCCPU特权指令操作_第1页
用VisualCCPU特权指令操作_第2页
用VisualCCPU特权指令操作_第3页
用VisualCCPU特权指令操作_第4页
用VisualCCPU特权指令操作_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用Visual C+实现CPU特权指令操作一、引言80 x86系列cpu具有四级爱护机制。在windows 9x操作系统只使用0级和3级,以便于移植到精简指令集的计算机上,如rs4000等,这些处理器一般只有两个特权级,即系统级和用户级。在windows 9x系统环境,应用程序运行在ring3(3级),假如要运行特权指令就必须进入ring0(0级)。在同一任务内,实现特权级从外层到内层变换的一般途径是使用段间调用指令call,通过调用门进行转移;实现特权级从内层向外层变换的一般途径是使用段间返回指令ret。注意,不能用jmp指令实现任务内不同特权级的变换。调用门描述符转移的入口点包含目标地址的

2、段及偏移量的48位全指针。在执行通过任务门的段间转移指令jmp或段间调用指令call时,指令所含指针内的选择子用于确定调用门,而偏移被丢弃;把调用门内的48位全指针作为目标地址指针进行转移。二、差不多思路取得全局描述符表,搜索该表找到一个临时为空的描述符,安装调用门,进行远程调用即可实现特权指令操作。三、所用到的数据结构全局描述符gdt的格式:struct gdt_descriptorword limitl;/段界限低16位word basel;/基地址低16位byte basem;/基地址中间8位byte attrib;/段属性byte limith;/段界限的高4位(包括段属性的高4位)b

3、yte baseh;/基地址的高8位门描述符的一般格式:当type的低4位值为0 xc时,这是一个386调用门(callgate)。在vc中定义门如下:struct gate /门结构类型定义word offsetl; / 32位偏移的低16位word selector; /选择子byte dcount; /双字计数字段byte gtype; /当低4位值为0 xc是,这是一个调用门word limith; /32位偏移的高16位全局描述符表寄存器gdtrgdtr长48位,其中高32位为基地址,低16位为界限,gdtr中的段界限以字节为单位。在vc中定义如下:struct gdtrword w

4、gdtlimit;dword dwgdtbase;四、具体实现使用mfc appwizard新建一个基于对话框的应用程序,工程名为myring0。在对话框中添加一个按钮,修改id为id_getcr0,修改caption为取cr0的值,同时添加该按钮的消息处理函数void cmyring0dlg:ongetcr0()。新建一个头文件ring0.h并添加到工程中,添加下面的代码到ring0.h中。#pragma pack(1)struct gdt_descriptorword limitl; /段界限低16位word basel; /基地址低16位byte basem; /基地址中间8位byte

5、attrib; /段属性byte limith; /段界限的高4位(包括段属性的高4位)byte baseh; /基地址的高8位; struct gate_descriptorword offsetl; / 32位偏移的低16位word selector; /选择子byte dcount; /双字计数字段byte gtype; /当低4位值为0 xc是,这是一个调用门word limith; /32位偏移的高16位;struct gdtrword wgdtlimit;dword dwgdtbase;#pragma pack()在myring0dlg.cpp中最后一个include语句后添加#i

6、nclude ring0.h,在按钮的消息处理函数void cmyring0dlg:ongetcr0()前面添加下面两个函数:_declspec(naked) void getcr0_ring0()_asmmov ebx,cr0 /特权指令mov eax,ebxretfbool callring0(pvoid pvring0funcaddr,pword pval) struct gdt_descriptor *pgdtdescriptor;struct gdtr gdtr;word callgateaddr3;word wgdtindex = 1;/取得全局描述符表gdt_asm sgdt g

7、dtr/ 空选择子有专门用途,跃过它,从第二个选择子开始搜索pgdtdescriptor = (struct gdt_descriptor *)(gdtr.dwgdtbase + 8);for (wgdtindex = 1; wgdtindex attrib = 0)struct gate_descriptor *pgate;pgate = (struct gate_descriptor *) pgdtdescriptor;pgate-offsetl = loword(pvring0funcaddr);/选择子0 x28总是指向ring0的代码段pgate-selector = 0 x28;p

8、gate-dcount = 0;pgate-gtype = 0 xec;pgate-offseth = hiword(pvring0funcaddr);/预备远程调用参数callgateaddr0 = 0 x0;callgateaddr1 = 0 x0;callgateaddr2 = (wgdtindex 3) | 3;/进入ring0_asm mov eax,pval_asm call fword ptr callgateaddr/归还刚才使用的全局描述符memset(pgdtdescriptor, 0, 8);return true;/下一个全局描述符pgdtdescriptor+; /没有空闲的全局描述符return false;为按钮的消息处理函数void cmyring0dlg:ongetcr0()添加代码如下:void cmyring0dlg:ongetcr0() / todo: add your control notification handler code here

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论