學過匯編的應該都知道段寄存器,在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 }
說明並不是通過段寄存器的名字來管理內存的讀寫執行權限的。