• 通过分段机制和分页机制实现数据隔离


           今天调试程序的时候,对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段了

        

  • 相关阅读:
    兼容各浏览器,背景透明,内容不透明
    101 个 MySQL 的调节和优化的提示
    二手房买卖砍价最新攻略 帮你花少钱买好房
    “中国互联网100强”(2013)发布
    写入文件,创建xunlei批量任务
    武汉选房
    Java并发编程(十一)线程池的使用
    Retrofit 代理模式
    Java并发编程(十)阻塞队列
    不要在Android的Application对象中缓存数据!
  • 原文地址:https://www.cnblogs.com/testvt/p/5549100.html
Copyright © 2020-2023  润新知