перехват открытия файла в определённой директории
От: squid_etc  
Дата: 22.04.13 14:20
Оценка:
добрый день!

есть указанная директория под осью Win7(и выше), например D:/123.
в этой папке лежит документ MS Word(1.doc), и файлик notepad(1.txt).

нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.

это не вирус(хотя звучит как-то подозрительно) — я просто хочу обрабатывать все открываемые файлы в этой папке перед открытием системой.

Спасибо!
Re: перехват открытия файла в определённой директории
От: BlackEric http://black-eric.lj.ru
Дата: 22.04.13 14:35
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>добрый день!


_>есть указанная директория под осью Win7(и выше), например D:/123.

_>в этой папке лежит документ MS Word(1.doc), и файлик notepad(1.txt).

_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.


_>это не вирус(хотя звучит как-то подозрительно) — я просто хочу обрабатывать все открываемые файлы в этой папке перед открытием системой.


_>Спасибо!


Драйвер писать придется.
https://github.com/BlackEric001
Re[2]: перехват открытия файла в определённой директории
От: squid_etc  
Дата: 22.04.13 15:20
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Драйвер писать придется.


обнадёжило
а можно поподробнее и если есть — то с примерами.
еще раз спасибо!
Re: перехват открытия файла в определённой директории
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 22.04.13 16:01
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.


А если не пользователем а программой? Ну антивирь туда полезет, тогда что?
Если и это отслеживать — нужно внедрятся очень глубоко, т.к. файлик можно открыть многими вызовами WinAPI, которые не ограничиваюся CreateFile().

А в простейшем случае можно наверно обойтись перенаправлением ассоциаций файлов на себя с последующим вызовом нужного приложения (если файл таки можно/нужно открыть) уже из-под своей проги.
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re: перехват открытия файла в определённой директории
От: x64 Россия  
Дата: 22.04.13 19:14
Оценка:
_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.

Необходимо написать драйвер-фильтр файловой системы.
Если самому не охота, можно готовый kit взять или у меня заказать =)
Из готовых вроде бы этот самый такой, подешевле, не без багов, правда.
Re: перехват открытия файла в определённой директории
От: saf_e  
Дата: 23.04.13 09:23
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>добрый день!


_>есть указанная директория под осью Win7(и выше), например D:/123.

_>в этой папке лежит документ MS Word(1.doc), и файлик notepad(1.txt).

_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.


_>это не вирус(хотя звучит как-то подозрительно) — я просто хочу обрабатывать все открываемые файлы в этой папке перед открытием системой.


_>Спасибо!


Если без Кернела хотите обойтись, можно сделать инжект длл-ки во все процессы, хотя если известно наверняка что пользователь юзает только Explorer, то можно обойтись и им. И делать хуки на ф-ции работы с файлами: ShellExecute и CreateFile.

Тоже способ, так себе
Re: перехват открытия файла в определённой директории
От: saf_e  
Дата: 23.04.13 09:27
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>добрый день!


_>есть указанная директория под осью Win7(и выше), например D:/123.

_>в этой папке лежит документ MS Word(1.doc), и файлик notepad(1.txt).

_>нужно кодом перехватить событие открытия этих документов пользователем(чтобы, например, отменить открытие). юзер кликает 2 раза по фалику, а файлик так и не открывается.


_>это не вирус(хотя звучит как-то подозрительно) — я просто хочу обрабатывать все открываемые файлы в этой папке перед открытием системой.


_>Спасибо!


Кстати вот, б/м готовое решение:

http://www.codeproject.com/Articles/30537/Windows-File-Monitoring-System-Using-Windows-API-H
Re[2]: перехват открытия файла в определённой директории
От: BlackEric http://black-eric.lj.ru
Дата: 23.04.13 09:27
Оценка:
Здравствуйте, saf_e, Вы писали:

_>Если без Кернела хотите обойтись, можно сделать инжект длл-ки во все процессы, хотя если известно наверняка что пользователь юзает только Explorer, то можно обойтись и им. И делать хуки на ф-ции работы с файлами: ShellExecute и CreateFile.


_>Тоже способ, так себе


Это очень понравится антивирусу. Один нормальный вариант — драйвер-фильтр ФС.
https://github.com/BlackEric001
Re[3]: перехват открытия файла в определённой директории
От: saf_e  
Дата: 23.04.13 09:29
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, saf_e, Вы писали:


