赞
踩
本次实验使用 Windbg 解析 hello25.exe 程序运行时虚拟地址 0x00403000h 对应的物理地址,那么首先我们先对虚拟地址 0x00403000h 进行分析。
在 64 位操作系统下,虚拟地址的 63-48 位是符号扩展位,在虚拟地址到物理地址的转换过程中没有实际作用,所以我们重点关注剩下的 48 位,其中,47-39 位表示 PML4E,38-30位表示PDPTE,29-21 位表示PDE,20-12 位表示PTE,11-0 位表示页内偏移。以上各标志位与物理地址的联系如下图所示。
由上图可知,虚拟地址 0x00403000h 对应的各标志位如下表所示:
PML4E | PDPTE | PDE | PTE | OFFSET |
---|---|---|---|---|
0 | 0 | 2 | 3 | 0 |
在得知虚拟地址各标志位的数字后,我们运行实验可执行程序 hello25.exe,运行结果如下图所示
现在我们以管理员身份运行 Windbg 来对该进程 hello25.exe 进行追踪,操作步骤为:File -> Attach to a Process -> 选择 hello25.exe -> OK
通过输入命令:db 403000,查看该进程在 0x403000 内存位置中的内容,如下图所示
我们现在以管理员身份打开另一个 Windbg 程序,并进行本地内核调试,操作步骤为:File -> Kernel Debug -> Local -> 确定,在本步骤中,可能会出现报错,请移步最后查看解决方案
我们首先通过命令 !process 0 0 hello25.exe 寻找该进程的 Dirbase,我们从下图可以看到在本机实验中,该进程的 Dirbase 是 0x278c60002
根据规则:上一级的 table entry 的 35-12 位提供了下一级的物理基地址的高 24 位,低 12 位补 0。由上图可知 PML4E 的上一级 DirBase 为 0x278c60002,我们在前面的对虚拟地址的分析中,已知虚拟地址 0x00403000h 的 PML4E 为 0,那么,我们输入命令 !dq 278c60000 + 0 * 8 来查找 PML4E 的物理基地址
由上图可知 PDPTE 的上一级 PML4E 为 0x26886c867,已知虚拟地址 0x00403000h 的 PDPTE 为 0,那么,我们输入命令 !dq 26886c000 + 0 * 8 来查找 PDPTE 的物理基地址
由上图可知 PDE 的上一级 PDPTE 为 0x21b26d867,已知虚拟地址 0x00403000h 的 PDE 为 2,那么,我们输入命令 !dq 21b26d000 + 0x2 * 8 来查找 PDE 的物理基地址
由上图可知 PTE 的上一级 PDE 为 0x21b26d867,已知虚拟地址 0x00403000h 的 PTE 为 3,那么,我们输入命令 !dq 20c06f000 + 0x3 * 8 来查找 PTE 的物理基地址
由上图可知 PTE 物理基地址为 0x21b26d867,已知虚拟地址 0x00403000h 的 页内偏移 为 0,那么,我们输入命令 !db 268291000,即找到了虚拟地址 0x00403000h 对应的物理地址为 0x268291000,可通过如下图所示,物理地址与虚拟地址对应的数据一致得以验证
在 Win10 系统下启用 Windbg 进行内核调试,可能出现如下报错,现在给出一种通过关闭操作系统的UAC机制来解决该问题的解决方案
通过 Win + R,打开 gpedit.msc 本地组策略编辑器
在编辑器的左面的列表中,依次点开“计算机配置” -> “windows设置” -> “安全设置” -> “本地策略” -> “安全选项”,在安全选项右面的窗口中找到“用户账户控制:以管理员批准模式运行所有管理员”,双击打开。最后在“用户账户控制:以管理员批准模式运行所有管理员”属性中选择“已禁用”,单击确定,重新启动计算机。
重启计算机后,以管理员身份打开命令行,输入 bcdedit -debug on 命令,再次重启计算机,即可使用 Windbg 来进行内核调试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。