cr0

爲了安全起見,Windows XP及其以後的系統將一些重要的內存頁設置爲只讀屬性,這樣就算有權力訪問該表也不能隨意對其修改,例如SSDT、IDT等。但這種方法很容易被繞過,我 們只要將這些部分修改爲可寫屬性就可以了,不過當我們的事情做完後記得把它們恢復爲只讀屬性,不然會造成一些很難預料到的後果。

 

cr0是系統內的控制寄存器之一。控制寄存器是一些特殊的寄存器,它們可以控制CPU的一些重要特性。

控制寄存器最初出現於低級的286處理器中,以前稱之爲機器狀態字(machine status word),在386以後它們被重命名爲控制寄存器(control register)。cr0寄存器直到486的處理器版本才被加入了“寫保護”(Write Protect,WP)位,WP位控制是否允許處理器向標記爲只讀屬性的內存頁寫入數據,如果我們將WP位設置爲0,就可以禁用寫保護的功能。

 

cr0的第16位是WP位,只要將這一位置0就可以禁用寫保護,置1則可將其恢復。

 

禁用和啓用寫保護的內聯彙編代碼如下所示:
// 關閉寫保護
__asm
{
    cli ;
    mov eax, cr0
    and  eax, ~0x10000
    mov cr0, eax
}

// 恢復寫保護
__asm
{
    mov  eax, cr0
    or     eax, 0x10000
    mov  cr0, eax
    sti ;
}

 

需要注意的是,這裏的cli和sti都是特權指令,必須在ring0才能使用的。

除了cr0之外,還有4個控制寄存器。cr1未被使用(或者被偷偷使用了,但沒有在文檔中說明),cr2在處理器處於保護模式時存儲上一個導致頁故 障的地址,cr3存儲頁目錄的地址,cr4在Pentium系列(包括486的後期版本)處理器中才實現,它處理的事務包括諸如何時啓用虛擬8086模式 等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章