win64 驅動內存基本操作
阿新 • • 發佈:2017-09-23
read evel oca 還原 此外 nali har bytes write
1.基本函數及其原型
PVOID
ExAllocatePool(
IN POOL_TYPE PoolType,
IN SIZE_T NumberOfBytes
);
VOID RtlMoveMemory( IN VOID UNALIGNED *Destination, IN CONST VOID UNALIGNED *Source, IN SIZE_T Length );
VOID RtlFillMemory( IN VOID UNALIGNED *Destination, IN SIZE_T Length, IN UCHAR Fill );
VOID
ExFreePool(
IN PVOID P
);
2.內存類型
PagedPool 和NonPagedPool
前者可以被置換到硬盤中,一般存儲數據, 如打開一個大文件, 數據結構.
後者不能被置換到硬盤中,駐留在內存中,一般用來存儲代碼.
如果執行代碼到PagedPool的內存中去了,很有可能導致藍屏
此外,在內核空間中所有內存都是可讀可寫可執行,故沒有類似用戶態下的VirtualProtect改變內存屬性的函數
但是並不意味著可以隨意執行和改寫內存中的代碼.要滿足2個條件: 一個是關閉內存寫保護, 二個是提升IRQL級別.(防止執行出錯)
對於關閉內存寫保護通過操作cr0寄存器,後者使用KeRaiseIrqlToDpcLevel 和KeLowerIrql 實現
//關閉內存寫保護和提升IRQL
KIRQL irql=KeRaiseIrqlToDpcLevel();
UINT64 cr0=__readcr0();
cr0 &= 0xfffffffffffeffff;
__writecr0(cr0);
_disable();
還原:
UINT64 cr0=__readcr0(); cr0 |= 0x10000; _enable(); __writecr0(cr0); KeLowerIrql(irql);
未完待續.......
win64 驅動內存基本操作