Windows内核基础知识-1-段寄存器
2021-08-24 15:56
417 查看
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;
} ![](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位内容。
相关文章推荐
- Windows内核基础知识-2-段描述符
- Windows内核安全编程基础知识(一)
- windows程序设计的一些基础知识点——内核对象以及它们的句柄
- 黑客基础知识——判断Windows系统的版本 32Bit or 64Bit
- Windows窗体基础知识
- Linux设备驱动程序——Linux设备驱动程序——内存和I/O基础知识学习:(2)内核中相关基础知识学习
- [译]Kinect for Windows SDK开发入门(三):基础知识 下
- [Windows驱动开发](二)基础知识——数据结构
- windows程序设计的一些基础知识点—— 进程及其线程
- web第二章:windows基础知识
- 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性
- Linux内核管理基础知识概述
- [翻译]内核池基础知识(池损坏)
- [译]Kinect for Windows SDK开发入门(二):基础知识 上
- Windows网络编程基础知识
- linux内核的基础知识(配置内核) --基于嵌入式开发
- PHP内核介绍及扩展开发指南—基础知识
- PHP内核介绍及扩展开发指南—基础知识
- [译]Kinect for Windows SDK开发入门(三):基础知识 下
- 深度剖析WinPcap之(三)——内核驱动NPF涉及的基础知识(1)