_>>Если без Кернела хотите обойтись, можно сделать инжект длл-ки во все процессы, хотя если известно наверняка что пользователь юзает только Explorer, то можно обойтись и им. И делать хуки на ф-ции работы с файлами: ShellExecute и CreateFile.


_>>Тоже способ, так себе


BE>Это очень понравится антивирусу. Один нормальный вариант — драйвер-фильтр ФС.


Нормальный для того кто уже знаком с кернелом, для юного падавана этот путь тернист и труден

С антивирусом можно и договориться. Как софт для паблика этот подход не годится, а как home-made вполне себе.
Re[3]: перехват открытия файла в определённой директории
От: wildwind Россия  
Дата: 25.04.13 07:15
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Это очень понравится антивирусу. Один нормальный вариант — драйвер-фильтр ФС.


Добиться того, чтобы понравился драйвер, IMHO не менее сложно. Дешевле пересмотреть постановку задачи.
Re[2]: перехват открытия файла в определённой директории
От: squid_etc  
Дата: 29.04.13 13:34
Оценка:
Здравствуйте, saf_e, Вы писали:

_>Кстати вот, б/м готовое решение:


_>http://www.codeproject.com/Articles/30537/Windows-File-Monitoring-System-Using-Windows-API-H


действительно похоже на него(решение с использованием Win API без написания драйвера).

для мониторинга любых изменений с файлами я нашел этот хороший пример — в коде не копался, но как работают бинарники мне понравилось
http://www.codeproject.com/Articles/950/CDirectoryChangeWatcher-ReadDirectoryChangesW-all

мне не хватает в нём только мониторинга открытия файлов. и чтобы найти предложенное Вами решение мне понадобилось поискать по следующим словам
monitor open files windows

как я понял — в предложенном примере: создаётся HookAPI.dll, метод которой вешает хук на все процессы в системе и при использовании любым из процессов методов CreateProcess(), OpenProcess(), CreateFile(), CloseHandle(), and WriteFile() — над файлами системы. мы их перехватываем и обрабатываем.

ВОПРОС1: правильно ли это в принципе? — в смысле вешать хук на ВСЕ процессы системы? — а если я открою Far после запуска нашего приложения и Far-ом открою файлик. Или Far открывает файлы эксплорером, в конечном итоге?

ВОПРОС2: кто-то делал такое?, т.к. солюшена в этом примере нету)) или любой похожий код?

Спасибо!
Re[3]: перехват открытия файла в определённой директории
От: saf_e  
Дата: 29.04.13 13:42
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>для мониторинга любых изменений с файлами я нашел этот хороший пример — в коде не копался, но как работают бинарники мне понравилось

_>http://www.codeproject.com/Articles/950/CDirectoryChangeWatcher-ReadDirectoryChangesW-all

_>мне не хватает в нём только мониторинга открытия файлов.


ReadDirectoryChanges это спец. Win API ф-ция, аналога для других операций нет.

_>ВОПРОС1: правильно ли это в принципе? — в смысле вешать хук на ВСЕ процессы системы? — а если я открою Far после запуска нашего приложения и Far-ом открою файлик. Или Far открывает файлы эксплорером, в конечном итоге?


Вам нужно определится что вам нужно, перехватывать все или только explorer/far/...
Re[4]: перехват открытия файла в определённой директории
От: squid_etc  
Дата: 29.04.13 14:32
Оценка:
Здравствуйте, 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/...

мне нужно перехватывать все. на сколько я понимаю — все равно большинство открытий переадресовывается эксплореру.


еще нашел полезный флаг для мониторинга сохранения файла согласно коду
http://msdn.microsoft.com/en-us/library/aa365261%28VS.85%29.aspx
нулевой хэндл нужно описать со следующим флагом
   dwChangeHandles[0] = FindFirstChangeNotification( 
      lpDir,                         // directory to watch 
      FALSE,                         // do not watch subtree 
      FILE_NOTIFY_CHANGE_LAST_WRITE); // watch file saves

(пример http://www.codeproject.com/Articles/950/CDirectoryChangeWatcher-ReadDirectoryChangesW-all этого не ловит)

итак остался один вопрос открытым
ВОПРОС2: как перехватить открытие(закрытие) файла? самым простым и рабочим способом? (не хочется писать длл-ку)
Re[5]: перехват открытия файла в определённой директории
От: okman Беларусь https://searchinform.ru/
Дата: 29.04.13 15:32
Оценка: 7 (2)
Здравствуйте, 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]: перехват открытия файла в определённой директории
От: squid_etc  
Дата: 29.04.13 15:37
Оценка:
Здравствуйте, okman, Вы писали:

