Траблы с CR3

Тема в разделе "WASM.NT.KERNEL", создана пользователем Velheart, 2 июн 2008.

  1. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Здравствуйте. Буду очень признателен, если кто-нибудь просветит, как работать с CR3. Насколько я понимаю, там хранится ФИЗИЧЕСКИЙ адрес каталога страниц, если это так, почему тогда следующий код вызывает бсод:
    Код (Text):
    1.            
    2.            #define PDI(Address) ( ((DWORD)(Address)) >> 22 )
    3.            #define PTI(Address) ( ( (DWORD)(Address) >> 12 ) & 0x000003FF)
    4.            .............
    5.            IndDir=PDI(AddrTest);
    6.            IndTbl=PTI(AddrTest);
    7.            .......
    8.              __asm
    9.     {
    10.         pushad
    11.         mov ecx, dword ptr [IndDir]
    12.         mov edx, dword ptr [IndTbl]
    13.         mov eax, CR0
    14.         and eax, 0EFFFFFFFh
    15.         mov CR0, eax
    16.         mov eax, CR3
    17.         and eax, 0FFFFF000h
    18.         lea eax, [eax+4*ecx]
    19.         mov esi, dword ptr [eax]      ;тут бсод
    20.         and esi, 0FFFFF000h
    21.         lea esi, [esi+edx*4]
    22.         mov esi, dword ptr [esi]
    23.         mov eax, CR0
    24.         or eax, 0x80000000
    25.         mov CR0, eax
    26.         mov Tmp, esi
    27.         popad
    28.     }
    Я подозреваю, что просто так недостаточно убрать 31-й бит в CR0, или может я вообще не так все делаю? Буду благодарен за любую помощь.
     
  2. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    — сli
    — Transfer program control to linear addresses that are identity mapped to
    physical addresses (that is, linear addresses equal physical addresses).
    — Insure that the GDT and IDT are in identity mapped pages.
    — Clear the PG bit in the CR0 register.
    — Move 0H into the CR3 register to flush the TLB
     
  3. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    JAPH А что за источник?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    asmfan
    Подозреваю, что Intel маны.

    Velheart
    а зачем тебе отключать страничную трансляцию? может быть можно проще сделать то, что ты хочешь
     
  5. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    JAPH
    Сенкс, боюсь, только что
    трудно реализуемо... =))

    Great
    Я просто хотел бы научиться подменять физические адреса, не меняя виртуальных, т.е. ставить хуки, например, шаманя в PT и PD, просто вроде везде пишут, что это возможно, а примеров нигде нет.. но это и хорошо, учитывая, что все это затевается в самообразовательных целях, т.к. усваивается лучше, чем копание в уже готовом коде =))

    Ну а для этого нужно как-то достать виртуальный адрес для значения в CR3, вроде ДДК говорит,что есть MmGetVirtualForPhysical, которая недокументирована, но судя по WRK, делает то, что нужно (хотя может я ошибаюсь, только что мельком глянул =) ), может есть какие-нибудь известные-классические способы?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    #define PTE_BASE 0xC0000000
    #define PDE_BASE 0xC0300000
    #define PDE_BASE_PAE 0xc0600000

    #define MiGetPdeAddress(va) ((MMPTE*)(((((ULONG)(va)) >> 22) << 2) + PDE_BASE))
    #define MiGetPteAddress(va) ((MMPTE*)(((((ULONG)(va)) >> 12) << 2) + PTE_BASE))

    #define MiGetPdeAddressPae(va) ((PMMPTE_PAE)(PDE_BASE_PAE + ((((ULONG)(va)) >> 21) << 3)))
    #define MiGetPteAddressPae(va) ((PMMPTE_PAE)(PTE_BASE + ((((ULONG)(va)) >> 12) << 3)))
     
  7. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Я такие дефайны видел, только тогда не понял, и теперь не понимаю для какого они процесса?? Если еще можно предположить, что виртуальный адрес, соответствующий CR3 в любом процессе 0xC0300000, то как быть с PTE_BASE? Ну то есть PTE_BASE же должен определяться из PD,и быть не один, иначе зачем последний? Буду очень признателен за прояснение этого вопроса, а то у меня по этому поводу совсем каша в голове =))
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Для любого.
    В нужном адресном пространстве они ссылаются на таблицы каталогов и страниц, описывающих это самое адресное пространство.

    Ээ, алё, это виртуальные адреса. Физический адрес каталога страниц можно узнать из Process->DirectoryTableBase, но он обычно не требуется.
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    как определил?
    боюсь, что эта инструкция (равно как и все инструкции после записи CR0) не выполняются ;)
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    rei3er
    Меня интересует как вообще бсод показывается с выключенной страничной трансляцией :)
     
  11. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Ну про бсод -- загрузил крэш-дамп, windbg сказал, что именно там, причем если я перед этой инструкцией делал cli, то был IRQL_LESS_OR_EQUAL =)), а иначе не было кода вообще..

    Извиняюсь, если сильно туплю, но если таблица страниц для процесса одна и в адресном пространстве процесса по виртуальному адресу 0xc0000000, то как мы можем адресовать 4 гб, если мы не используем для трансляции PDE?? Т.е. я неправильно понимаю: каталог страниц для процесса один, а таблиц страниц несколько?? Например код:
    Код (Text):
    1. PVOID newmem=ExAllocatePool(NonPagedPoolMustSucceed, 0x1000);
    2. ...........
    3.              Tmp=*(DWORD*)((BYTE*)DIR_BASE+PDI(newmem)*4);
    4.     DbgPrint("Mem: %X, PDI: %X, PDE: %X\n",newmem,PDI(newmem), Tmp);
    5.     Tmp=*(DWORD*)((BYTE*)TBL_BASE+PTI(newmem)*4);
    6.     DbgPrint("Mem: %X, PTI: %X, PTE: %X\n",newmem,PTI(newmem), Tmp);
    выводит нули в PDE и PTE...
     
  12. ant_man

    ant_man New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2004
    Сообщения:
    23
    PAE включен или нет??

    Таблиц страниц много, просто они последовательно в виртуальной памяти отображены.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Не понял что имелось в виду.
    Есть список PDE из каталогов, в каждом каталоге есть список из PTE, которая уже описывает нужную страницу.
    Соответствующий метод поиска PTE процессором (если он вдруг не оказался в TLB) описан в манах интела.

    >>если мы не используем для трансляции PDE??
    кажется, понял твой вопрос. Ты можешь формально разбирать PDE/PTE, но в винде используются более удобные макросы MiGetPteAddress, которые сразу тебе дают адрес PTE для соотв. виртуального адреса страницы и основаны о том, что PTE идут не абы как, а упорядоченно, и можно вычислить адрес быстрее основываясь на расположении этих самых PTE. Тогда действительно не потребуется тебе анализировать каталоги страниц.
    Но все равно они присутствуют, т.к. процессор ничего не знает о том, как операционная система располагает в памяти PTE (а они могут идти в совершенно любом порядке - главное, чтобы ссылки правильно были расставлены) и поэтому он просто "тупо" идет по ссылкам - сначала выбирает PDE, потом выбирает PTE из каталога.
    А винда упорядочивает каталоги просто для удобства.

    ЗЫ. Ну ко всем моим высказываниям нужно приписать еще PDPE, если включен Physical Address Extension (PAE)
     
  14. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Хех, сенкс всем, кажется разобрался =)))
    PAE у меня не было (зато был зверь, из-за которого пришлось переустанавливать виндовс =) ),а только что случайно наткнулся на
    из windbg хелпа =))
     
  15. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Вот блин, действительно PAE включен, я почему-то думал, что нужно проверять boot.ini на ключ /PAE..А то я вроде переписал все правильно, а все равно нули, я тогда посмотрел, что !pte в windbg говорит:
    Насколько я понял, еще и страницы не 4к, сорри что ввел в заблуждение...