欢迎来到天天文库
浏览记录
ID:53783831
大小:41.00 KB
页数:3页
时间:2020-04-06
《用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
此文档下载收益归作者所有