Kernel-mode. Как изменить атрибуты защиты страниц?

Тема в разделе "WASM.WIN32", создана пользователем rsrc, 10 авг 2004.

  1. rsrc

    rsrc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2004
    Сообщения:
    24
    Адрес:
    Russia
    Привет!



    Как из kernel-mode изменить атрибуты защиты страниц, например, на PAGE_EXECUTE_READWRITE? Какая функция для этого нужна?



    ПАМАГИТЕ!



    Заранее благодарю.
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Если под ХР+, то MmProtectMdlSystemAddress. Если ниже, то вроде никак. В смысле через функции. Руками по PTE лазить надо.



    ЗЫ: PAGE_EXECUTE_READWRITE это обманка для юзера. На x86 это просто PAGE_READWRITE.
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Это я имел ввиду, если память в ядре. Если для юзерных адресов, ZwProtectVirtualMemory.
     
  4. rsrc

    rsrc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2004
    Сообщения:
    24
    Адрес:
    Russia
    Four-F



    ОГРОМНОЕ СПАСИБО!
     
  5. rsrc

    rsrc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2004
    Сообщения:
    24
    Адрес:
    Russia
    Все вроде у меня получилось, но когда делаю MDL для виртуального адреса user-mode процесса и если попадаю на секцию .rdata (только для чтения), то MmProbeAndLockPages() дает исключение, которое я даже на PASSIVE_LEVEL не могу обработать SEH’ом! Почему так происходит?


    Код (Text):
    1.  
    2. ULONG * pu = NULL;
    3. PMDL pmdl;
    4.  
    5. pu = (ULONG*)(*(ULONG*)ioBuffer);
    6.  
    7.  
    8.                 pmdl = MmCreateMdl(0, pu, sizeof(ULONG));
    9.                 if(pmdl)
    10.                 {
    11.                     __try{
    12.                         MmProbeAndLockPages(pmdl, KernelMode, IoModifyAccess);
    13.  
    14.                         pu = MmGetSystemAddressForMdl(pmdl);
    15.  
    16.                         if(pu && NT_SUCCESS(MmProtectMdlSystemAddress(pmdl, PAGE_READWRITE)))
    17.                         {
    18.                             *pu = 13;
    19.                         }
    20.  
    21.                         MmUnlockPages(pmdl);
    22.                     }
    23.                     __except(EXCEPTION_EXECUTE_HANDLER){
    24.                     }
    25.                     IoFreeMdl(pmdl);
    26.                 }
    27.  
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Если ты с юзерными адресами работаешь, на проще ли позвать ZwProtectVirtualMemory?
     
  7. rsrc

    rsrc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2004
    Сообщения:
    24
    Адрес:
    Russia
    Four-F



    Да, но ZwProtectVirtualMemory экспортируется ntdll.dll, которая находится в user-mode, а мне надо бы все делать из kernel-mode!
     
  8. PavPS

    PavPS New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2004
    Сообщения:
    109
    Адрес:
    Russia
    Глянь таблицу экспорта в ntdll - там она уходит в SDT. А так как принцип вызова эдентичен везде, то просто глянь чё ложится в EAX перед Int 2Eh. И сам вызови её уже из ntoskrnl. Не очень то уж и геморно. Если уж прям суждено юзать только ZwProtectVirtualMemory.
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Блин, я забыл, что она ядром не экспортируется.
     
  10. rsrc

    rsrc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2004
    Сообщения:
    24
    Адрес:
    Russia
    Four-F

    Если бы не BSOD MmProbeAndLockPages() на секции токо для чтения, то MmProtectMdlSystemAddress() выручила бы меня!





    PavPS

    Но Руссинович пишет о том, что номера сервисов зависят от номера build’a Windows (их номера генерируются автоматически при компиляции ядра!) и поэтому мне int 2Eh (или SYSENTER) ничего не даст.
     
  11. PavPS

    PavPS New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2004
    Сообщения:
    109
    Адрес:
    Russia
    Да нет, именно это я и имел ввиду, что ты сам должен малец дизасеммблить тот кусок кода, который стоит перед Int 2Eh. Ты должен глянуть, чё ложится в EAX

    ZwProtectVirtualMemory proc near ; CODE XREF: sub_0_77F5A981+69p

    .text:77F7EC43 ; sub_0_77F5A981+106p ...

    .text:77F7EC43 mov eax, 89h ; NtProtectVirtualMemory

    .text:77F7EC48 mov edx, 7FFE0300h

    .text:77F7EC4D call edx

    .text:77F7EC4F retn 14h

    .text:77F7EC4F ZwProtectVirtualMemory endp

    разбираешь опкод этого mov eax, 89h и вперед...

    Например я так вызаваю некоторые ф-ии сам, и пока - пашет на разных build-ах.

    А в то что вызов этой ф-ии изменит свою _сруктуру_, так это вроде революций никаких в MS нет. Вроде не должен. Ну для гарантии можно проверять по каким-нить сигнатурам.

    Короче, у меня пашет.
     
  12. rsrc

    rsrc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2004
    Сообщения:
    24
    Адрес:
    Russia
    PavPS

    Смотри, плз, у Руссиновича на стр. 100 Примечание!



    У меня тоже eax=89h, но если так сделать, то потом у кого-то мой драйвер может вызвать BSOD!!!!
     
  13. PavPS

    PavPS New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2004
    Сообщения:
    109
    Адрес:
    Russia
    Еще'б я спорил...
     
  14. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    rsrc, а какова конечная цель? Если просто писАть из драйвера в юзерную память, то можно сбросить WP. А если именно изменить атрибуты памяти юзерных адресов, то MmProtectMdlSystemAddress тут, IMHO, не поможет, т.к. она вроде только с системными адресами работает. MmGetSystemAddressForMdl вернет тебе адрес в ядре, куда будет отображена пользовательская память. Вот для этой проекции ты и поменяешь атрибуты, а юзерные страницы как были так и останутся со старыми атрибутами. Если я всё правильно понимаю.
     
  15. rsrc

    rsrc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2004
    Сообщения:
    24
    Адрес:
    Russia
    Four-F



    Моя конечная цель это отображать (через MDL) в системное адресное пространство секции ресурсов (битмапы) user-модулей и потом из программных системных потоков выводить все это в видеопамять 25-кадром. И все хорошо, да вот только на секции только для чтения MmProbeAndLockPages() выдает BSOD и наверное придется при сборке exeшников эти секции делать RW. В user-mode невозможно сделать 25-кадр потому, что квант равен примерно 20 мс (показывать картинку надо примерно 42 мс и через 958 мс), а когда еще прога получит квант хз и поэтому возникает мерцание надписи типа “7 лет не пить!”.
     
  16. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Так а зачем атрибуты то менять? Тебе же картинки читать надо будет. Так и отображай себе спокойно.


    Код (Text):
    1. try {
    2.  
    3.     pMdl = IoAllocateMdl( Address, cb, FALSE, FALSE, NULL );
    4.     if ( pMdl != NULL ) {
    5.  
    6.         MmProbeAndLockPages( pMdl, KernelMode, IoReadAccess );
    7.                
    8.         pBuffer = MmGetSystemAddressForMdlSafe( pMdl, NormalPagePriority );
    9.         if ( pBuffer != NULL ) {
    10.  
    11.             Value = * (ULONG*) pBuffer;
    12.  
    13.             MmUnlockPages( pMdl );
    14.  
    15.             Status = STATUS_SUCCESS;
    16.         }
    17.  
    18.         IoFreeMdl( pMdl );
    19.     }
    20.  
    21. } except(EXCEPTION_EXECUTE_HANDLER) {
    22.  
    23.     if ( pMdl != NULL ) {
    24.  
    25.         IoFreeMdl( pMdl );
    26.     }
    27.  
    28.     Status = GetExceptionCode();
    29. }




    Странно, что MmProbeAndLockPages у тя бсодит. Точно я не уверен, но вроде при любом из флагов IoWriteAccess или IoModifyAccess она тоже самое делает. А именно ProbeForWrite. А это должно обрабатываться SEH, иначе можно было бы любому драйверу послать контрол с METHOD_OUT_DIRECT и указателем на read-only буфер... и кирдык, даже не доходя до драйвера.
     
  17. rsrc

    rsrc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2004
    Сообщения:
    24
    Адрес:
    Russia
    Four-F



    <font color="red]CПАСИБО!</font><!--color-->

    <font color="green]CПАСИБО!</font><!--color-->

    <font color="blue]CПАСИБО!</font><!--color-->



    MmProbeAndLockPages(,,IoReadAccess) уже c этим флагом не бсодит и что самое интересное так это то, что можно даже и писАть в read-only user-mode страницы закрепленные с таким IoReadAccess флагом!
     
  18. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ну да. Та же получаешь свою собственную проекцию в ядре. А они по умолчанию всегда RW, вроде.