用VisualCCPU特权指令操作.doc

用VisualCCPU特权指令操作.doc

ID:53783831

大小:41.00 KB

页数:3页

时间:2020-04-06

用VisualCCPU特权指令操作.doc_第1页
用VisualCCPU特权指令操作.doc_第2页
用VisualCCPU特权指令操作.doc_第3页
资源描述:

《用VisualCCPU特权指令操作.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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

2、令实现任务内不同特权级的变换。调用门描述符转移的入口点包含目标地址的段及偏移量的48位全指针。在执行通过任务门的段间转移指令jmp或段间调用指令call时,指令所含指针内的选择子用于确定调用门,而偏移被丢弃;把调用门内的48位全指针作为目标地址指针进行转移。   二、基本思路   取得全局描述符表,搜索该表找到一个暂时为空的描述符,安装调用门,进行远程调用即可实现特权指令操作。   三、所用到的数据结构   ①全局描述符gdt的格式: structgdt_descriptor{  wordlimitl;//段界限低16位

3、  wordbasel;//基地址低16位  bytebasem;//基地址中间8位  byteattrib;//段属性  bytelimith;//段界限的高4位(包括段属性的高4位)  bytebaseh;//基地址的高8位 }   ②门描述符的一般格式:   当type的低4位值为0xc时,这是一个386调用门(callgate)。在vc中定义"门"如下:structgate{//门结构类型定义wordoffsetl;//32位偏移的低16位 wordselector;//选择子 bytedcount;//双字计数字段 b

4、ytegtype;//当低4位值为0xc是,这是一个调用门 wordlimith;//32位偏移的高16位 }   ③全局描述符表寄存器gdtr   gdtr长48位,其中高32位为基地址,低16位为界限,gdtr中的段界限以字节为单位。在vc中定义如下:structgdtr{  wordwgdtlimit;  dworddwgdtbase; };   四、具体实现   使用mfcappwizard新建一个基于对话框的应用程序,工程名为myring0。在对话框中添加一个按钮,修改id为id_getcr0,修改caption为

5、取cr0的值,同时添加该按钮的消息处理函数voidcmyring0dlg::ongetcr0()。新建一个头文件ring0.h并添加到工程中,添加下面的代码到ring0.h中。#pragmapack(1) structgdt_descriptor{  wordlimitl;//段界限低16位  wordbasel;//基地址低16位  bytebasem;//基地址中间8位  byteattrib;//段属性  bytelimith;//段界限的高4位(包括段属性的高4位)  bytebaseh;//基地址的高8位 }; str

6、uctgate_descriptor{  wordoffsetl;//32位偏移的低16位  wordselector;//选择子  bytedcount;//双字计数字段  bytegtype;//当低4位值为0xc是,这是一个调用门  wordlimith;//32位偏移的高16位 }; structgdtr{  wordwgdtlimit;  dworddwgdtbase; }; #pragmapack()   在myring0dlg.cpp中最后一个include语句后添加#include"ring0.h",在按钮的消

7、息处理函数voidcmyring0dlg::ongetcr0()前面添加下面两个函数:__declspec(naked)voidgetcr0_ring0() {  _asm{  movebx,cr0//特权指令  mov[eax],ebx  retf } } boolcallring0(pvoidpvring0funcaddr,pwordpval) {  structgdt_descriptor*pgdtdescriptor;  structgdtrgdtr;  wordcallgateaddr[3];  wordwgdtin

8、dex=1;  //取得全局描述符表gdt  _asmsgdt[gdtr]  //空选择子有特殊用途,跳过它,从第二个选择子开始搜索  pgdtdescriptor=(structgdt_descriptor*)(gdtr.dwgdtbase+8);  for

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。