Windows内核基础知识-1-段寄存器
阅读原文时间:2021年08月25日阅读:1

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
#include
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;
} ![](C:\Users\onexia\AppData\Roaming\Typora\typora-user-images\image-20210824154621770.png)

很简单的代码,就给代码段赋值,但是通过其他寄存器来中间调用了一下。

可以看到执行到这里的时候就出了问题,

但是如果我们换了别的段寄存器就是可以正常运行:

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

说明并不是通过段寄存器的名字来管理内存的读写执行权限的。

而是通过段寄存器的选择子/选择符来决定。也就是通过od可以直接看到的16位内容。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器