x64 에서 Virtual 메모리를 Physical 메모리로 변환
이 번에는 x64 시스템에서 가상 메모리를 물리 메모리로 변환 해 보도록 하겠습니다. Windows Internals 에 보면 아래와 같이 x64 에서 Address 변환에 대해 설명하고 있습니다.
먼저 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
Comments
- Anonymous
April 12, 2009
The comment has been removed