原文地址: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 符号文件):
接下来三步操作如图所示: