用windbg实现虚拟地址到物理地址转换(Converting Virtual Addresses to Physical Addresses)

来源:互联网 发布:java桌面开发框架fx2 编辑:程序博客网 时间:2024/05/16 13:55

转运四方海淘网 : zysfht.com        

原文地址:http://blog.csdn.net/hjl243632044/article/details/7656685

        本文将用一个小例子说明如何在32位cpu下手工将虚拟地址转换内存中的物理地址。(32位xp下测试通过,32位win7不知何因就是不行。大牛若知,请指点,不胜感激。)

        首先补充下理论知识:

       




验证思路如下:首先用windbg找到"当前测试进程"中变量P的虚地址;然后再打开个windbg进入内核模式,查找当前测试进程的DireBase(页目录项);最后利用虚地址通过计算找到对应变量在物理地址中的值。若此值和最初程序中所放的值一样,则说明查找成功。

所用程序源码如下:

#include "stdafx.h"#include<iostream>#include"windows.h"using namespace std;int  p=9;int main(int argc, char* argv[]){cout<<p<<endl;    Sleep(1000000); return 0;}

编译后生成dsds.exe和dsds.pdb(符号文件),将其COPY到symbols文件夹中。



运行程序后,打开windbg,捕捉该进程(Attach to a Process),加载符号文件;勾选Reload,然后OK。



执行 x dsds!p  和dd 00475dc0 这两个命令。(dd:查看虚地址为00475dc0的逻辑地址里存放的值。这个功能是windbg帮助我们实现的,待会我们就是要手工在内存中找到这个值)。(从图中可以看出,实际内存中确实放的是9)


.formats 将虚地址00475dc0 转换为2进制:


另外打开一windbg,进入内核模式(Kernel Debugging----local),!process  0 0 列出当前进程在内核中的信息(记着reload 符号文件):


接下来三步操作如图所示:



原创粉丝点击