229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
1 | |
Каким образом узнать системный раздел?16.04.2016, 14:59. Показов 2222. Ответов 19
Метки нет (Все метки)
User mode функции не доступны в kernel-mode, однако надо как то узнать системный раздел. Прочитал что можно в system32 попасть ссылкой "L\\SystemRoot". Как тогда попасть в системный раздел?
Добавлено через 27 минут Да, и... как получить список файлов в указанной папке?
0
|
16.04.2016, 14:59 | |
Ответы с готовыми решениями:
19
Интересно узнать каким образом скрывают файлы и папки? Каким образом узнать текстовую часть надписи поля Как узнать, каким образом была закрыта форма? Каким образом можно узнать букву диска, на который установлена ОС? |
Ушел с форума
|
|
16.04.2016, 21:51 | 2 |
Сообщение было отмечено Пёс как решение
Решение
Только не в System32, а в C:\Windows.
Ну например, ZwQuerySymbolicLinkObject с символьной ссылкой SystemRoot, а дальше вытащить из получившегося пути имя раздела. ZwQueryDirectoryFile
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|||||||||||
17.04.2016, 06:59 [ТС] | 3 | ||||||||||
Убежденный, подскажите, как пользоваться ZwQueryDirectoryFile. А если, более точно, то мне непонятно, что писать в параметр Length. На MSDN написано, что там надо указать размер буффера, на который указывает указатель FILE_NAME_INFORMATION.
Этот указатель указывает у нас на структуру, а точнее может указывать на разные структуры в зависимости от того, что мы хотим получить. Я хочу получить FILE_NAMES_INFORMATION. Получается, что в Lenght надо кинуть sizeof(FILE_NAMES_INFORMATION) что ли? Добавлено через 5 часов 23 минуты Убежденный, блин, ну никак не могу понять что тут не так... Весь вечер просидел....
Перед тем как искать, программу проверил. Добавлено через 2 часа 53 минуты Убежденный, хм... не дает покоя эта проблема, сделал вот по из книги Солдатова. Там конечно не ZwQueryDirectoryFile, а ZwQueryInformationFile используется, но интересующие меня параметры такие же. Сделал аналогично, бсоды прекратились, однако результата всеравно не получил я. Вот код (сильно не ржать! раскопировал, потому что так быстрее было, чем цикл писать) Да и вообще, вставать давно пора, а я не ложился ещё
0
|
Ушел с форума
|
|
17.04.2016, 07:59 | 4 |
Сообщение было отмечено Пёс как решение
Решение
В эту функцию следует передавать буфер, который достаточно большой,
чтобы вместить хотя бы одну структуру FILE_XXX_INFORMATION, а лучше сразу брать с запасом, потому что многие структуры, например FILE_NAMES_INFORMATION, имеют "плавающий" размер и заранее неизвестно, сколько байт потребуется. Функцию ZwQueryDirectoryFile нужно вызывать в цикле. На каждом шаге она будет возвращать одну или более структур в буфер, при этом см. также параметр RestartScan (он должен быть TRUE только при первом вызове). Когда структур больше не останется, функция вернет код STATUS_NO_MORE_ITEMS. Там еще есть тонкости с возвратом кода STATUS_BUFFER_OVERFLOW на первом вызове, а также с IoStatusBlock->Information = 0 на последующих, все это детально описано в MSDN. Кстати, ZwQueryDirectoryFile можно вызывать из user mode (она в ntdll.dll). Так отлаживать код проще, т.к. падение не приводит к BSOD и необходимости делать ребут. Еще я бы посоветовал включить для драйвера проверки в Driver Verifier (все, кроме эмуляции нехватки ресурсов и проверки целостности кода), чтобы система сразу проверяла корректность работы с памятью, например.
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
17.04.2016, 17:05 [ТС] | 5 |
Убежденный, С вызовом разобрался, спасибо, оказалось что я забыл закрыть хендл, а совместный доступ был запрещён и в итоге хендл висел даже когда драйвер был выгружен, и блокировал обращение к папке самому себе, при повторной загрузке.
На MSDN сказано: If ZwQueryDirectoryFile is called multiple times on the same directory and some other operation changes the contents of that directory, any changes may or may not be seen, depending on the timing of the operations. Как можно обойти это, если необходимо постоянно проверять содержимое папки? Добавлено через 19 минут Убежденный, Весьма странная реализация этой функции... если я загружаю драйвер, он проверяет содержимое папки, всё отлично, перезагружаю, всё отлично выдаёт.... хоть 10 раз делаю рестарт всё работает... Но стоит только добавить туда файл ещё один, сразу же выдаёт шлак, помогает только рестарт системы. Чем обусловлено столь странное, хоть и документированное поведение? И как же быть если надо постоянно проверять содержимое, которое может измениться?
0
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
17.04.2016, 19:16 [ТС] | 6 |
Убежденный, разобрался с этими вопросами, оказывается, проблема была совсем не в функции, А в том что был открыт проводник в той папке. Получается, тогда когда в проводнике открыта эта папка, то драйвер не может получить доступ к этой папке. Функция возвращает:
ZwCreateFile NTSTATUS = 0xC0000043 ZwCreateFile() = STATUS_SHARING_VIOLATION Как можно это преодолеть?
0
|
Ушел с форума
|
|
17.04.2016, 20:22 | 7 |
См. параметр ShareAccess в ZwCreateFile. У тебя в коде туда передается 0,
т.е. всем другим процессам запрещается открывать файл с какими-либо правами. Это не правильно.
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
17.04.2016, 21:04 [ТС] | 8 |
Убежденный, точно блин, я оказывается EaBuffer и ShareAccess местами поменял. Вот растяпа! Спасибо!
0
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
20.04.2016, 06:55 [ТС] | 9 |
Убежденный, Привет, не подскажешь, каким образом можно узнать в FltPreOperationCallBack, чем является TargetFileObject: папкой или файлом? В структуре FILE_OBJECT не описано, в FLT_FILE_NAME_INFORMATION тоже ничего такого не нашёл....
хм... неужели придется создавать атрибуты, потом хендл, вызывать ZwQueryInformationFile, и получать структуру FILE_STANDARD_INFORMATION только ради одного флага? Очень надеюсь, что всё таки есть другой способ.
0
|
Ушел с форума
|
|
20.04.2016, 11:03 | 10 |
Он есть. Подсказка: см. функции с префиксом Flt, они специально предназначены
для вызова из minifilter callbacks для получения всякой полезной информации и выполнения различных операций. Если вдруг не найдешь - тынц
FltIsDirectory Кстати, вызывать ее придется в post create...
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
21.04.2016, 01:39 [ТС] | 11 |
Убежденный, снова ступор... Вообщем, в flt_preoperation_callback настроенный на событие IRP_MJ_CREATE, отлавливаю моменты открытия файлов в моей директории (та, в которой файлы должны быть зашифрованы) Есть функция, которая расшифровывает файл (всё таки я решил обучения ради, при обращении к файлу расшифровывать во временную директорию). Естественно там используется ZwCreateFile(). Предполагал сделать так:
Как только приходит IRP_MJ_CREATE на любой файл из моей директории, в pre_operation_callback выполнить расшифрование во временный файл, и сделать перенаправление операции в этот файл, путем замены полей Data->Iopb->TargetFileObject и установкой Data->IoStatus.Information = IO_REPARSE; Data->IoStatus.Status = STATUS_REPARSE; При наступлении события IRP_MJ_CLOSE производить зашифрование временного файла, и сохранение в родную директорию.... Но всё оказалось не так просто... Не знаю, почему, но вызов функции расшифрования/шифрования, из flt_preoperation_callback приводит к BSOD 0xC000007F STATUS_DISK_FULL, (диск не полон - это точно). Подозреваю что всё дело IRQL. Если вызывать эти же самые функции из DriverEntry всё прекрасно работает. Даже и не знаю что делать дальше и куда копать.... Столько кода и всё напрасно, даже уже хочется бросить всё. Добавлено через 23 минуты Убежденный, проверил IRQL внутри PreOperationCallBack, равно 0... ещё больший ступор... совсем не понимаю, почему так происходит... Добавлено через 37 минут Убежденный, Нашёл информацию по теме, как я понял из документации MSDN, необходимо создавать хендл с помощью FltCreateFile... Вместо ZwCreateFile. Сейчас пойду попробую.
0
|
Ушел с форума
|
|
21.04.2016, 10:17 | 12 |
Из FS-калбэков нельзя вызывать ZwCreateFile и т.п. файловые операции напрямую,
потому что это легко может привести к рекурсии и переполнению стека. Flt-функции для того и придумали, чтобы обходить данное ограничение.
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
21.04.2016, 14:34 [ТС] | 13 |
Убежденный, спасибо, только до сих пор не понял следующее:
В чем тогда отличие FltCreateFile, FltCreateFileEx, и FltCreateFileEx2? Как я понял, то FltCreateFile открывает файл специально для использования ZwXXX функциями. FltCreateFileEx - открывает для использования FltXXX функциями. Или же я всё таки могу использовать FltXX функции для файла открытого с помощью FltCreateFile? (при условии что windows xp и выше) Или же ZwФункции вообще никак нельзя использовать в flt-callback функциях? Добавлено через 15 минут Ещё забыл спросить про InitiatingInstance... где взять этот параметр? Он есть например в FltWriteFile()...
0
|
Ушел с форума
|
|
21.04.2016, 14:39 | 14 |
В дополнительных параметрах. См. MSDN, не?
Можешь. Можно, но только те, которые не ведут, явно или неявно, к открытию файла и созданию пакета ввода-вывода, который снова отправляется в FS-стек... В FLT_RELATED_OBJECTS, см. параметры FS-калбэка.
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
21.04.2016, 18:08 [ТС] | 15 |
Убежденный, переписал код следующим образом: в из pre_operation_callback, вызывается функция, которая открывает два хендла с помощью FltCreateFile(), ну и с помощью ZwWriteFile() и ZwReadFile(), читает, расшифровывает, записывает в другой файл. Не знаю почему, но чтение проходит успешно, а вот ZwWriteFile() возвращает STATUS 0xC000000D STATUS_REQUEST_NOT_ACCEPTED. Мне кажется я что-то напутал может с параметром Instance, в FltCreateFile... Честно сказать, я так и не смог до конца понять что именно он значит. При вызове FltCreateFile() для файла, с которого буду считывать (это как раз тот файл, по которому произошла операция IRP_MJ_CREATE) кидаю Instanse из структуры FLT_RELATED_OBJECTS, а при вызове FltCreateFile() для файла в который буду записывать пробовал кидать и NULL и указатель из FLT_RELATED_OBJECTS. Всёравно не успешно.
Либо же я снова неправильно понял и ZwCreateFile() нельзя вызывать из колбека, даже если открыт хендл был с помощью FltCreateFile(). Если хендлы поменять местами, то всё точно также: чтение успешно, а запись 0xC000000D Возможно мне стоило использовать FltWriteFile, и FltReadFile и тогда, может быть и никаких проблем бы не было, но вот загвоздка... Для этих функций нужны другие аргументы, и если с тем файлом, по которому проходит операция, вроде как всё понятно и все аргументы есть, то где взять FILE_OBJECT и что нужно передать в InitiatingInstance при открытии того файла, в который я собираюсь писать? Уж простите, если я задаю слишком глупые вопросы, я понимаю что вся эта информация есть на MSDN, но трудности перевода и неопытность в написании драйверов вносят свои правки.
0
|
Ушел с форума
|
|
21.04.2016, 18:18 | 16 |
1. Вместо ZwCreateFile/ZwReadFile/ZwWriteFile в калбэках минифильтров
следует использовать только FltCreateFileXxx/FltReadFile/FltWriteFile. Без вариантов. 2. Ответы на вопросы типа "где взять FILE_OBJECT" в callback-е - искать только в MSDN, там это все есть. Текст осваивается с помощью англо-русского переводчика. Подсказка: см. более глубоко параметры, которые приходят в callback: это большие сложные структуры с массой различных флагов и данных, FILE_OBJECT там тоже есть. 3. Большая часть моих ответов на такие вопросы - это отсылка в MSDN и в Гугл, а там снова все на английском.
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
21.04.2016, 18:27 [ТС] | 17 |
Убежденный, Вы точно правильно меня поняли? В callback функции есть FileObject для того файла, по которому происходит данная операция... и с этим никаких вопросов.
А где мне взять FILE_OBJECT для того файла, в который я буду расшифровывать. Ведь его точно в callback'е не может быть...
0
|
Ушел с форума
|
|
21.04.2016, 18:46 | 18 |
ObReferenceObjectByHandle routine
https://msdn.microsoft.com/en-... s.85).aspx
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
22.04.2016, 16:26 [ТС] | 19 |
Убежденный, Спасибо, если бы не ссылка, я бы наврядли когда нашёл бы эту функцию. Написал всё, уже даже неплохо работает... но почему то в папке иногда создаются файлы, которых там не должно быть... по 0 байт... даже так получается, что создаются файлы, которые были раньше... сейчас их нигде нет, но по их уникальным именам, я понял что эти файлы были удалены ранее. Что это может значить? Может я гдето вылез за границы EOF или это надо искать в направлении RelatedFileObject?
0
|
Ушел с форума
|
|
22.04.2016, 18:37 | 20 |
0
|
22.04.2016, 18:37 | |
22.04.2016, 18:37 | |
Помогаю со студенческими работами здесь
20
Каким образом через cmd узнать, какой диск является системным? Может ли рефлексия каким-то образом узнать о перехватываемом исключении в создаваемом объекте В локальной сети статические IP адреса, каким образом можно узнать какие IP заняты? Каким образом узнать площадь параллелограмма через векторы, если неизвестен угол между ними? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства
Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
|
Что такое NullReferenceException и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
|
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
|
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
|
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
|
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
|
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее:
На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
|
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript
В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
|
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
|
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален
В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
|
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
|
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели
В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
|