一、原理

在windbg中,我们通过CR3找到页目录表,通过页目录表找到页表,期间使用的都是物理地址,物理地址在编程中是无法使用的。

我们在之前的学习中了解到页目录表和页表的结构和对应关系,如图:

我们知道了有一个线性地址 0xC0000000 指向了第一张页表,也知道了线性地址 0xC0300000 指向了页目录表,它其实是第0x300张页表。我们可以通过0xC0300000 找到任何一个线性地址的PDE,我们还知道1024张页表在内存中是连续的,这意味着我们可以通过 0xC0000000 找到任何一个 PTE。公式如下:

PDE = 0xC0300000 + PDI * 4
PTE = 0xC0000000 + PDI * 4KB + PTI * 4

PDI 是页目录表的下标,PTI是页表的下标,分别对应10-10-12的前两个10.
解释一下第二条公式,0xC0000000 + PDI * 4KB 是找到线性地址所在的页表,为什么可以这样做?因为页表的线性地址是连续的(但物理地址不连续),范围是 0xC0000000 - 0xC03FFFFF。
找到页表后,加上 PTI * 4 就能找到其页表项PTE了。

二、实验

下面编写一个程序,给NULL挂一个物理页。

// ModifyPDE_PTE.cpp : Defines the entry point for the console application.
// 10-10-12 分页#include "stdafx.h"
#include <Windows.h>typedef ULONG (WINAPI *DBGPRINT)(PCSTR Format,...
);DBGPRINT DbgPrint = NULL;DWORD *GetPDE(DWORD addr)
{DWORD PDI = addr>>22;DWORD PTI = (addr>>12)&0x000003FF;return (DWORD *)(0xC0300000 + PDI * 4);
}DWORD *GetPTE(DWORD addr)
{DWORD PDI = addr>>22;DWORD PTI = (addr>>12)&0x000003FF;return (DWORD *)(0xC0000000 + PDI * 0x1000 + PTI * 4);
}DWORD *page;void __declspec(naked) R0Function()
{__asm{push ebpmov ebp,espsub esp,0x1000pushadpushfd        }// 给NULL挂物理页__asm push fsDbgPrint("page PDE: %08X\n",*GetPDE((DWORD)page));DbgPrint("page PTE: %08X\n",*GetPTE((DWORD)page));DbgPrint("NULL PDE: %08X\n",*GetPDE(0));DbgPrint("NULL PTE: %08X\n",*GetPTE(0));DbgPrint("NULL挂物理页...\n");*GetPDE(NULL) = *GetPDE((DWORD)page);*GetPTE(NULL) = *GetPTE((DWORD)page);DbgPrint("page PDE: %08X\n",*GetPDE((DWORD)page));DbgPrint("page PTE: %08X\n",*GetPTE((DWORD)page));DbgPrint("NULL PDE: %08X\n",*GetPDE(0));DbgPrint("NULL PTE: %08X\n",*GetPTE(0));__asm pop fs__asm{popfdpopadadd esp,0x1000mov esp,ebppop ebpiretd}
}int _tmain(int argc, _TCHAR* argv[])
{   page = (DWORD *)VirtualAlloc(NULL,0x1000,MEM_COMMIT,PAGE_READWRITE);memset(page,0,0x1000); // 挂物理页DbgPrint = (DBGPRINT)GetProcAddress(LoadLibraryA("ntdll.dll"),"DbgPrint"); // 载入函数printf("在IDT表构建中断门,请在windbg中执行下面的指令:\n");printf("eq 8003f500 %04xee00`0008%04x\n",(DWORD)R0Function>>16,(DWORD)R0Function & 0x0000FFFF);getchar();// 用中断门提权,在R0读写PTE__asm int 0x20printf("NULL挂物理页成功.\n");*(int*)NULL = 0x12345678;printf("%x\n", page[0]);getchar();return 0;
}

运行结果:

