前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用WinDbg查看保护模式分页机制下的物理地址

使用WinDbg查看保护模式分页机制下的物理地址

作者头像
战神伽罗
发布2021-01-26 16:16:45
1.8K0
发布2021-01-26 16:16:45
举报
文章被收录于专栏:Eureka的技术时光轴

我们知道,当今主流的x86/x64 Intel处理器默认都使用了保护模式,不同于8086时代的实模式机制,保护模式和分页机制实现了内核层与用户层隔离,进程间执行环境隔离。

对Win32系统比较熟悉的人都知道系统为每一个进程都分配了4GB的进程空间,其中低2GB是用户层空间,而高2GB是内核层空间,而内存地址使用的分页机制下的虚拟地址,而虚拟地址需要通过分页机制的层层转换,才能找到映射该内存地址的物理地址,下面让我们使用WinDbg工具来看一下系统如何通过虚拟地址找到真正的物理地址:

首先要构建一个双机调试环境(见另一篇文章看,本文使用的虚拟机为Win7 x86 sp1),我使用的WinDbg和virtualKD,将virtualKD的插件装到虚拟机中,然后重启虚拟机:

选择window 7 [virtualKD] [启用调试程序]:

然后等虚拟机进入桌面后,打开记事本,输入一串字符串(那就”Hello World!“吧。。。)

然后点击WinDbg的break按钮,使操作系统断下来

使用 !process 0 0 命令查看当前系统所有进程信息,找到记事本所在进程

可以看出记事本进程的进程块起始地址为882e4030

因为当前是在系统进程断下,所以此时我们要切换到记事本的进程

使用.process -i 882e4030(进程块地址)命令,在输入 g 命令将WinDbg当前调试进程切换到notepad.exe

然后我们使用s -u命令再记事本进程中搜索 Hello World! 这个字符串

s -u 0x00000000 L0x01000000 "Hello World!"

在上面两个地址处都保存有字符串 Hello World! 我们取第一个虚拟地址0x001ee148,求出此地址在计算机内存内所对应的物理地址。

下面来说以下Win32 X86下虚拟地址的构成,在开启PAE模式的情况下,一个32位的虚拟地址有以下几部分组成:

0x001ee148这个虚拟地址按照上图进行分解可得----- 00(0)-000000000(0)-111101110(0x1EE)-000101001000(0x148)

CPU中有一个CR3寄存器保存了当前进程的页目录表的的基址

通过 r cr3命令查看cr3寄存器的值,得到cr3=7eaf6540,即为页目录的基址(注意,cr3保存的是物理地址,用WinDbg查看物理地址时要在最前面加上!符号)。

因为页目录表索引为0,所以使用 !dq 7eaf6540+0*8查看页目录的基址

页目录和页表的每一项都是8个字节,其中第12-31位保存了页表的基址。从之前对虚拟地址的分解可知,页目录项的索引为0,也就是是第一项,所以页目录的基址为3a4b6000,而页目录索引为0

使用!dq 3a4b6000+0*8查看页表的基址

使用!dq db9e000+8*0x1ee找到页基址

可以得到物理地址所在页基址为3cefc000,而字节索引为0x148

使用!db 3cefc000+0x148查看该地址的内容

正好是我们的Hello World字符串,所以我们成功地根据虚拟地址通过分页机制找到了物理地址。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档