修改Windows上的页表条目

时间:2015-02-28 20:25:55

标签: windows windbg

对于堆栈地址,我有以下来自Windgb的PDE / PTE信息:

    kd> !pte 6EFFC 
                VA 0006effc
    PDE at C0600000            PTE at C0000370
    contains 0000000065D39867  contains 0000000000000020
    pfn 65d39     ---DA--UWEV  not valid
                        DemandZero
                        Protect: 1 - Readonly

如果即使PTE无效也能如何更改,WinDBG如何了解只读状态?必须通过VAD完成吗?

1 个答案:

答案 0 :(得分:3)

如果' valid'未设置PTE的位(在您的示例中就是这种情况),然后PTE由操作系统处理,而不是由MMU处理。

在这种情况下,您的PTE是一个软件PTE(_MMPTE_SOFTWARE结构;!= _MMPTE_HARDWARE [您可以' dt' windbg上的两个结构],这可能导致4种类型的软件PTE,具体取决于位域中设置的位。

如果第12到31位全部为零,则这是一个" Demand Zero" PTE(因此,不通过VAD解析)。第5位到第9位表示页面保护(0x20 =第5位设置=只读)。

保护位未正式记录,但您可以在网上的某些页面上找到它们的值。取自this reactos page

#define MM_ZERO_ACCESS         0  // this value is not used. 
#define MM_READONLY            1 
#define MM_EXECUTE             2 
#define MM_EXECUTE_READ        3 
#define MM_READWRITE           4  // bit 2 is set if this is writable. 
#define MM_WRITECOPY           5 
#define MM_EXECUTE_READWRITE   6 
#define MM_EXECUTE_WRITECOPY   7 
#define MM_NOCACHE             8 
#define MM_DECOMMIT         0x10 
#define MM_NOACCESS         MM_DECOMMIT|MM_NOCACHE

(注意:记住你必须左移5以上常数,因为保护位从第5位开始)

请参阅此博客文章" Windows Virtual Address Translation and the Pagefile" (特别是讨论软件PTE的部分)可以很好地解释各种PTE。