Требуется найти указатель на FILE_OBJECT (любой) если известен полный путь к файлу. Открывать файл нельзя (предполагается, что файл может быть залоченым, недоступным и прочее... ). Есть какие-нибудь идеи?
Вообще, делается такое весьма тривиально, но задача не совсем чтобы стандартная, потому спрашиваю: для чего это нужно? Какую задачу ты пытаешься решить таким вот черезжопным методом?
Пока ещё не понятно. Файл не твой. Зачем ты его трогаешь? Я не уверен, что процесс-владелец файла будет этому рад, мы ведь не знаем его логики, не так ли? Может быть, он рассчитывает, что файл будет в кэше, мм? Опиши задачу более подробно и более высокоуровнево, если можно.
Имеется файл. Не мой. Я хочу его убить. Под убить я понимаю затереть нулями на диске. Есть код, который реализовывает затирание файла. Однако есть некоторые проблемы, которые я обнаружил анализируя работу RootkitUnhooker. Он тоже умеет затирать файл нулями. Но делает это отвратно. Я решил сделать получше. Опишу в чем собственно проблема на примере RootkitUnhooker. Предположим имеется работающая malware. Если затереть (wipe) файл нулями с помощью RootkitUnhooker, а затем открыть в шестнадцатеричном редакотре и посмотреть на файл, то окажется, что он все еще не затерт. Происходит это вследствие кэширования. После перезагрузки файл оказывается заполненным нулями. Однако если перед перезагрузкой изменить файл, то файл уже не будет заполнен нулями, так как драйвер файловой системы сбросил кэш на диск. Поэтому возникла идея, перед тем как затереть файл на диске, вытеснить его из кэша, чтобы он не востановился. К тому же, это позволит обойтись и без перезагрузки. Естественно я понимаю, что во многих случаях системе это может не понравится, особенно если затирать все что под руку попало. Здесь речь идет о затирании малвари, которые залочены или не поддаются на простые способы удаления (например руткиты). Ну вроде все.
Ответ на первоначальный вопрос - ZwQuerySystemInformation (SystemHandleInformation), перечислить все хендлы, для каждого хендла типа "файл" - скопировать его себе, сделать ZwQueryObject (ObjectNameInformation) и сравнить пути. Если совпали - референснуть хендл.
Всё правильно, только не SystemHandleInformation, а SystemExtendedHandleInformation. Структуры, соответственно, чуть другие будут.
o14189 Читай мой пост выше. Там написано, что просто стереть файл на диске недостаточно. x64 А более "низкоуровый" способ можете предложить? А то ZwQuerySystemInformation один из самых популярных претендентов на хуки.
На каждую хитрую жопу найдётся болт с ещё более хитрой резьбой. В конечном итоге это борьба равных, и потому проиграна заранее, при чём обеими сторонами. Не ищи других путей, это излишне.
Хорошо сказал. Вот только я не хоуу перехитрить всех. Это невозможно. Я пытаюсь перехитрить побольше. Сделать так, чтобы обойти меня было сложнее. Поэтому и ищу метод по-сложнее...
Если тебе надо убить работающий EXE файл, то сначала идешь и читаешь статью: http://www.wasm.ru/article.php?article=lockfileswork Далее понравившимся методом, слегка доработав под современные системы, находишь хэндл и получаешь его FILE_OBJECT используя ObReferenceObjectByHandle. Далее делая например так Код (Text): pFileObject->SectionObjectPointer->ImageSectionObject = NULL; затираешь файл простыми методами из юзерленда или как угодно из ядра, потом можно восстановить ImageSectionObject. Отрубить можно все 3 секции для надежности. Это очень грязный метод, однако работающий и затереть kav.exe удается на легке. Насчет кеша сказать ничего не могу, т.к. не тестировал, знаю что после ребута EXE точно не заработает.
Я делал на короткие промежутки времени и доп. проверки вводил, бсодов не замечал. Делал я это года полтора-два назад и насколько я помню если не занулить ссылку на образ, то FSD запрос на запись возвращает ошибку, копать нужно где-то там