通过分段机制和分页机制实现禁止数据写入

今天调试程序的时候,对windows对R3的保护机制很感兴趣,为什么rdata段只可读,为什么data可读写,为什么text段不可写入,只可执行,正好今天没事干,这里就做了个测试,首先查看程序断到入口点后,它的物理页的情况

kd> !dd 1db69000
#1db69000 120a5025 80000000 1e642025 00000000
#1db69010 03481025 80000000 1e85e225 80000000
#1db69020 1db96025 80000000 00000000 00000000

物理地址1db69000-1db69020,分别对应虚拟地址400000-404000

 通过上面的值,这里做下总结:

  虚拟地址400000对应的PTE是 80000000~120a5025:禁止执行,不可写入的user页面,bit9为0  PE文件头

  虚拟地址401000对应的PTE是 00000000~1e642025:可以执行,不可写入的user页面,bit9为0   text段

   虚拟地址402000对应的PTE是 80000000~03481025:禁止执行,不可写入的user页面,bit9为0   rdata段

虚拟地址403000对应的PTE是 80000000~1e85e225:禁止执行,不可写入的user页面,bit9为1   data段

虚拟地址404000对应的PTE是 80000000~1db96025:禁止执行,不可写入的user页面,bit9为0   rsrc段

首先看下data段,它与其它段(除了text段)的唯一区别就是bit9为1,那么先测试下data,看看它在分页和分段的共同作用下,结果是怎样的

PAGE.Write	  SEGMENT.W		结果
 00		   00		        NO
 01		   00		        NO
 01		   01		        YES
 00		   01		        YES   可以看到在物理页禁止写入,数据段可以写入的情况下,仍然可以写入

  那么再测试下rdata段,它与data段的唯一区别就是bit9为0,那么这里测试下它,看看结果是怎样的

PAGE.Write	  SEGMENT.W		结果
 00		   00		        NO
 01		   00		        NO
 01		   01		        YES
 00		   01		        NO可以看到在物理页禁止写入,数据段可以写入的情况下,不能写入数据了

  为什么会出现这种结果,毕竟402000和403000对应的PTE就只有Bit9不同,那么是不是windows用PTE的bit9来区分程序中的data段呢,如果Bit9为1,那么在数据段可以写入的情况下,就算物理页不让写入数据,那么数据仍然能被写入物理页呢,那么我们修改下402000对应的PTE的bit9为1,然后物理页禁止写入,数据段允许写入,这里做了两次测试

  测试一:  kd> !ed 1db69010 03481225   修改后,402000可以被写入数据

  测算二:  kd> !ed 1db69010 03481025 修改后,402000不能再被写入数据了

  根据这种情况来看,是不是所有的程序段对应的PTE的bit9为1,就可以写入数据了呢,这里测试下text段

可以看到,不可访问,并且出现了异常,为什么会出现这种情况呢,看下text对应的PTE,除了bit9不同外,它的bit63也不同,bit63是执行禁止位,其他的都为1,禁止执行,说明不是个代码段,而text对应的PTE的bit63为0,说明这是个代码段,那么把text对应的PTE的bit9置1和bit63置1后,可不可以写入了呢,为了省点事,这里修改所有的物理页

kd> !dd 1db69000
#1db69000 120a5225 80000000 1e642225 80000000
#1db69010 03481225 80000000 1e85e225 80000000
#1db69020 1db96225 80000000 00000000 00000000

OD运行,看看结果如何

通过测试,400000-404000的所有地址都可以写入了

总结:windows通过bit9区分data段,对bit63区分text段,如果bit9为1,bit63为1,那么windows这逗逼就只会认为它是data段了

时间: 2024-10-12 17:23:37

通过分段机制和分页机制实现禁止数据写入的相关文章

[转帖]Linux分页机制之分页机制的演变--Linux内存管理(七)

Linux分页机制之分页机制的演变--Linux内存管理(七) 2016年09月01日 20:01:31 JeanCheng 阅读数:4543 https://blog.csdn.net/gatieme/article/details/52402967 ~ 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme https://blog.csdn.net/gatieme/article/details/52402967 日期 内核版

Linux的分段和分页机制

