MDL修改核心記憶體實現

2021-09-10 12:47:56 字數 1307 閱讀 7116

ntstatus driverentry(pdriver_object driver,punicode_string reg)

//iowriteaccess指定為寫許可權

__except (exception_execute_handler)

//4、呼叫mmmaplockedpagesspecifycache函式生成使用者模式下對應的虛擬位址,然後就能修改這個位址的內容來達到修改核心內容的目的

addrmm = mmmaplockedpagesspecifycache(mdl, kernelmode, mmcached, 0, false, normalpagepriority);//建立乙個核心模式下的虛擬記憶體對應zwquerydirectoryfile函式

dbgprint(「addrmm=%x\n」, addrmm);

addrmm = mmmaplockedpagesspecifycache(mdl, usermode, mmcached, 0, false, normalpagepriority);//建立乙個使用者模式下的虛擬記憶體對應zwquerydirectoryfile函式

dbgprint(「addrmm=%x\n」, addrmm);

*((ulong *)addrmm) = 0x90;//修改使用者模式下的虛擬位址的值達到修改核心模式下的//zwquerydirectoryfile函式前5個位元組的目的

*((ulong *)((ulong)addrmm + 1)) = 0x90909090;

rtlinitunicodestring(&func, l"kdenterdebugger");

dbgprint(「realzwquerydirectoryfile=%x\n」, *((ulong *)realzwquerydirectoryfile));//列印修改以

//後的核心zwquerydirectoryfile函式的前5個位元組的內容

// 5、呼叫mmunmaplockedpages解除對映

mmunmaplockedpages(addrmm, mdl);

// 6、mmfreepagesfrommdl釋放mdl鎖定的物理頁

mmfreepagesfrommdl(mdl);

//7、呼叫iofreemdl 釋放mdl

iofreemdl(mdl);

執行結果如下圖

Linux核心記憶體

核心空間占用4g虛擬記憶體的後1g 明確 不論在核心空間還是使用者空間,看到的位址都是虛擬位址,只是虛擬位址空間不一樣 但是cpu最終訪問的位址是虛擬位址對應的實體地址 虛擬位址轉換成對應的實體地址需要mmu 將來mmu利用頁表進行位址轉換 引申 uclinux支援不帶mmu的處理器 問 使用者空間...

linux核心記憶體分配

核心中的記憶體分配通常通過kmalloc kfree來進行,但是也有其它的方式來獲取記憶體,所有這些方式共同提供了核心中分配 釋放記憶體的介面。類似於標準c中的malloc free,kmalloc kfree是核心中的用於常規記憶體分配的介面。kmalloc kfree是工作在slab分配器的基礎...

linux核心記憶體管理

整個linux虛擬記憶體發布如下 3g以上是核心位址,0 3g是程序位址空間。在x86結構中,核心位址分為三種,這三種型別的區域如下 zone dma 記憶體開始的16mb zone normal 16mb 896mb zone highmem 896mb 結束 程序位址空間的3g,通過mmu,隨機...