用windbg實現虛擬地址到物理地址轉換(Converting Virtual Addresses to Physical Addresses)

轉運四方海淘網 : 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 符號文件):


接下來三步操作如圖所示:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章