Найти FILE_OBJECT по пути к файлу

Тема в разделе "WASM.NT.KERNEL", создана пользователем Forever, 28 сен 2009.

  1. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Требуется найти указатель на FILE_OBJECT (любой) если известен полный путь к файлу. Открывать файл нельзя (предполагается, что файл может быть залоченым, недоступным и прочее... ). Есть какие-нибудь идеи?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Вообще, делается такое весьма тривиально, но задача не совсем чтобы стандартная, потому спрашиваю: для чего это нужно? Какую задачу ты пытаешься решить таким вот черезжопным методом?
     
  3. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Пытаюсь вытеснить файл из кэша.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Пока ещё не понятно. Файл не твой. Зачем ты его трогаешь? Я не уверен, что процесс-владелец файла будет этому рад, мы ведь не знаем его логики, не так ли? Может быть, он рассчитывает, что файл будет в кэше, мм? Опиши задачу более подробно и более высокоуровнево, если можно.
     
  5. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Имеется файл. Не мой. Я хочу его убить. Под убить я понимаю затереть нулями на диске. Есть код, который реализовывает затирание файла. Однако есть некоторые проблемы, которые я обнаружил анализируя работу RootkitUnhooker. Он тоже умеет затирать файл нулями. Но делает это отвратно. Я решил сделать получше. Опишу в чем собственно проблема на примере RootkitUnhooker. Предположим имеется работающая malware. Если затереть (wipe) файл нулями с помощью RootkitUnhooker, а затем открыть в шестнадцатеричном редакотре и посмотреть на файл, то окажется, что он все еще не затерт. Происходит это вследствие кэширования. После перезагрузки файл оказывается заполненным нулями. Однако если перед перезагрузкой изменить файл, то файл уже не будет заполнен нулями, так как драйвер файловой системы сбросил кэш на диск. Поэтому возникла идея, перед тем как затереть файл на диске, вытеснить его из кэша, чтобы он не востановился. К тому же, это позволит обойтись и без перезагрузки. Естественно я понимаю, что во многих случаях системе это может не понравится, особенно если затирать все что под руку попало. Здесь речь идет о затирании малвари, которые залочены или не поддаются на простые способы удаления (например руткиты). Ну вроде все.
     
  6. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    ну тогда зачем файловую систему трогать, найти на диске и сделать что нужно
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    конечно же, грамотный парсер NTFS/FATX написать дело пяти минут.
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ответ на первоначальный вопрос - ZwQuerySystemInformation (SystemHandleInformation), перечислить все хендлы, для каждого хендла типа "файл" - скопировать его себе, сделать ZwQueryObject (ObjectNameInformation) и сравнить пути.
    Если совпали - референснуть хендл.
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Всё правильно, только не SystemHandleInformation, а SystemExtendedHandleInformation. Структуры, соответственно, чуть другие будут.
     
  10. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это не поможет, файловая система сбросит кэш и файл снова появится на диске.
     
  11. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    o14189
    Читай мой пост выше. Там написано, что просто стереть файл на диске недостаточно.

    x64
    А более "низкоуровый" способ можете предложить? А то ZwQuerySystemInformation один из самых популярных претендентов на хуки.
     
  12. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    На каждую хитрую жопу найдётся болт с ещё более хитрой резьбой. В конечном итоге это борьба равных, и потому проиграна заранее, при чём обеими сторонами. Не ищи других путей, это излишне.
     
  13. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Хорошо сказал. Вот только я не хоуу перехитрить всех. Это невозможно. Я пытаюсь перехитрить побольше. Сделать так, чтобы обойти меня было сложнее. Поэтому и ищу метод по-сложнее...
     
  14. Guest

    Guest Guest

    Публикаций:
    0
    Если тебе надо убить работающий EXE файл, то сначала идешь и читаешь статью:
    http://www.wasm.ru/article.php?article=lockfileswork
    Далее понравившимся методом, слегка доработав под современные системы, находишь хэндл и получаешь его FILE_OBJECT используя ObReferenceObjectByHandle.
    Далее делая например так
    Код (Text):
    1. pFileObject->SectionObjectPointer->ImageSectionObject = NULL;
    затираешь файл простыми методами из юзерленда или как угодно из ядра, потом можно восстановить ImageSectionObject.
    Отрубить можно все 3 секции для надежности. Это очень грязный метод, однако работающий и затереть kav.exe удается на легке.
    Насчет кеша сказать ничего не могу, т.к. не тестировал, знаю что после ребута EXE точно не заработает.
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Можешь пробежаться по процессам и анализировать таблицы хендлов.
     
  16. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    бсодит это дело, редко но факт, видимо это неожиданно
     
  17. Guest

    Guest Guest

    Публикаций:
    0
    Я делал на короткие промежутки времени и доп. проверки вводил, бсодов не замечал.
    Делал я это года полтора-два назад и насколько я помню если не занулить ссылку на образ, то FSD запрос на запись возвращает ошибку, копать нужно где-то там :)