首页
社区
课程
招聘
[原创]从分页机制思考内存断点
发表于: 2011-2-24 15:35 8519

[原创]从分页机制思考内存断点

2011-2-24 15:35
8519

最近用OD对内存设断点时候想到内存断点有2种  内存访问和内存写入 ,但为什么没有内存读取断点呢?
下面是自己的一点想法,有错误的话麻烦各位大虾不吝指教。。
从http://bbs.pediy.com/showthread.php?threadid=10829 我了解到内存断点的原理即
如果是内存写断点,OD就修改相应的页面属性为RE(可读,可执行)
如果是内存访问断点,OD就修改相应的页面属性为NO ACCESS(不可访问)

修改页面属性肯定一般用到VirtualProtect 这个函数有个参数是修改后的页面属性:
关于读写和执行的有

PAGE_EXECUTE_READWRITE
PAGE_EXECUTE
PAGE_READONLY
PAGE_READWRITE
PAGE_NOACCESS
PAGE_EXECUTE_READ

对于这个函数先看到这里 ,后面会用到,下面看分页机制。

分页机制是保护模式的重要成员之一,引用书上的话解释就是:
在保护模式下,控制寄存器CR0中的最高位PG位控制分页管理机制是否生效。如果PG=1,分页机制生效,把线性地址转换为物理地址。如果PG=0,分页机制无效,线性地址就直接作为物理地址。必须注意,只有在保护方式下分页机制才可能生效。只有在保证使PE位为1的前提下,才能够使PG位为1,否则将引起通用保护故障。
关于怎样计算的就不介绍了,可以自己网上查。

分页机制个人认为分为2种一个是开启PAE的分页机制和普通的分页机制
普通的分页机制页表和页目录项是32位即4字节而PAE下的是8字节。
简单的讲PAE下的分页机制可以将虚拟地址映射到更大的物理内存上。
对于普通的分页机制,与页的保护有关的内容是页表或页目录项的低12位,图如下:

其中U/S位是代表相应的页可以访问的特权级,为0 只有RING0、1、2可以访问 为1任意特权级都可以访问。
P位是代表所对应的页有没有映射到物理内存。
R/W是代表所对应的页面是否可以读/写/执行,这个标志位只对于CPU处于ring3级别才有效。为1的时候代表 可读可写可执行  为0的时候代表可读可执行
上述条件一旦CPU在检查部通过的时候就会触发14(0eh)号异常,然后执行操作系统布置好的代码。
那么现在就清楚了:
内存写断点是OD用PAGE_EXECUTE_READ调用VirtualProtect,最后内核中的函数会把相应的页表项r/w位设置为0

内存访问断点是OD用PAGE_NOACCESS调用VirtualProtect,最后内核中的函数会把相应的页表项P位设置为0

至于为什么没有内存读取断点,这就显而易见了,因为页表项不支持,如果R/W位为0代表可写可执行就可以了,页的执行权始终是有的

另外对于开启PAE下的分页机制与普通的分页机制除了在计算上的差别,还有一点很重要的差别就是利用页表项的第63位即最高位作为代码执行权的标准。这个位置1,表示此页不可执行。没有置位,
表示此页可以执行。即页的执行权要依据条件了。
XP SP2中的DEP技术就是利用这一点来完成的,这在MSDN中有所体现,对于PAGE_READONLY和
PAGE_READWRITE 在MSDN中都有这么一句话“If Data Execution Prevention is enabled, attempting to execute code in the committed region results in an access violation.“

但是PAGE_EXECUTE却没有这一句,原文是这样说的”An attempt to read from or write to the committed region results in an access violation. “我认为还是需要借助于PAE来实现的,于是我测验了一下,环境是XP sp3 没有开启PAE
代码如下:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
PAGE_EXECUTE 都不能读  又怎么能运行呢  既然能运行 那肯定是能读取的了
2011-2-24 17:29
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
3
RING3的话有个Guard Page
2011-2-24 17:48
0
游客
登录 | 注册 方可回帖
返回
//