1 基于80x86的Linux分段机制 80386的两种工作模式:80386的工作模式包括实地址模式和虚地址模式(保护模式).Linux主要工作在保护模式下. 在保护模式下,80386虚地址空间可达16K个段,每段大小可变,最大达4GB.逻辑地址到线性地址的转换由80386分段机制管理.段寄存器CS.DS.ES.SS.FS或GS各标识一个段.这些段寄存器作为段选择器,用来选择该段的描述符. 分段逻辑地址到线性地址转换图: Linux对80386的分段机制使用得很有限,因为Linux的设计目标是支

Linux内存寻址之分页机制

http://blog.xiaohansong.com/2015/10/05/Linux内存寻址之分页机制/ 在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性-物理地址的转换过程.段机制把逻辑地址转换为线性地址,分页机制进一步把该线性地址再转换为物理地址. 硬件中的分页 分页机制由CR0中的PG位启用.如PG=1,启用分页机制,并使用本节要描述的机制,把线性地址转换为物

一个操作系统的实现(6)-初识分页机制

这节仍然是从实现的角度来讲述分页机制. 为什么要引入分页机制.我们都知道分段机制是为了提供保护机制,那么为什么还要引入分页机制呢? 为什么引入分页机制 想象一下这样一种情况:假设我们用的计算机物理内存是4GB,但是我们的程序大小是5GB.那么这个时候我们无法将程序全部放到内存中,也就无法运行程序.分页机制引入的原因之一就是为了解决这个问题.分页机制的引入实现了虚拟存储器的机制. 另外,程序执行具有局部性,也就是说一段时间内,只需要程序代码中的一小部分(相对于整个程序)就可以实现程序的执行.那么我

操作系统学习(三)、分页机制

目录 1.分页机制介绍 2.页表结构 3.页表项格式 4.虚拟存储 5.直达底部 分页机制介绍 分页机制是 80x86 内存管理机制的第二部分.它在分段机制的基础上完成虚拟地址到物理地址的转换过程.分段机制把逻辑地址转换成线性地址,而分页机制则把线性地址转换成物理地址.分页机制可用于任何一种分段模型.处理器分页机制会把线性地址空间划分成页面,然后这些线性地址空间页面被映射到物理地址空间的页面上.分页机制的几种页面级保护措施,可和分段机制保护措施和用或替代分段机制的保护措施. 通过设置控制寄存器

实模式与保护模式下的分段分页机制

1. 实模式 在实模式下,CPU不会为任务提供任务的保护机制,代码任意运行.8086处理器是学习实模式的常用例子.它内部大致有以下寄存器: 8个16位的通用寄存器: AX (可以拆分成两个AH/AL的8位寄存器) BX (BH,BL) CX (CH,CL) DX (DH,DL) SI (source index, 源索引寄存器) DI (destination index, 目的索引寄存器) BP (base pointer, 基数指针寄存器) SP (stack pointer, 堆栈指针寄存

分页机制

本文为<x86汇编语言:从实模式到保护模式> 第16章笔记 因为段的长度不定, 在分配内存时, 可能会发生内存中的空闲区域小于要加载的段, 或者空闲区域远远大于要加载的段. 在前一种情况下, 需要另外寻找合适的空闲区域; 在后一种情况下, 分配会成功, 但太过于浪费. 为了解决这个问题, 从80386处理器开始, 引入了分页机制. 分页功能从总体上来说, 是用长度固定的页来代替长度不一定的段, 藉此解决因段长度不同而带来的内存空间管理问题. 尽管操作系统也可以用软件来实施固定长度的内存分配,

操作系统篇-浅析分页机制

|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在我们进行程序开发的时候,一般情况下,是不需要管理内存的,也不需要操心内存够不够用,其实,这就是分页机制给我们带来的好处.它是实现虚拟存储的关键,位于线性地址与物理地址之间,在使用这种内存分页管理方法时,每个执行中的进程(任务)可以使用比实际内存容量大得多的连续地址空间.而且当系统内存实际上被分成很多凌乱的块时,它可以建立一个大而连续的内存空间的映象,好让程序不用操心和管理这些分散的内存块.分页机制增强了分段机制的性能.页地址

32机的内存分页机制

在实模式下寻址的时候,"段寄存器+偏移地址"进过转换计算以后得到的地址是"物理地址",也就是在物理内存中的实际地址,而在保护模式下,"段选择器+偏移地址"转换后的地址被称为"线性地址"而不是"物理地址",那么线性地址就是物理地址吗? 答案可能是,也可能不是,这取决于80386的内存分页机制是否被使用. 为什么有内存分页机制? 我们回顾一下,单任务的DOS系统中,一个应用程序可以使用所有的空闲内存,程序退出以