看板 Programming 關於我們 聯絡資訊
在 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 ◣◣─╯