приватные страницы

Тема в разделе "WASM.WIN32", создана пользователем aet, 28 янв 2006.

  1. aet

    aet New Member

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

    Вот такой у меня трабл:



    Мой драйвер для заданного процесса должен модифицировать какую-то часть системной библиотеки, например, kernel32.dll.



    У меня есть BaseAddress этой библиотеки. Мне нужно модифицировать, например, одну страницу так, чтобы эти модификации были видны только в этом процессе, т.к. если я из режима ядра поменяю нужный мне кусок (через IoAllocateMdl -> MmProbeAndLockPages -> MmGetSystemAddressForMdlSafe - насколько я понимаю - то это производит к созданию новых страниц, которые отображаются в туже физическую память, что скрывается за виртуальным адресом, переданным в IoAllocateMdl), - это изменение будет видно во всех процессах, т.к. такие модули, как kernel32.dll спроецированы во все процессы по одному и тому же виртуальному адресу, который ссылается на одну и туже физ. память.



    Мне хотелось бы получить аналогичный результат, как если бы программа из режима пользователя изменила атрибут защиты страниц спроецированного модуля kernel32.dll на PAGE_READWRITE, а при записи сработал бы флаг PAGE_WRITECOPY, и для заданного участка мы получили бы частные страницы.



    Надеюсь вы меня поняли!

    Заранее спасибо за Ваши ответы!



    з.ы. Можно ли написать такое приложение, которое не будет содержать в своем АП системную библиотеку - kernel32.dll? У меня это не получилось...
     
  2. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    aet

    Можно ли написать такое приложение, которое не будет содержать в своем АП системную библиотеку - kernel32.dll? У меня это не получилось...

    Под 9X это было можно легко. А вот под NT нужен другой тип приложения, с SubSystem=NATIVE. К native приложениям относятся autochk (проверяет диски, если это нужно, при загрузке системы), smss (с него начинается работа в ring3), а также ядро - ntoskrnl и ядерные библиотеки, например, hal.dll. Однако запущенные пользователем в ring3, они так в ring3 и живут, причём работают с вполне определёнными правами, как обычные приложения. Даже после logoff'а они существуют, и система убивает их только при отключении. Но запустить их обычным образом нельзя.

    Поищи RunNative, а далее найдёшь подробную по ним информацию. Только для написания GUI они не подходят.
     
  3. aet

    aet New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2006
    Сообщения:
    4
    Адрес:
    Ukraine
    Спасибо, а как насчет первой части вопроса? Неужели никто никогда не сталкивался с подобной проблемой?
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    В NT'шных системах если страница модифицировалась из АП определенного процесса, то она и будет привязана к виртуальным адресам одного этого процесса, другие изменений ведь не увидят







    Для NT (до XP) ещё можно себя загрузить на address of thread start routine:
    Код (Text):
    1. ;=====================================================================
    2. format      pe gui at 0x79430000 ; imageBase kernel32.dll
    3.                    rb 1024*64    ; ~< sizeof kernel32.dll
    4. ;=====================================================================
    5. @@:         jmp    @b
    6. ;=====================================================================  
     
  5. aet

    aet New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2006
    Сообщения:
    4
    Адрес:
    Ukraine
    В NT'шных системах если страница модифицировалась из АП определенного процесса, то она и будет привязана к виртуальным адресам одного этого процесса, другие изменений ведь не увидят



    Мда, все так, если ты пытаешься записать из режима пользователя. А я ведь в ядре...