(30)保护模式阶段测试
生活随笔
收集整理的這篇文章主要介紹了
(30)保护模式阶段测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、給定一個線性地址,和長度,讀取內容
int ReadMemory(OUT BYTE* buffer,IN DWORD dwAddr,IN DWORD dwLeght)
要求:
先看看讀取NULL的運行情況:
修改代碼:
再看看正確讀取數據的情況:
二、用線性地址0x1000打印數組
題目要求
申請長度為100的DWORD的數組,且每項用該項的地址初始化;
把這個數組所在的物理頁掛到0x1000的地址上;
定義一個指針,指向0x1000這個頁里的數組所在的地址,用0x1000這個頁的線性地址打印出這數組的值;
要求:
數組所在的物理頁,是同一個頁;
思路
用 VirtualAlloc 申請一個頁,得到頁基址指針,按要求進行初始化。然后給線性地址 0x1000 掛物理頁指向這個數組,并打印。
代碼
// PrintArrayWith0x1000.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Windows.h>DWORD *arr;DWORD *GetPDE(DWORD addr) {return (DWORD *)(0xc0600000 + ((addr >> 18) & 0x3ff8));DWORD PDPTI = addr >> 30;DWORD PDI = (addr >> 21) & 0x000001FF;DWORD PTI = (addr >> 12) & 0x000001FF;return (DWORD *)(0xC0600000 + PDPTI * 0x1000 + PDI * 8); }DWORD *GetPTE(DWORD addr) {return (DWORD *)(0xc0000000 + ((addr >> 9) & 0x7ffff8));DWORD PDPTI = addr >> 30;DWORD PDI = (addr >> 21) & 0x000001FF;DWORD PTI = (addr >> 12) & 0x000001FF;return (DWORD *)(0xC0000000 + PDPTI * 0x200000 + PDI * 0x1000 + PTI * 8); }void __declspec(naked) R0Function() {__asm{pushadpushfd}//*GetPDE(0x1000) = *GetPDE((DWORD)arr);*GetPTE(0x1000) = *GetPTE((DWORD)arr);__asm{popfdpopad iretd} }int _tmain(int argc, _TCHAR* argv[]) {// 申請數組并初始化arr = (DWORD *)VirtualAlloc(0,0x1000,MEM_COMMIT,PAGE_READWRITE);for (int i = 0; i < 100; i++){arr[i] = (DWORD)(arr + i);}// 定義0x1000指針DWORD *ptr = (DWORD *)0x1000;// 掛物理頁printf("在IDT表構建中斷門,請在windbg中執行下面的指令:\n");printf("eq 8003f500 %04xee00`0008%04x\n",(DWORD)R0Function>>16,(DWORD)R0Function & 0x0000FFFF);getchar();__asm int 0x20// 通過0x1000打印數組for (int i = 0; i < 100; i++){printf("%x\n",ptr[i]);}return 0; }運行結果
總結
以上是生活随笔為你收集整理的(30)保护模式阶段测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (29)PDE_PTE属性(PWT/PC
- 下一篇: (31)驱动开发环境配置(VS2010+