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