Открыть страничный файл на чтение

Тема в разделе "WASM.NT.KERNEL", создана пользователем Sheph, 3 апр 2008.

  1. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Вобщем, ситуация такая, хочу открыть pagefile.sys на чтение.
    Написал драйвер, в нём добрался до объекта FILE_OBJECT файла pagefile.sys
    и до дескриптора этого файла процесса "System". Имея эти две сущности могу ли я как-то изменить права на pagefile.sys, так чтобы его можно было открыть на чтение, ну хотя бы из ядра ?

    P.S: Важно именно создать новый хэндл на файл, а не использовать существующий. Понятно, то что я могу просто взять хэндл процесса "System" и юзать его, ведь мой драйвер и есть часть процесса "System"
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Статью читал про работу с занятыми файлами?
     
  3. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    n0name, читал, но дело в том что на страничный файл нельзя открыть хэндл даже только для чтения аттрибутов
     
  4. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    А вот если подумать, то вполне возможно что задачу не так просто разрешить. Дело в том что при создании файла pagefile.sys его share аттрибуты попадают вместе с запросом на создание в драйвер файловой системы, сама файловая система не позволяет открывать нешаренные файлы (ShareAccess = 0) и можно сколько угодно изменять поля ShareRead, ReadAccess объекта FILE_OBJECT, все они только для чтения, просто отражают текущее состояние этих флагов в драйвере файловой системы для этого открытого файла, но изменить соотвествующие флаги в самом драйвере файловой системы не представляется возможным, вроде бы не такого запроса - изменить ShareAccess и прочее. Возможно, единственное что остаётся сделать - пропатчить ntoskrnl.exe, в том месте где он открывает страничный файл(ы) изменить поле ShareAccess на FILE_SHARE_READ. Или можно всё-таки как-то проще сделать ?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Дык если у тебя есть FILE_OBJECT, какие тогда проблемы? Дергай IoPageRead() и все дела.

    Сам FILE_OBJECT страничного файла можно найти в структурах MmPagingFile[], а указатель на эти структуры из экспортируемых функций, например, FsRtlIsFileObjectAPagingFile.

    Для чтения можно использовать IoPageRead(), для записи - IoSynchronousPageWrite()

    PS. В моей статье про управление памятью даже пример есть как прочитать из файла подкачки выгруженную в данный момент страницу виртуальной памяти.
     
  6. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Great, это всё хорошо, но дело в том что мне позарез нужен новый хэндл на страничный файл. Меня интересует как это сделать, а читать из страничного файла просто конечно )
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    посмотри какой SecurityDescriptor задан для этого файла. И если не устраивает - подредактирую его.
     
  8. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    n0name, думаю это не поможет, страничный файл не открывается только лишь потому что у него ShareAccess не установлен на чтение, права на него у меня есть, я работаю из под System. Следовательно, мне просто нужно изменить его ShareAccess, но вот как это сделать ?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хендл.. ObOpenObjectByPointer должно прокатить для FILE_OBJECT'а по идее..
     
  10. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Спасибо! Действительно получилось!