Привет! Вот такой у меня трабл: Мой драйвер для заданного процесса должен модифицировать какую-то часть системной библиотеки, например, kernel32.dll. У меня есть BaseAddress этой библиотеки. Мне нужно модифицировать, например, одну страницу так, чтобы эти модификации были видны только в этом процессе, т.к. если я из режима ядра поменяю нужный мне кусок (через IoAllocateMdl -> MmProbeAndLockPages -> MmGetSystemAddressForMdlSafe - насколько я понимаю - то это производит к созданию новых страниц, которые отображаются в туже физическую память, что скрывается за виртуальным адресом, переданным в IoAllocateMdl), - это изменение будет видно во всех процессах, т.к. такие модули, как kernel32.dll спроецированы во все процессы по одному и тому же виртуальному адресу, который ссылается на одну и туже физ. память. Мне хотелось бы получить аналогичный результат, как если бы программа из режима пользователя изменила атрибут защиты страниц спроецированного модуля kernel32.dll на PAGE_READWRITE, а при записи сработал бы флаг PAGE_WRITECOPY, и для заданного участка мы получили бы частные страницы. Надеюсь вы меня поняли! Заранее спасибо за Ваши ответы! з.ы. Можно ли написать такое приложение, которое не будет содержать в своем АП системную библиотеку - kernel32.dll? У меня это не получилось...
aet Можно ли написать такое приложение, которое не будет содержать в своем АП системную библиотеку - kernel32.dll? У меня это не получилось... Под 9X это было можно легко. А вот под NT нужен другой тип приложения, с SubSystem=NATIVE. К native приложениям относятся autochk (проверяет диски, если это нужно, при загрузке системы), smss (с него начинается работа в ring3), а также ядро - ntoskrnl и ядерные библиотеки, например, hal.dll. Однако запущенные пользователем в ring3, они так в ring3 и живут, причём работают с вполне определёнными правами, как обычные приложения. Даже после logoff'а они существуют, и система убивает их только при отключении. Но запустить их обычным образом нельзя. Поищи RunNative, а далее найдёшь подробную по ним информацию. Только для написания GUI они не подходят.
Спасибо, а как насчет первой части вопроса? Неужели никто никогда не сталкивался с подобной проблемой?
В NT'шных системах если страница модифицировалась из АП определенного процесса, то она и будет привязана к виртуальным адресам одного этого процесса, другие изменений ведь не увидят Для NT (до XP) ещё можно себя загрузить на address of thread start routine: Код (Text): ;===================================================================== format pe gui at 0x79430000 ; imageBase kernel32.dll rb 1024*64 ; ~< sizeof kernel32.dll ;===================================================================== @@: jmp @b ;=====================================================================
В NT'шных системах если страница модифицировалась из АП определенного процесса, то она и будет привязана к виртуальным адресам одного этого процесса, другие изменений ведь не увидят Мда, все так, если ты пытаешься записать из режима пользователя. А я ведь в ядре...