Вопрос про NTFS

Тема в разделе "WASM.WIN32", создана пользователем mart, 17 сен 2008.

  1. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Подскажите плз наиболее простой способ, как определить номера секторов/кластеров на логическом диске, в которых хранятся разные метаданные нужного нам файла в системе NTFS(время последнего открытия/изменения, серия кластеров и т.д.). Насколько помню, эти метаданные в NTFS начинаются с символов "FILE", потом следуют различные атрибуты файла. Спасибо за помощь!
     
  2. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Чтение MFT с открытого в RAW режиме диска и парсинг записей MFT. Сигнатура FILE имеется у файловых записей, тогда как остальные свойства (называемые аттрибуты), делятся на резидентные и нерезидентные. В каждой MFT находятся ссылки на аттрибуты файла, которые в свою очередь, могут находиться где угодно (если нерезидентные) и в самой FILE record (резидентные).
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    MFT record можно получить и документированным способом, без прямого чтения диска - FSCTL_GET_NTFS_FILE_RECORD

    http://msdn.microsoft.com/en-us/library/aa364568
     
  4. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Уважаемые, всем спасибо! 2Partner: отличные новости что есть документированный способ. Но всё-таки возвращаясь к парсеру, есть ли какая-либо документация по НТФС(например, книга Керри "Криминалистический Анализ файловых систем" или другие), которая позволит написать парсер, корректно работающий под икспи и вистой?
     
  5. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Что должно быть на выходе парсера ?
     
  6. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    ntfs-3g - с исходниками есть
    Partner
    Получив MFT запись таким образом, все равно придется доставать аттрибуты нерезидентные (потоки и прочее) руками - если речь идет о просто данных файла - тогда все более или менее документировано и в статьях есть примеры (3 способа чтения занятых файлов, в число которых входит и прямое чтение с помощью полученной карты кластеров, занятых файлом), но топикстартер пишет про метаданные.
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    mart
    http://www.wasm.ru/forum/viewtopic.php?pid=78091#p78091
     
  8. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    На выходе парсера должны быть метаданные файла, резидентные и нерезидентные аттрибуты. Самое трудное состоит в том, чтобы найти MFT Record который соответствует заданному фиксированному файлу, т.е. на входе имеем полный путь, например, D:\Trash\poem.txt, а на выходе должен быть номер кластера, в котором расположена запись МФТ, соответствующая этому файлу poem.txt. Как я понял FSCTL_GET_NTFS_FILE_RECORD эту трудность не решает...
     
  9. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Поиск на koders.com по фразе "ntfs reactos" рулит
     
  10. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Документированых способов нет. Придется все делать ручками. Или обратить внимание на уже существующие исходники.

    Алгорит нахождения индекса файла в MFT следующий.
    1. Разбиваем полный путь на составляющие.
    2. Считываем содержимое корневой директории. (MFT номер 5)
    3. Ищем первую часть пути файла.
    4. Если нашли считываем эту директорию и т.д. рекурсивно.
     
  11. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Нашел более простой способ -


    GetFileInformationByHandle(FileHandle, &FileInfo)

    Для NTFS индекс файла в MFT получаем следующим образом:

    ULONGLONG FileIndex = ((((ULONGLONG) FileInfo.nFileIndexHigh) <<32) + FileInfo. nFileIndexLow) & 0x0000FFFFFFFFFFFF;


    А дальше FSCTL_GET_NTFS_FILE_RECORD и содержимое MFT record у нас в карма.. т.е. в буфере.
     
  12. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    2Partner: Громадный респект за более простой способ!!! Я уже начал думать, что действительно ВСЕ придется делать ручками... Ещё раз большое спасибо!
     
  13. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    2Partner: индекс файла в МФТ как-нибудь связан с номером сектора/кластера в МФТ, в котором хранится МФТ Рекорд данного файла? Интересно, какую информацию можно извлечь из индекса как такового, не используя FSCTL_GET_NTFS_FILE_RECORD....
     
  14. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Индекс файла это просто порядковый номер записи в MFT (48 младших бит) и счетчик изменений файла (16 старших бит). Больше ничего.
     
  15. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Созрел новый вопрос: Можно ли получить хэндл на файл $Mft?
     
  16. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    зачем? прочитать его в raw режиме и всех делов.
     
  17. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    ЗЫ чтение в raw режиме диска возможно только блоками размера кратно 4
     
  18. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Ошибочка - кратно размеру сектора
     
  19. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    В кернел моде $MFT (и все мета файлы) без проблем открываются NtCreateFile.
    В юзер моде, возможно, придется поиграться c правами/привелегиями.
     
  20. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Вот тут для меня проблема возникает. Вообще нет пока ни одной идеи как играться с правами/привилегиями и при помощи каких функций и т.д...