課上練習 手工將虛擬位址轉換為實體地址

2021-07-09 07:55:15 字數 2987 閱讀 6585

環境設定:

關閉pae(實體地址擴充套件)

bcdedit /set pae forcedisable

bcdedit/set nx alwaysoff

開啟雙機除錯,在虛擬機器中新建乙個記事本,並輸入「cyxvc」,然後斷下來

在windbgm中輸入:

0: kd> !process 0 0 notepad.exe

process 8816f3d8  sessionid: 1  cid: 0960    peb: 7ffd4000  parentcid: 0630

dirbase: 38200000  objecttable: 8bfbc410  handlecount:  63.

image: notepad.exe

0: kd>.process 8816f3d8  

implicit process is now 8816f3d8

warning: .cache forcedecodeuser is not enabled

0: kd> s -u 400000 l2000000 "cyxvc"

018a0b3c  0063 0079 0078 0076 0063 0000 0000 0000  c.y.x.v.c.......

0: kd>du 018a0b3c  

018a0b3c  "cyxvc"

分解018a0b3c 

前十位(頁目錄索引):

6中十位(頁表索引):

a0後十二位(位元組索引):

b3c0: kd>!dd 38200000 

#38200000 3962e867 396af867 00000000 00000000

#38200010 36303867 36fcf867 39e3f867 390a5867

#38200020 3a0be867 38000867 36d0f867 00000000

#38200030 00000000 00000000 00000000 00000000

#38200040 00000000 00000000 00000000 00000000

#38200050 00000000 00000000 00000000 00000000

#38200060 00000000 00000000 00000000 00000000

#38200070 00000000 00000000 00000000 00000000

39e3f867 後三位是許可權描述 取39e3f000

0: kd>!dd 39e3f000+a0*4

#39e3f280 38180867 00000080 00000080 00000080

#39e3f290 35dc2867 360c1867 00000080 00000080

#39e3f2a0 36604867 36908867 362c3867 367c9867

#39e3f2b0 36c0a867 3690b867 36e8c867 3690d867

#39e3f2c0 36b4e867 36f8f867 36c90867 36c11867

#39e3f2d0 36c52867 367c6867 369c7867 370d3867

#39e3f2e0 36805867 36d96867 36f97867 36e98867

#39e3f2f0 36dd9867 3705a867 371db867 374dc867

38180867 後三位是許可權描述 取38180000

最終轉換成的實體地址為:38180000+b3c=38180b3c

即 018a0b3c =》 38180b3c

其他資料:

已知乙個虛擬位址0x01af5518, 則轉換的過程如下:

注意: *這裡討論的以windows下普通模式分頁的情況, 也就是2級頁表的情況*

1.首先把虛擬位址拆分成3個部分(低12位, 中10位, 高10位), 換成2進製如下:

-> 0000 0001 1010 1111 0101 0101 0001 1000 

按照10, 10, 12的位數重新排列後

-> (頁目錄索引)00 000 00110, (頁表項索引)10 1111 0101, (偏移)0101 0001 1000

換算成十六進製制後可以得到如下結果

頁目錄索引 = 6, 頁表項索引 = 0x2f5 , 偏移 = 0x518

2. 根據當前的cr3暫存器中的實體地址定位頁目錄表基址

cr3中存放的是實體地址, 這個實體地址指向程序的頁目錄表基址, 由此可以得到

頁目錄表基址(pde) = cr3 = 0xaa0e5000

3. 計算頁表項的位址

頁表位址存放在頁目錄表(pde)中的第6個專案中, 也就是

[0xaa0e5000 + 4 * 6] = [0xaa0e5018] = 0x3d955867, 其中0x00000867為該頁表屬性值, pte = 0x3d955000 

3. 計算頁面實體地址

我們要找的頁面在這個頁表中的第0x2f5項, 所以虛擬位址所在的頁的實體地址為

[0x3d955000 + 0x2f5 * 4] = [0x3d955bd4] = 

假設[0x3d955bd4] = 0x7095e847, 頁面的實體地址 x0x7095e000, 0x00000847表示的是頁面屬性 

4. 計算最終的實體地址

由虛擬位址分離的偏移可以計算出最終的實體地址為 

0x7095e000 + 0x00000518 = 0x7095e518.

初試將虛擬位址轉換為實體地址

背景 最近學習張銀奎的 軟體除錯 看到 2.7.5 節 使用windbg觀察分頁機制,終於看到第乙個可以操作的例子,但始終不能按書上的方式正確的將虛擬位址轉換為實體地址,google一下,終於解決,放到這裡記錄一下。注 可以看到提示符是 kd,這裡為了避免開兩個windbg,直接使用的是核心除錯除錯...

使用者態程序的虛擬位址轉換到實體地址

看linux記憶體機制好幾遍了,總算是對記憶體機制有了基本的認識。下面就說乙個我剛看記憶體是的乙個問題 使用者態程序的虛擬位址如何轉換成實體地址?區分乙個程序,我們都知道最簡單就是程序的pid。我們就從 pid,virtualaddress 來看看如何將乙個程序的虛擬位址轉換為實體地址phyaddr...

Linux 核心虛擬位址到實體地址轉換討論

首先我們基於平坦型物理記憶體,單個node,下面是基於64位armv8架構得到,其他架構也有類似結論 arm64 ffffffc000080000 t text ffffffc000080160 t stext ffffffc000083000 t vectors ffffffc0010890b8 ...