看板Programming
标 题VirtualProtect API 中的属性疑问
发信站不良牛牧场 (Mon May 29 05:23:41 2006)
转信站ptt!ctu-reader!Spring!news.nctu!news.ntu!bbs.ee.ntu!zoonews.ee.ntu!Sim
在 VirtualProtect API 中 , 其中有 PAGE_EXECUTE 和 PAGE_READONLY 属性 ,
保护模式有分segment & paging 权限检查 , 当2者权限都符合才能执行指令 ,
权限如下:
segment descriptor
bit-8 bit-9 bit-10
data A W E
code A R C
paging table entry
bit-1 bit-2
R/W U/S
一般来说,无论是code sement或是data segment,至少bit-9 都是0 ,
对於code segment表示只能执行,对於data segment 表示只能读取 ,
而paging 的 bit-1 表示是否可读/写/执行 ,VirtualProtect这个
api中的PAGE_READONLY 属性来说,它把 paging 的bit-1 设为0表示唯读 .
假设virtual address 0x00560000 在唯读属性的分页中(paging table entry
的bit-1 是 0),所以当存取此分页时,ex:mov [0x0056000] , eax .
先检查是否符合 segment 权限(DPL & bit-9) ,再检查是否符合 paging 权限
(bit-1& bit-2) ,假若正好此分页也是code 且 0x0056000 是个函式位址 ,
那 call [0x0056000] 也不是可以执行吗 ?
因为 cs 指向的 descriptor,bit-9 起码是0表示可执行,且又符合paging检查(
bit-1为0对於 cs 来说是可以执行).
那问题来了,segment descriptor 的 bit-9 等於 0 ,对於code 来说是可以执行 ,
对於 data来说是唯读 ; paging 的bit-1 等於0 对於 code 来说是可以执行 ,
对於data 来说是唯读的 , 也就是说 , segment 的 bit-9 和 paging 的 bit-1
对於code 与data 是一体两面的 , 那 VirtualProtect 中 的 PAGE_EXECUTE 和
PAGE_READONLY 属性又是如何达成的 ??
因为若 code segment 可以执行 , 那麽 data segment 就一定可以读取 ,
不可能把 PAGE_EXECUTE 和 PAGE_READONLY 单独分开 , 还是我的理解错误了 !?
烦请知道的高手说一下,谢谢
--
╭──── Origin:
<不良牛牧场> bbs.badcow.com.tw (210.200.247.200)─────╮
│ ↘ Welcome to SimFarm BBS -- From : [218.170.62.121] │
╰◣◣◢ ◢◢《不良牛免费拨接→电话:40586000→帐号:zoo→密码:zoo》 ◣◣◢ ─╯