如何将虚拟地址转换为物理地址(WinDbg)?

时间:2019-10-04 16:38:02

标签: windows memory-management windbg paging virtual-address-space

看来我听不懂。

我正在尝试在VirtualBox下的Windows 10(x86)上将VA转换为PA。 为此,我使用Microsoft manual。 我设置了本地内核调试器(bcedit),并启动了CFF Explorer作为经过测试的应用程序。然后,我启动WinDbg,连接到内核并获取活动进程:

!process 0 0

找到了我的测试应用程序:

    PROCESS a6bd7900  SessionId: 1  Cid: 0988    Peb: 7ffd9000  ParentCid: 0840
    DirBase: ba9ac3c0  ObjectTable: acaeedc0  HandleCount: <Data Not Accessible>
    Image: CFF Explorer.exe

然后获得PEB:

.process /p a6bd7900; !peb 7ffd9000

Implicit process is now a6bd7900
PEB at 7ffd9000
    ...
    ImageBaseAddress:         00400000
    ...
    Ldr                       76f99aa0
    Ldr.Initialized:          Yes
    Ldr.InInitializationOrderModuleList: 00881658 . 00887c00
    Ldr.InLoadOrderModuleList:           00881728 . 00887bf0
    Ldr.InMemoryOrderModuleList:         00881730 . 00887bf8
    Base TimeStamp                     Module
    400000 50a8fbd6 Nov 18 18:16:38 2012 C:\Program Files\NTCore\Explorer Suite\CFF Explorer.exe
    76e90000 580ee2c9 Oct 25 07:42:49 2016 C:\WINDOWS\SYSTEM32\ntdll.dll
    74970000 57cf8f7a Sep 07 06:54:34 2016 C:\WINDOWS\system32\KERNEL32.DLL
    ...

我键入“!r”命令以打印所有寄存器:

cr0 Value: 00720054
cr2 Value: 00720054
cr3 Value: 00720054
cr4 Value: 00720054

cr4在bin中:00000000 00001010 11111100 10110110 第5位是 true ,表示已启用PAE

然后,我打开“内存”窗口并键入400000地址,以检查我在虚拟内存中是否具有 CFF Explorer.exe 的标题。

enter image description here

然后我尝试通过PTE extension(根据手册)获取页面框架编号(PFN):

lkd> !pte 00400000
                    VA 00400000
PDE at C0600010            PTE at C0002000
contains 0000000000000000
contains 0000000000000000
not valid

我没有一个无效的地址。同时,当我尝试获取kernel32.dll的 PFN 时,我得到了有效地址:

lkd> !pte 74970000 
                    VA 74970000
PDE at C0601D20            PTE at C03A4B80
contains 000000000121B867  contains 800000006F1CE005
pfn 121b      ---DA--UWEV  pfn 6f1ce     -------UR-V

然后通过“ !dc 6f1ce000 ”成功通过物理地址获得了标头。

然后我检查了 windbg.exe 本身,发现 kernel32.dll CFF Explorer.exe 具有相同的基址。我一直认为每个进程都有自己的依赖模块到他自己的内存的映射,但是现在看来并非如此。

我的问题:

  1. 为什么我尝试翻译 0x00400000 地址时会得到“无效”
  2. 请使用 kernel32.dll 清除情况,并对将模块映射到每个进程的疑问。

更新0 : 我不知道为什么,但是当我在本地调试内核时-在 ALL 寄存器中看到相同的值。我尝试过远程调试内核,现在我看到每个寄存器的不同值:

cr0 Value: 80010033
cr2 Value: 909a301c
cr3 Value: 001a8000
cr4 Value: 000406e9

现在,我无法获得 kernel32.dll 或其他模块的翻译。 主要问题已经打开。

0 个答案:

没有答案