看板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》 ◣◣◢ ─╯