1. 程式人生 > >關於記憶體防寫和IRQL

關於記憶體防寫和IRQL

摘自胡文亮win64驅動程式設計基礎



在核心裡想要寫入“別人的” 記憶體( 一般指 NTOS 等系統模組的記憶體空間),還有另外的規矩,這裡又涉及到另外兩個概念: IRQL 和記憶體保護。 IRQL 成為中斷請求級別,從 031 32 個級別; 記憶體保護可以開啟和關閉, 如果在記憶體處於保護狀態時寫入,會導致藍屏。 一般來說,要寫入別人的核心記憶體, 必須關閉記憶體防寫,並把 IRQL 提升到 2 才行(絕大多數時候 IRQL 都為 0, 當 IRQL=2 時,會阻斷大部分執行緒執行, 防止執行出錯)。 記憶體是否處於防寫的狀態記錄在 CR0 暫存器上,因此直接修改

CR0 暫存器的值即可;而提升或降低IRQL 則使用 KeRaiseIrqlToDpcLevel KeLowerIrql 實現( WIN64 IRQL 值記錄在 CR8 暫存器上, 而 WIN32 IRQL 值記錄在 KPCR 上)。 程式碼如下:
KIRQL WPOFFx64()
{
KIRQL irql=KeRaiseIrqlToDpcLevel();
UINT64 cr0=__readcr0();
cr0 &= 0xfffffffffffeffff;
__writecr0(cr0);
_disable();
return irql;
}


void WPONx64(KIRQL irql)
{
UINT64 cr0=__readcr0();
cr0 |= 0x10000;
_enable();
__writecr0(cr0);
KeLowerIrql(irql);

void test()
{
KIRQL irql=WPOFF();
RtlMoveMemory(NtOpenProcess,HookCode,15);
WPON(irql);
}