есть указанная директория под осью Win7(и выше), например D:/123.
в этой папке лежит документ MS Word(1.doc), и файлик notepad(1.txt).
нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.
это не вирус(хотя звучит как-то подозрительно) — я просто хочу обрабатывать все открываемые файлы в этой папке перед открытием системой.
Спасибо!
Re: перехват открытия файла в определённой директории
Здравствуйте, squid_etc, Вы писали:
_>добрый день!
_>есть указанная директория под осью Win7(и выше), например D:/123. _>в этой папке лежит документ MS Word(1.doc), и файлик notepad(1.txt).
_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.
_>это не вирус(хотя звучит как-то подозрительно) — я просто хочу обрабатывать все открываемые файлы в этой папке перед открытием системой.
_>Спасибо!
Здравствуйте, squid_etc, Вы писали:
_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.
А если не пользователем а программой? Ну антивирь туда полезет, тогда что?
Если и это отслеживать — нужно внедрятся очень глубоко, т.к. файлик можно открыть многими вызовами WinAPI, которые не ограничиваюся CreateFile().
А в простейшем случае можно наверно обойтись перенаправлением ассоциаций файлов на себя с последующим вызовом нужного приложения (если файл таки можно/нужно открыть) уже из-под своей проги.
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re: перехват открытия файла в определённой директории
_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.
Необходимо написать драйвер-фильтр файловой системы.
Если самому не охота, можно готовый kit взять или у меня заказать =)
Из готовых вроде бы этот самый такой, подешевле, не без багов, правда.
Re: перехват открытия файла в определённой директории
Здравствуйте, squid_etc, Вы писали:
_>добрый день!
_>есть указанная директория под осью Win7(и выше), например D:/123. _>в этой папке лежит документ MS Word(1.doc), и файлик notepad(1.txt).
_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.
_>это не вирус(хотя звучит как-то подозрительно) — я просто хочу обрабатывать все открываемые файлы в этой папке перед открытием системой.
_>Спасибо!
Если без Кернела хотите обойтись, можно сделать инжект длл-ки во все процессы, хотя если известно наверняка что пользователь юзает только Explorer, то можно обойтись и им. И делать хуки на ф-ции работы с файлами: ShellExecute и CreateFile.
Тоже способ, так себе
Re: перехват открытия файла в определённой директории
Здравствуйте, squid_etc, Вы писали:
_>добрый день!
_>есть указанная директория под осью Win7(и выше), например D:/123. _>в этой папке лежит документ MS Word(1.doc), и файлик notepad(1.txt).
_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.
_>это не вирус(хотя звучит как-то подозрительно) — я просто хочу обрабатывать все открываемые файлы в этой папке перед открытием системой.
_>Спасибо!
Здравствуйте, saf_e, Вы писали:
_>Если без Кернела хотите обойтись, можно сделать инжект длл-ки во все процессы, хотя если известно наверняка что пользователь юзает только Explorer, то можно обойтись и им. И делать хуки на ф-ции работы с файлами: ShellExecute и CreateFile.
_>Тоже способ, так себе
Это очень понравится антивирусу. Один нормальный вариант — драйвер-фильтр ФС.
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, saf_e, Вы писали:
_>>Если без Кернела хотите обойтись, можно сделать инжект длл-ки во все процессы, хотя если известно наверняка что пользователь юзает только Explorer, то можно обойтись и им. И делать хуки на ф-ции работы с файлами: ShellExecute и CreateFile.
_>>Тоже способ, так себе
BE>Это очень понравится антивирусу. Один нормальный вариант — драйвер-фильтр ФС.
Нормальный для того кто уже знаком с кернелом, для юного падавана этот путь тернист и труден
С антивирусом можно и договориться. Как софт для паблика этот подход не годится, а как home-made вполне себе.
Re[3]: перехват открытия файла в определённой директории
мне не хватает в нём только мониторинга открытия файлов. и чтобы найти предложенное Вами решение мне понадобилось поискать по следующим словам monitor open files windows
как я понял — в предложенном примере: создаётся HookAPI.dll, метод которой вешает хук на все процессы в системе и при использовании любым из процессов методов CreateProcess(), OpenProcess(), CreateFile(), CloseHandle(), and WriteFile() — над файлами системы. мы их перехватываем и обрабатываем.
ВОПРОС1: правильно ли это в принципе? — в смысле вешать хук на ВСЕ процессы системы? — а если я открою Far после запуска нашего приложения и Far-ом открою файлик. Или Far открывает файлы эксплорером, в конечном итоге?
ВОПРОС2: кто-то делал такое?, т.к. солюшена в этом примере нету)) или любой похожий код?
Спасибо!
Re[3]: перехват открытия файла в определённой директории
ReadDirectoryChanges это спец. Win API ф-ция, аналога для других операций нет.
_>ВОПРОС1: правильно ли это в принципе? — в смысле вешать хук на ВСЕ процессы системы? — а если я открою Far после запуска нашего приложения и Far-ом открою файлик. Или Far открывает файлы эксплорером, в конечном итоге?
Вам нужно определится что вам нужно, перехватывать все или только explorer/far/...
Re[4]: перехват открытия файла в определённой директории
Здравствуйте, saf_e, Вы писали:
_>Здравствуйте, squid_etc, Вы писали:
_>>для мониторинга любых изменений с файлами я нашел этот хороший пример — в коде не копался, но как работают бинарники мне понравилось _>>http://www.codeproject.com/Articles/950/CDirectoryChangeWatcher-ReadDirectoryChangesW-all
_>>мне не хватает в нём только мониторинга открытия файлов.
_>ReadDirectoryChanges это спец. Win API ф-ция, аналога для других операций нет.
у меня есть как раз вопрос по этой функции ReadDirectoryChangesW
в документации написано что параметр dwNotifyFilter [in] может принимать флаг FILE_NOTIFY_CHANGE_LAST_ACCESS
0x00000020
Any change to the last access time of files in the watched directory or subtree causes a change notification wait operation to return.
на открытие она и не должна срабатывать? — она мне не поможет? — я правильно понял?
_>>ВОПРОС1: правильно ли это в принципе? — в смысле вешать хук на ВСЕ процессы системы? — а если я открою Far после запуска нашего приложения и Far-ом открою файлик. Или Far открывает файлы эксплорером, в конечном итоге? _>Вам нужно определится что вам нужно, перехватывать все или только explorer/far/...
мне нужно перехватывать все. на сколько я понимаю — все равно большинство открытий переадресовывается эксплореру.
Здравствуйте, squid_etc, Вы писали:
_>итак остался один вопрос открытым _>ВОПРОС2: как перехватить открытие(закрытие) файла? самым простым и рабочим способом? (не хочется писать длл-ку)
1) Внедриться в оболочку (explorer.exe), "легально", через какой-нибудь shell extension, или
"грязно", через инжект или оконный хук, и поставить перехватчик на CreateFile.
Плюсы: максимально простой способ, можно обойтись только функциями Win32 API, без
недокументированных возможностей, native api или использования драйверов.
Минусы: будут перехватываться только открытия файлов из Проводника.
2) Внедриться в оболочку и перехватить не только CreateFile, но и CreateProcess, после чего
появится определенный контроль над приложениями, запускаемыми пользователем (так как все они
так или иначе "наследуются" от explorer.exe). В каждом запускаемом приложении снова патчится
CreateFile и CreateProcess и так далее, на произвольную глубину запусков. То есть, перехватчик
CreateFile отслеживает открытие файла пользователем, а перехватчик CreateProcess распостраняет
эту "заразу" на дочерние процессы. По такому принципу, кстати, работают некоторые программы
скрытия файлов и папок.
Плюсы: большее, по сравнению с предыдущим способом, покрытие.
Минусы: написать качественный API-перехватчик довольно сложно (патч таблицы импорта не
универсален, а сплайсинг требует дизассемблера длин инструкций, хотя в данном случае
это решаемо, так как перехватываются лишь две функции), способ не будет работать для
служб и других процессов, запускаемых не проводником. Например, для COM-серверов в exe.
Также возможны различные конфликты с системой безопасности Windows и со сторонним софтом.
А еще существуют процессы, защищенные протекторами, где поставить перехват API-функций
довольно затруднительно, а также всякие виртуальные машины...
3) Установить глобальный перехват на CreateFile, для всех запускаемых процессов.
Еще более универсальный, но вместе с тем и более сложный способ. Основная трудность здесь именно в
отслеживании запуска новых процессов и установке в них перехватчика. Напомню, что AppInit_DLLs на
Windows 7 и выше по умолчанию отключен, к тому же dll аттачится только к GUI-процессам, запущенным
на сопостовимом с explorer.exe уровнем целостности, так что оконные хуки — очень ограниченный в
данном случае вариант. Вырисовывается схема с привелегированным процессом (LocalSystem ?), который
бы отслеживал запуск новых процессов (как ?) и патчил бы в них точку входа в CreateFile.
Плюсы: покрытие, близкое к максимальному.
Минусы: к минусам, описанным в предыдущем пункте, добавляется сложность отслеживания запуска
новых процессов из user mode.
4) Пропатчить NtCreateFile в таблице системных сервисов (SSDT hook).
Вариация предыдущего способа. Технически сопоставим по сложности.
Плюсы: не требует возни со сплайсингом/патчингом таблиц импорта, очень высокое покрытие.
Минусы: требует написания драйвера, не работает на 64-битных версиях Windows, требует знания индекса
NtCreateFile в таблице системных сервисов, который от версии к версии меняется, возможны конфликты со
сторонним софтом, которые приводят уже не просто к падению приложения, а к "синему экрану".
5) Фильтр файловой системы.
Наиболее универсальный и мощный способ. За основу берется сэмпл sfilter из WDK.
Плюсы: стопроцентное покрытие. Перехватываются открытия файлов на любых дисках, включая
съемные и виртуальные диски, сетевые шары и т.п.
Минусы: относительно высокая сложность реализации, необходимость цифровой подписи для
запуска драйвера на 64-битных версиях Windows от Vista и выше.
Re[6]: перехват открытия файла в определённой директории
Здравствуйте, okman, Вы писали:
O>5) Фильтр файловой системы. O>Наиболее универсальный и мощный способ. За основу берется сэмпл sfilter из WDK.
O>Плюсы: стопроцентное покрытие. Перехватываются открытия файлов на любых дисках, включая O>съемные и виртуальные диски, сетевые шары и т.п.
O>Минусы: относительно высокая сложность реализации, необходимость цифровой подписи для O>запуска драйвера на 64-битных версиях Windows от Vista и выше.
Или вот этот блог — http://x64blog.name/
Кстати, автор обитает на RSDN, и если просто почитать его сообщения, можно найти массу
исключительно ценных замечаний.
Re[6]: перехват открытия файла в определённой директории
Здравствуйте, x64, Вы писали:
O>>За основу берется сэмпл sfilter из WDK.
x64>Хорошо всё написал. x64>Только почему sfilter? x64>Тем более его в новых WDK нету. x64>Для новичка и по-быстрому лучше минифильтры.
Здраствуйте.
как раз хотел писать о том, что не нашел примера sfilter в
C:\Program Files (x86)\Windows Kits\8.0
если из минифильтров — то какой пример посоветуете, чтобы его можно было пощупать — и понять принцип работы и перехватов?
как раз дочитываю Вашу статью файловые фильтры и что делать с Altitude, про которые говорил okman? — в принципе попросить его у майкрософта не проблема — мне обещали с этим помочь.
Re[8]: перехват открытия файла в определённой директории
_>если из минифильтров — то какой пример посоветуете...
Для начала — nullFilter, этот вообще ничего не делает полезного.
Затем passThrough — этот тоже ничего не делает, но зато есть колбеки.
Потом переходи к minispy — тут уже и работа с именами, и взаимодействие с приложением.
_>...что делать с Altitude...
Для тестов — использовать любой понравившийся.
_>в принципе попросить его у майкрософта не проблема...
В таком случае, лучше это сделать, во избежание коллизий.