x64 에서 Virtual 메모리를 Physical 메모리로 변환

이 번에는 x64 시스템에서 가상 메모리를 물리 메모리로 변환 해 보도록 하겠습니다. Windows Internals 에 보면 아래와 같이 x64 에서 Address 변환에 대해 설명하고 있습니다.

image

 

먼저 Virtual address 의 값을 살펴 보도록 하겠습니다. x64 장비 이므로 dp 또는 dq 명령을 사용해야 합니다.

3: kd> dp fffffa60`07272fb0
fffffa60`07272fb0  00000000`0005afa7 fffffa60`07273070
fffffa60`07272fc0  fffff800`01858000 00000000`00000000
fffffa60`07272fd0  cabf471f`00000000 fffffa60`07273670
fffffa60`07272fe0  fffffa60`0b1e7ac8 fffff800`01b3227f
fffffa60`07272ff0  00000000`00000000 00000000`00000000
fffffa60`07273000  00000000`00000000 fffffa60`07274c20
fffffa60`07273010  fffffa60`0b1e7570 fffff800`01b4692a
fffffa60`07273020  fffff800`00000001 fffffa60`0b1e7500

 

이제 이 Address 를 !pte 명령을 사용해서 확인해 보겠습니다.

 

3: kd> !pte fffffa60`07272fb0
                                 VA fffffa6007272fb0
PXE @ FFFFF6FB7DBEDFA0     PPE at FFFFF6FB7DBF4C00    PDE at FFFFF6FB7E9801C8    PTE at FFFFF6FD30039390
contains 000000010C3C4863  contains 000000010C3C3863  contains 000000009A8FC863  contains 0000000086B3C963
pfn 10c3c4     ---DA--KWEV  pfn 10c3c3     ---DA--KWEV  pfn 9a8fc      ---DA--KWEV  pfn 86b3c      -G-DA—KWEV

 

Address 를 Bit 단위로 쪼개 보겠습니다.

 

3: kd> .formats fffffa60`07272fb0
Evaluate expression:
  Hex:     fffffa60`07272fb0
  Decimal: -6184632897616
  Octal:   1777777646000711627660
  Binary:  11111111 11111111 11111010 01100000 00000111 00100111 00101111 10110000
  Chars:   ...`.'/.
  Time:    ***** Invalid FILETIME
  Float:   low 1.25777e-034 high -1.#QNAN
  Double:  -1.#QNAN

 

쪼개진 Bit 를 다시 정리 해 보면 x64 에서는 48Bit 만 사용하기 때문에 앞의 FFFF 는 무시합니다.
1111111111111111
111110100        1F4      <== Page map level 4 selector
110000000        180      <== Page directory pointer selector
000111001        39        <== Page table selector
001110010        72        <== Page table entry selector
111110110000        FB0 <== Byte within page

 

Cr3 register 에서 Page level 4의 address 를 구합니다.

 

3: kd> r cr3
Last set context:
cr3=0000000063476000

 

위의 쪼개놓은 Bit 값을 가지고 변환을 해 보면 처음에 확인한 Virtual address 와 같은 내용을 가지는 Physical address 를 확인할 수 있습니다.

 

3: kd> dp /p 0000000063476000+1f4*8 L1
00000000`63476fa0  00000001`0c3c4863

3: kd> dp /p 10C3C4000+180*8 L1
00000001`0c3c4c00  00000001`0c3c3863

3: kd> dp /p 10c3c3000+39*8 L1
00000001`0c3c31c8  00000000`9a8fc863

3: kd> dq /p 00000000`9a8fc000+72*8 L1
00000000`9a8fc390  00000000`86b3c963

3: kd> dp /p 0`86b3c000+fb0
00000000`86b3cfb0  00000000`0005afa7 fffffa60`07273070
00000000`86b3cfc0  fffff800`01858000 00000000`00000000
00000000`86b3cfd0  cabf471f`00000000 fffffa60`07273670
00000000`86b3cfe0  fffffa60`0b1e7ac8 fffff800`01b3227f
00000000`86b3cff0  00000000`00000000 00000000`00000000