1. 程式人生 > 實用技巧 >學習筆記(五):10-10-12分頁(一)

學習筆記(五):10-10-12分頁(一)

CR3-->PDT|PDE0|-->PTT0|PTE0|-->實體記憶體
|PDE1| |PTE1|
|PDE2| |PTE2|

將一個線性地址分為10,10,12三部分,分別為PDT,PTT,實體記憶體的偏移

如果為大頁則分為10,22兩部分,分別為PDT,實體記憶體的偏移

CR3-->PDT-->實體記憶體

實驗一:直接修改實體記憶體

先在作業系統中改為10-10-12分頁

修改boot檔案中/noexecute=optin為/execute=optin

測試程式碼

#include "stdafx.h"
#include 
<windows.h> //401020 void __declspec(naked)Test(){ __asm{ iretd } } int main(int argc, char* argv[]) { __asm{ //int 0x20 } printf("%x\n",*(DWORD*)0x401020); getchar(); printf("%x\n",*(DWORD*)0x401020); getchar(); return 0; } //401020 //0000 0000 01 1*4 //00 0000 0001 1*4
//0000 0010 0000 20

檢視CR3

!process 0 0

檢視PDT

檢視PTT

kd> !dd 030a3000+4  //067為PDE屬性

檢視實體記憶體

修改實體記憶體

!ed c5c0020 ffffffff

實驗二:為0地址掛物理頁

測試程式碼

#include "stdafx.h"
#include <windows.h>
//401020
void __declspec(naked)Test(){
    __asm{
        iretd
    }

}

int main(int argc, char* argv[])
{
    __asm{
        
//int 0x20 } getchar(); printf("%x\n",*(DWORD*)0x0); getchar(); return 0; }

0的PTE為0

掛一個物理頁,這裡用的401020處的