注意: 中间加阴影的部分 是为了刷新 TLB 快表,后面章节有详解。
测试结果:
这里不知道为什么printf时候 我的 exception handler 4 检测异常;导致输出不了;但是的确0页 映射到了 和全局变量同一个物理页。
代码:
// 5_进程空间虚拟零地址读写.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include "pch.h"#include<stdio.h>#include<stdlib.h>#include<Windows.h>#define PTE(x) ((DWORD *)(0xc0000000 + ((x>> 12)<< 3)))#define PDE(x) ((DWORD *)(0xc0600000 + ((x >> 21) << 3)))//0x4197b0DWORD g_var = 0x12345678;DWORD g_out;//0x401040void _declspec(naked) IdtEntry(){ PTE(0)[0] = PTE(0x4197b0)[0] ; PTE(0)[1] = PTE(0x4197b0)[1]; __asm { mov eax, cr3 mov cr3, eax } g_out = *(DWORD*)0x7b0; *(DWORD*)0x7b0 = 0x11111111; __asm { // 问题 所在 ,, fs 出错了 ,既然这里可以复制过去能成功;那么应该是前面的 修改 导致了fs 错误。 push 0x3b; pop fs; iretd }}void _declspec(naked) go(){ g_var = 0x2222222; __asm { int 0x20 ret }}//eq 8003f500 0040ee00 081000void main(){ if ((DWORD)IdtEntry != 0x401040) { printf("wrong addr: sp", IdtEntry); exit(-1); } go(); //printf("out: %p\n", * (DWORD*)0x403000); printf("var: %d\n", 0x1); printf("var: %p\n", g_var); printf("out: %p\n", g_out); printf("var: %p\n", *(DWORD *)(0x4197b0)); system(" pause");}