Как перевести виртуальный в физический адрес (WinDbg)? - PullRequest
1 голос
/ 04 октября 2019

Кажется, я чего-то не понимаю.

Я пытаюсь перевести VA в PA в Windows 10 (x86) в VirtualBox. Я использую руководство Microsoft для этого. Я установил локальный отладчик ядра (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 в ячейке: 00000000 00001010 11111100 10110110 5-й бит - true , что означает, что PAE включено.

Затем я открыл окна памяти и набрал адрес 400000, чтобы проверить, есть ли в виртуальной памяти заголовок CFF Explorer.exe .

enter image description here

Затем я попытался получить номер кадра страницы (PFN) через расширение PTE (по инструкции):

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

У меня неправильный адрес. В то же время, когда я пытался получить PFN файла kernel32.dll, я получил действительный адрес:

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 имеет тот же базовый адрес, что и CFFExplorer.exe . Я всегда думаю, что у каждого процесса есть собственное отображение зависимого модуля в его собственную память, но сейчас это кажется не так.

Мои вопросы:

  1. Почему я получаю "недействительно" при попытке перевести 0x00400000 адрес?
  2. Пожалуйста, проясните ситуацию с kernel32.dll и моими сомнениями по поводу сопоставления модуля с каждым процессом.

ОБНОВЛЕНИЕ 0 : я не знаюпочему, но когда я отлаживаю ядро ​​как локальное - я вижу то же значение в ALL регистрах. Я попытался удаленно отладить ядро, и теперь я вижу разные значения для каждого регистра:

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

И теперь я не могу получить kernel32.dll илиперевод других модулей. Основные вопросы открыты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...