(22)通过代码修改PTE实现挂物理页相关推荐

  1. (18)修改 PTE 实现挂物理页读写空指针

    一.10-10-12二级映射 下图是101012二级映射结构: 二.读写NULL指针 正常编程中,不能读写NULL,原因是NULL指针没有对应的物理页,因此,只要我们让NULL指针最终映射到一块可读写 ...

  2. (19)修改PDE PTE 的RW位使物理页可读写

    一.PDE PTE 结构 低12位是权限位.低2位是RW位,RW=0表示只读,RW=1表示可读可写. 二.修改常量区数据 C语言中,修改常量区的字符串是不允许的,原因是物理页不具有写权限. // PD ...

  3. 22种代码味道(Martin Fowler与Kent Beck)

    Martin Fowler在Refactoring: Improving the Design of Existing Code(中译名:<重构--改善既有代码的设计>)一书中与Kent ...

  4. qt添加菜单纯代码_开始玩qt,使用代码修改设计模式生成的菜单

    之前制作菜单时,不是纯代码便是用设计模式 直接图形化完成. 今天我就是想用代码修改已经存在的菜单项,如果是用代码生成的可以直接调用指针完成: 但通过设计模式完成的没有暴露指针给我,至少我没发现. 在几 ...

  5. am335x UART1输入u-boot 调试信息代码修改

    AM335x 调试信息UART1输出代码修改 1. 关于pin_mux  的配置 代码修改位置: /board/forlinx/ok335x/mux.c 1 void enable_uart0_pin ...

  6. YOLOV5 模型和代码修改——针对小目标识别

    2021.8.24 效果还是可以的,公司楼下: 一.简述 针对YOLOV5小目标识别部分做了算法改进: 1.修改了MODEL,增加了小目标检测层 2.修改了detect.py,增加了分割检测模块,以时 ...

  7. python小波分析,频率普分析——代码修改

    写在前面: 做毕业论文的时候想要使用小波分析,开始到处找小波分析的代码,matlab代码居多但没有显著性检验,唯一找到有检验的这篇文章基于python进行小波分析,频率谱分析(作者:撼沧)是pytho ...

  8. 22种代码的坏味道,一句话概括

    22种代码的坏味道,一句话概括: 如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹. 正如食物要腐坏之前,经常会发出一些异味一样. 我们管这些痕迹叫做"代码异味&q ...

  9. TVM yolov3优化代码修改(编译运行OK)

    TVM yolov3优化代码修改(编译运行OK) yolov3_quantize_sample.py 附https://github.com/makihiro/tvm_yolov3_sample代码: ...

最新文章

  1. 申万一级行业日指数_申万一级行业指数一周表现
  2. 导航栏与scrollerview(或scrollerview的子类)
  3. 第二阶段冲刺10天 第一天
  4. openvc学习笔记(4)——两种方法在没有环境下运行程序
  5. java for list i_Java中ArrayList的fori和foreach效率比较
  6. frida hook so层、protobuf 数据解析
  7. 2018 A Sparse Topic Model for Extracting Aspect-Specific Summaries from Online Reviews 稀疏主题模型学习笔记
  8. 数据库连接配置 app.config web.config
  9. 一文带你认识队列数据结构
  10. 使用 Gradle 实现一套代码开发多个应用
  11. spring4声明式事务mdash;02 xml配置方式
  12. Spring常用注解(绝对经典)
  13. android逆向 arm,[原创]Android下ARM静态反编译逆向.(小试多玩YY协议)
  14. SHFileOperation 文件夹COPY
  15. cruzer php sandisk 闪迪u盘量产工具_闪迪u3量产工具下载 SanDisk Cruzer Micro(闪迪u盘量产工具) V1.0 官方免费版(附使用说明) 下载-脚本之家...
  16. 携程校招2017编程题之股票最大利润
  17. win7装matlab教程,win7系统怎么安装matlab软件(图文教程)
  18. 论文阅读“Automatic detection of hardhats worn by construction personnel”
  19. Android 卡顿优化之 Skipped * frames 掉帧的计算
  20. aws-s3-使用boto3根据路径和间隔时间进行清理删除启用版本控制的文件

热门文章

  1. 成功解决Eclipse窗口布局混乱或者Eclipse窗口布局出现单独独立小窗口的问题(图文教程)
  2. 成功解决cv2.error: OpenCV(4.1.2) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: err
  3. 成功解决Exception unhandled ImportError DLL load failed: 找不到指定的程序。 lib\imp.py, Line: 343
  4. DL之CNN:计算机视觉之卷积神经网络经典算法简介、重要进展、改进技巧之详细攻略(建议收藏)
  5. IDE之Jupyter:交互式文档Jupyter Notebook简介、安装、使用方法详细攻略
  6. 学习Python3:201701030
  7. tensorflow+numpy 深度学习相关函数(持续更新)
  8. 利用ansible 自动发布安装
  9. http和https的一种能力?
  10. PHP5.6通过CURL上传图片@符无效的兼容问题