![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
保护模式
伴你永居我忆i
这个作者很懒,什么都没留下…
展开
-
滴水中级班保护模式阶段测试作业
// 保护模式阶段测试第一题.cpp : Defines the entry point for the console application.//1给定一个线性地址,长度,读取内容2-9-9-12#include "stdafx.h"#include <Windows.h>typedef struct PAGE{ DWORD PTELinkAddress; DWORD PDELinkAddress; DWORD PTELow; DWORD P...原创 2020-11-08 18:15:21 · 1240 阅读 · 0 评论 -
什么是可读,可写,可执行。 线性地址和TLB的关系
C/C++的编程过程中应该都遇到过 0xC0000005,访问权限异常,当访问没有权限访问的页时候就会出现这个问题经过这一段时间的学习,我发现我对可读可写可执行有了不一样的理解,从汇编层面mov ds:[0x12345678],eax 是把eax的值存放到 0x12345678线性地址对应的物理地址 这个线性地址对应的物理页既是可写mov eax,ds:[0x22222222] 这个线性地址0x22222222对应的物理页既是可读想要理解什么是可读可写可执行首先需要理解页机制...原创 2020-11-07 22:27:42 · 2270 阅读 · 2 评论 -
页机制和2-9-9-12分页线性地址页表之间的映射关系
学完本章,各位就能够真正的理解虚拟内存和物理内存之前的关系了 前面我们讲过每个进程都有自己4GB的虚拟内存,其中第2GB各不相同,而高2GB所有进程都是同用的,虚拟内存机制可以实现,不同进程空间的隔离,A进程只能访问A进程的空间,B进程只能访问B进程的空间,从而是A进程挂了不会响应B进程,如果高2GB挂了那就所有进程都挂了直接蓝,不同进程之间的隔离是因为进程的低2GB映射的物理页都不同,访问A的0x10000000地址和B进程0x10000000实际访问的是不同的物理页,这就出现了一个问题,...原创 2020-11-02 14:36:50 · 983 阅读 · 0 评论 -
通过代码挂上物理页
给0地址挂上物理页,吧VirtualAlloc函数开辟的线性地址物理页给0地址挂上,这样这两个线性地址访问的就是同一个物理页,内存映射的本质就是相同或者不同进程的两个线性地址,使用同一个物理页这个是2-9-9-12分页的,如果10-10-12分页会更简单,代码可以在此基础上改这里我将只提几个需要注意到的问题1.memset填充是为了 VirutalAlloc开辟内存后,线性地址并不会马上挂上物理页,PTE没有指向物理页需要注意2.那个裸函数注释掉的代码需要注意,虽然说要把那个线性地址P.原创 2020-10-28 23:49:05 · 715 阅读 · 0 评论 -
任务段进行任务切换,Jmp Call指令实现任务切换
任务段描述符的格式我们就不说了太基本了,它的Base指向TSS结构的地址,Limit设置为0x68就够了TSS结构的大小就是104个字节,我们之前讲过,通过中断门,调用们提权的时候 ring0的堆栈ESP和SS都是TSS提供的,TSS结构每个核只有一个和KPCR结构一样,每当线程切换的时候会把当前线程的ESP0写入TSS结构中(以后进行线程切换逆向的时候会找到具体的代码),所以我们所Ring3提权到Ring0得到ESP都是当前线程的Ring的栈顶。 TSS是CPU设计的实现多...原创 2020-10-18 19:28:21 · 1481 阅读 · 3 评论 -
什么是内核态,什么是用户态,谁定义的?从段页层面解析用户态和内核态
应该学习过一段时间的人,都能唱出来,低2GB是用户空间,高2GB是内核空间,我们如果在用户空间访问内核空间数据,直接给你一个0xC0000005异常,告诉你你没有权限访问, 今天就给大家完全的解析什么是内核空间,什么是用户空间CPU有4个运行级别,如下图,我们所说的内核就是Ring0当CPU运行ring0态的时候就是内核态(也就是CPL=0),此时拥有最 高的权限而在用户态的时候就是CPL=3此时CPU处于用户态 再次提出几个问题解决...原创 2020-10-11 15:53:47 · 1372 阅读 · 0 评论 -
一致代码段,非一致代码段的本意和详细测试
不知道有没有人尝试过mov cs,ax这样的指令结果肯定挂,因为不能直接修改cs段寄存器的值,不能直接修改,那肯定可以间接咯,cs段寄存器和其他的段寄存器不太一样,它能加载的段描述符有:代码段描述符,调用门,TSS任务段,任务门,如果加载数据段描述符直接挂,(用数据段加载代码段描述符的时候,直接过,访问内存的时候才挂),而用cs加载数据段描述符直接挂。 这篇帖子只讲代码段描述符(调用门,任务门这些系统段描述符会后面会讲)代码段描述符S=1时TYPE>=8 此时这个段描述符...原创 2020-10-11 12:51:55 · 669 阅读 · 0 评论 -
段权限检查,段保护机制
这节会从多个方面测试段会进行哪些权限检查,首先CPU可以在4个级别上运行ring 0,ring 1,ring 2,ring 3,运行的级别越低权限越高,我们常常挂在嘴边的内核,就是当CPU运行在Ring 0级别上运行的时候,CPU当前运行级别就是在执行当前指令的时候CS段寄存器或者或者SS段寄存器,可见16位的低2位值就是当前CPU处理哪个级别,也称为了CPL。CS寄存器存储的选择子任何时候和SS段寄存器存储的选择子低2为任何时候都是一样的,因为CPU运行在不同的级别,会使用不同的堆栈,...原创 2020-10-08 21:02:48 · 659 阅读 · 0 评论 -
段描述符详解
上一节讲啦段寄存器具有属性特征,本节会讲到段描述符和段选择子的上节讲了段寄存器有96位,其中只有16位是可见的(剩下的80位缓冲到CPU里面去了),这可见的16位就是段选择子其中这16位分为3部分0~1位:为RPL 称为请求特权级别,2个位就有4种权限 0 ,1,2,3 数字越大,权限越小反之第2位:TL 当TL=0的时候去GDT(全局描述符表中去加载段描述符) TL=1去LDT(局部描述符表,这个Windows没有使用)3~15: Index 索引这个值会作为下标去...原创 2020-10-07 23:08:41 · 7738 阅读 · 2 评论 -
保护模式验证段寄存器的属性
保护模式第一篇段寄存器,学习过8086汇编的同学应该知道段寄存器在8086种的重要程度,8086CPU的寄存器都是16位,8086CPU能够以16位的地址总线访问到1MB的内存地址,采用的就是段地址*16+偏移地址=物理地址的方式,以16位地址总线访问1MB的物理内存,8086时代访问的地址都是物理地址没有虚拟地址的概念,进程访问的都是物理地址,如果不小心改了系统数据这是非常的危险的,本人在保护模式下编写驱动都没少蓝过,实在不敢想象如果应用程序能直接访问操作系统,得让操作系统崩溃多少次,实...原创 2020-10-06 01:52:46 · 381 阅读 · 0 评论