Windows核心基礎知識-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位內容。