用Visual C 實現CPU特權指令操作

2021-04-02 14:55:14 字數 1321 閱讀 3660

**天極

一、引言

80x86系列cpu具有四級保護機制。在windows 9x作業系統只使用0級和3級,以便於移植到精簡指令集的計算機上,如rs4000等,這些處理器一般只有兩個特權級,即系統級和使用者級。在windows 9x系統環境,應用程式執行在ring3(3級),如果要執行特權指令就必須進入ring0(0級)。在同一任務內,實現特權級從外層到內層變換的普通途徑是使用段間呼叫指令call,通過呼叫門進行轉移;實現特權級從內層向外層變換的普通途徑是使用段間返回指令ret。注意,不能用jmp指令實現任務內不同特權級的變換。呼叫門描述符轉移的入口點包含目標位址的段及偏移量的48位全指標。在執行通過任務門的段間轉移指令jmp或段間呼叫指令call時,指令所含指標內的選擇子用於確定呼叫門,而偏移被丟棄;把呼叫門內的48位全指標作為目標位址指標進行轉移。

二、基本思路

取得全域性描述符表,搜尋該錶找到乙個暫時為空的描述符,安裝呼叫門,進行遠端呼叫即可實現特權指令操作。

三、所用到的資料結構

①全域性描述符gdt的格式:

在vc中定義全域性描述符如下:

struct gdt_descriptor

②門描述符的一般格式:

當type的低4位值為0xc時,這是乙個386呼叫門(callgate)。在vc中定義"門"如下:struct gate

③全域性描述符表暫存器gdtr

struct gdtr;

四、具體實現

#pragma pack(1)

struct gdt_descriptor;

struct gate_descriptor;

struct gdtr;

#pragma pack()

在myring0dlg.cpp中最後乙個include語句後新增#include "ring0.h",在按鈕的訊息處理函式void cmyring0dlg::ongetcr0()前面新增下面兩個函式:

__declspec(naked) void getcr0_ring0()

}bool callring0(pvoid pvring0funcaddr,pword pval)

//下乙個全域性描述符

pgdtdescriptor++;

}//沒有空閒的全域性描述符

return false;}

為按鈕的訊息處理函式void cmyring0dlg::ongetcr0()新增**如下:

void cmyring0dlg::ongetcr0()

;sprintf(str,"cr0=%3d",val);

afxmessagebox(str); }

程式在vc6下編譯通過,作業系統為windows98。

用Visual C 輕鬆實現報表處理

資料庫在企業軟體系統中應用廣泛,而報表的顯示與列印成為此類軟體必備的功能 前言資料庫在企業軟體系統中應用廣泛,而報表的顯示與列印成為此類軟體必備的功能。可惜vc 並沒有整合報表處理工具,但其強大的功能再加上市面上功能完備的報表處理工具使這一工作變得容易,本文介紹了在vc 環境中利用seagate公司...

用Visual C 實現網路封包監視

本文向大家介紹windows sockets的一些關於用c 實現的原始套接字 raw socket 的程式設計,以及在此基礎上實現的網路封包監視技術。同winsock1相比,winsock2最明顯的就是支援了raw socket套接字型別,使用raw socket,可把網絡卡設定成混雜模式,在這種模...

用Visual C 實現排序演算法大全

1.引言 2005年10月25 26日,包括筆者在內的十多位成員組隊參加了武漢原動力的野外拓展 outward bound 在攀岩懸崖之前,教官組織了這樣的乙個遊戲專案 教官將團隊裡的所有成員分開,然後用布條蒙上大家的眼睛,接著給每人乙個3位或4位的數字。他要求成員們蒙著眼睛集合,在不說話也看不到彼...