日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(1)段寄存器属性探测

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (1)段寄存器属性探测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、段寄存器結構


段寄存器由4部分,共96位組成,其中段選擇子(Selector)是可見的,占16位;另外3部分占80位,不可見。下面通過程序論證不可見部分的存在。

詳細說明見代碼注釋,環境是VC6+XP。

二、段寄存器讀寫

我們可以使用MOV指令對段寄存器進行讀寫。
讀操作時,我們可以讀到段寄存器的段選擇子部分的16位。例如 mov ax,es 指令會把es寄存器的段選擇子讀到ax。

寫操作時,會寫入96位,其中源操作數的16位寫入到段寄存器的段選擇子部分,另外80位會根據段選擇子從GDT表(全局描述表)中獲取。因此,

mov ax,cs mov ds,ax

實際上是把cs完整的復制給了ds。

三、測試Attribute

首先測試往SS段寫數據,運行不報錯。

#include <stdafx.h>int var = 0;int main() {// 段寄存器由4部分共96位組成,分別是// Selector(段選擇子):16位,是唯一可見的部分,實際上就是GDT表的下標// Attribute:16位,不可見,控制段的讀寫執行屬性// Base:32位,不可見,值是0(FS除外)// Limit:32位,和Base共同決定段的范圍// 讀段寄存器會讀到16位的段選擇子// 寫段寄存器會寫入16位段選擇子和剩余80位數據,后者是根據段選擇子從GDT表獲取的// 論證段寄存器權限控制的存在// 已知CS沒有寫權限,SS有寫權限__asm{mov ax,ss // 源操作數分別設置為SS和CS,觀察運行結果mov ds,axmov dword ptr ds:[var],eax}return 0; }


接下來測試向CS段寫入數據,我們知道CS段是沒有寫權限的。


運行結果證明了Attribute位的存在。

四、測試Base

int main() { // 論證Base的存在// 已知FS的Base不為0__asm{mov eax,fs:[0] // 編譯通過,運行成功,因為 fs.base + 0 可讀mov eax,ss:[0] // 編譯通過,運行報錯,因為 ss.base + 0 是NULL,不可讀}return 0; }

五、測試limit

已知FS的limit是0xFFF

#include <stdafx.h>int var = 0;int main() { __asm{mov eax,ds:[var] // 編譯通過,運行成功,因為 ds.base + var 可讀mov eax,fs:[0x1000] // 編譯通過,運行報錯,因為 fs.base + fs.limit 超出fs段的范圍}return 0; }

總結

以上是生活随笔為你收集整理的(1)段寄存器属性探测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。