Спасибо Большое за аргументированный и такой детализированный ответ!
еще буду перечитывать ваш пост и обдумывать варианты.
Спасибо!
Re[6]: перехват открытия файла в определённой директории
От: squid_etc  
Дата: 29.04.13 21:51
Оценка: 6 (1)
Здравствуйте, okman, Вы писали:

O>5) Фильтр файловой системы.

O>Наиболее универсальный и мощный способ. За основу берется сэмпл sfilter из WDK.

O>Плюсы: стопроцентное покрытие. Перехватываются открытия файлов на любых дисках, включая

O>съемные и виртуальные диски, сетевые шары и т.п.

O>Минусы: относительно высокая сложность реализации, необходимость цифровой подписи для

O>запуска драйвера на 64-битных версиях Windows от Vista и выше.

SimRep File System Minifilter Driver
http://code.msdn.microsoft.com/windowshardware/SimRep-File-System-9a4e2206
я так понимаю это именно тот пример что мне надо.

а это ссылка на все сэмплы — для истории.
Windows hardware development samples
http://code.msdn.microsoft.com/windowshardware
Re[7]: перехват открытия файла в определённой директории
От: okman Беларусь https://searchinform.ru/
Дата: 30.04.13 06:43
Оценка: 3 (1)
Здравствуйте, squid_etc, Вы писали:

_>SimRep File System Minifilter Driver

_>http://code.msdn.microsoft.com/windowshardware/SimRep-File-System-9a4e2206
_>я так понимаю это именно тот пример что мне надо.

Обычно при разработке FS-фильтров встает вопрос — какую технологию использовать ?
Эту — http://msdn.microsoft.com/en-us/library/windows/hardware/gg462968.aspx
или эту — http://msdn.microsoft.com/en-us/library/windows/hardware/ff540402(v=vs.85).aspx

sfilter, на который я ссылался и который можно найти в WDK 6000, принадлежит к первому типу,
SimRep — ко второму.

Технически, минифильтры проще и имеют ряд дополнительных возможностей, но для драйверов
данного типа нужно заказывать у Microsoft т.н. Altitude, для присваивания драйверу позиции в стеке.
Подробности здесь: https://connect.microsoft.com/site882/content/content.aspx?ContentID=26481

Вообще, есть ведь поиск... MSDN, RSDN, OsrOnline, WASM...
Гугл, например, быстро находит вот эту обучающую статью с примером:
http://www.codeproject.com/Articles/43586/File-System-Filter-Driver-Tutorial

Или вот этот блог — http://x64blog.name/
Кстати, автор обитает на RSDN, и если просто почитать его сообщения, можно найти массу
исключительно ценных замечаний.
Re[6]: перехват открытия файла в определённой директории
От: x64 Россия  
Дата: 30.04.13 13:09
Оценка:
O>За основу берется сэмпл sfilter из WDK.

Хорошо всё написал.
Только почему sfilter?
Тем более его в новых WDK нету.
Для новичка и по-быстрому лучше минифильтры.
Re[7]: перехват открытия файла в определённой директории
От: squid_etc  
Дата: 30.04.13 13:24
Оценка:
Здравствуйте, x64, Вы писали:

O>>За основу берется сэмпл sfilter из WDK.


x64>Хорошо всё написал.

x64>Только почему sfilter?
x64>Тем более его в новых WDK нету.
x64>Для новичка и по-быстрому лучше минифильтры.

Здраствуйте.

как раз хотел писать о том, что не нашел примера sfilter в
C:\Program Files (x86)\Windows Kits\8.0

если из минифильтров — то какой пример посоветуете, чтобы его можно было пощупать — и понять принцип работы и перехватов?
как раз дочитываю Вашу статью файловые фильтры и что делать с Altitude, про которые говорил okman? — в принципе попросить его у майкрософта не проблема — мне обещали с этим помочь.
Re[8]: перехват открытия файла в определённой директории
От: x64 Россия  
Дата: 30.04.13 16:12
Оценка:
_>если из минифильтров — то какой пример посоветуете...

Для начала — nullFilter, этот вообще ничего не делает полезного.
Затем passThrough — этот тоже ничего не делает, но зато есть колбеки.
Потом переходи к minispy — тут уже и работа с именами, и взаимодействие с приложением.

_>...что делать с Altitude...


Для тестов — использовать любой понравившийся.

_>в принципе попросить его у майкрософта не проблема...


В таком случае, лучше это сделать, во избежание коллизий.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.