1. 程式人生 > >win64 驅動內存基本操作

win64 驅動內存基本操作

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 驅動內存基本操作