Windows內核中的CPU架構-1-段寄存器


Windows內核中的CPU架構-1-段寄存器

學過匯編的應該都知道段寄存器,在Windows里段寄存器有很多,之前可能只接觸了ds數據段,cs 代碼段這種,今天這個博客就介紹Windows一些比較常用的段寄存器。

段:Segment,段寄存器肯定是以s結尾的。通過olldydbg軟件可以看到這六個常用的段寄存器

 

 

 

 

寄存器 描述
ES expand segment擴展段
CS code segment代碼段
SS stack segment棧段
DS data segment數據段
FS 取teb的時候常用
GS 暫時不用管

 

 

段寄存器大小

段寄存器的大小其實是96位,這里能看到的內容只有16位,4個16進制的內容。

比如這里的:

ES 002B 32位 0(FFFFFFFF)

只有002B這16位的內容有值,這16位又被叫做段選擇子/段選擇符。

段寄存器的作用:

 

通過段寄存器來訪問地址

其實說學了x8086匯編語言的都知道,地址是=段寄存器+偏移地址 來處理的

而在這個od里面可以很清楚的看到:

 

 

這個每個段寄存器后面有一個地址,代表着段寄存器的起始地址,es,cs,ss,ds,gs都是從0開始,除了fs。

控制內存讀寫權限

數據段ds有讀寫權限,ss也有讀寫權限,但是cs有讀有執行沒有寫權限。

但是並不是通過段寄存器的名字來控制讀寫權限,比如:

#include<iostream>
#include<Windows.h>
using namespace std;
​
int g_int = 0;
int main()
{
    __asm
    {
        mov dx,cs
        mov ds,dx
        mov eax,1
        mov dword ptr ds:[g_int],eax
    }
    system("pause");
    return 0;
}

 

 

很簡單的代碼,就給代碼段賦值,但是通過其他寄存器來中間調用了一下。

 

 

可以看到執行到這里的時候就出了問題,

但是如果我們換了別的段寄存器就是可以正常運行:

__asm
{
    mov dx,ds
    mov ss,dx
    mov eax,1
    mov dword ptr ss:[g_int],eax
}

 

 

說明並不是通過段寄存器的名字來管理內存的讀寫執行權限的。

而是通過段寄存器的選擇子/選擇符來決定。也就是前面通過od可以直接看到的16位內容:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM