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