Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Запрет доступа к каталогу |
Автор: KAlex1 18.10.2009, 00:57 |
Доброго времени суток, уважаемые коллеги! Занимаюсь решением вопроса программного запрета доступа к каталогу. Поделитесь, пожалуйста, идеями о том каким способом этого можно достичь. Назначение прав доступа не подходит. И было бы неплохо узнать как запретить доступ не только из проводника, а и из фара. Заранее благодарен! |
Автор: bra1ny 18.10.2009, 21:11 |
Думаю правильнее всего будет написать драйвер фильтр фс. Фильтровать все IRP_MJ_CREATE и уже смотреть какой каталог открывается и предпринимать действия пропускать дальше или возврашать STATUS_ACCESS_DENIED например. |
Автор: RapMan 18.10.2009, 22:53 |
думаю bra1ny прав, но добавлю что еще нужно фильтровать IRP_MJ_SET_INFORMATION иначе переименовать и удалить каталог будет можно |
Автор: KAlex1 20.10.2009, 23:18 |
Огромное спасибо за советы! Порыл в этом направлении, почитал на WASM. Я так понял что драйвера фильтра фс относятся к драйверам режима ядра. Скажи пожалуйста, вообще раеально этот драйвер написать на С, в MS Visual Studiо? или драйвера такого рода пишутся только на asm-e? |
Автор: xvr 21.10.2009, 12:38 |
Драйвера уже давно пишут на С (и даже на С++). Тебе нужен DDK или WDK |
Автор: KAlex1 25.10.2009, 22:35 |
А если это реализовать перехватом WinAPI функций, то, допустим из командной строки или при помощи фара, каталог будет доступен? xvr, благодарю за совет насчет WDK. WDK - мощнейший хелп) |
Автор: bra1ny 25.10.2009, 23:37 | ||
Если перехватите ту апишку с помощью которой программа обращается к каталогу , то нет. Но перехват апи не даст вам той "власти" нежели драйвер фильтр фс. Плюс к этому драйвер фильтр это документированный метод +) |
Автор: KAlex1 9.11.2009, 18:37 |
Кроме драйверов фильтов файловой системы (file system filter drivers), также существуют драйвера минифильтра (file system minifilter drivers). ) Я так понял, они проще в реализации, но возможно ли с их помощью запретить доступ к каталогу? Они ведь не предусматривают возврат такого полезного статуса как, например STATUS_ACCESS_DENIED. |
Автор: bra1ny 10.11.2009, 00:19 |
В чем проблема в реализации драйвера фильтра фс ? Покажите код поможем. |
Автор: KAlex1 10.11.2009, 00:50 |
Код...Если бы) Я сейчас нахожусь на стадии выбора: реализовывать ли драйвер фильтра, или драйвер минифильтра. WDK говорит что минифильтр проще в реализации и лучше работает. Но это ведь драйвер "минифильтра") Вот я и хочу понять какие тут подводные камни, всязи с этим и возник вопрос: предоставит ли мне драйвер минифильтра возможности необходимые для решения моего вопроса? То что драйвер фильтра способен мне помочь это понятно. |
Автор: Alca 10.11.2009, 10:22 | ||
|
Автор: KAlex1 10.11.2009, 12:42 |
The CreateFile function creates, opens, or truncates a file, COM port, device, service, or console. Похоже что с директориями эта функция не работает, и ктому же если ее реализовать в резидентной программе, то эту программу можно будет легко прервать. И как сказал bra1ny: это не даст вам той "власти" нежели драйвер фильтр. Поэтому я всеже буду ждать ответа на мой вопрос о драйверах минифильтра) |
Автор: SenkraD 10.11.2009, 12:58 |
KAlex1, а в сторону ACL (Access Controll Lists) не смотрел - http://support.microsoft.com/kb/102102 |
Автор: KAlex1 10.11.2009, 14:37 |
только что посмотрел, и понял что я уже далеко зашел в рассмотрении драйверов фильтра, и уже добью наверно их). я так понял, через ACL назначаются привилегий доступа, а это мне не совсем подходит. Благодарю за подсказку.Хорошая идея. Оставлю ее как запасной вариант) И всеже буду ждать ответа на мой вопрос о драйверах минифильтра) |
Автор: bra1ny 10.11.2009, 16:48 |
по поводу фильтра фс , советую изучить исходники файлмона(на васме есть). Ну и если решитесь , то по любому столкнетесь с фаст ио. Вот Вам почитать. |
Автор: KAlex1 10.11.2009, 19:32 |
Благодарю за док) Я думал что в WDK, fast I/O описываются достаточно, но если что обязательно воспользуюсь) Помоему в моем случае обработку фаст и/о делать не прийдется. Там достаточно будет поймать те IRP о которых говорилось ранее. К тому же к WDK прилогается пример драйвера минифильтра и должен прилогаться пример просто драйвера фильтра, но второго там почему-то нету, поэтому нужно всеголишь поискать в инете) |
Автор: bra1ny 10.11.2009, 22:37 | ||
если будите писать драйвер фильтр фс , То фаст ио придется обрабатывать по любому иначе систему нагнете =) Ну там все просто где-то так:
ну и тд. |
Автор: KAlex1 11.11.2009, 00:23 |
Да, в драйверах фильтра нужно было предусматривать обработчик фаст ио, даже если он ничего не должен делать, но он должен передать фаст ио следующему драйверу в стэке. А в драйверах минифильтра, обрабатываются только те сообщения которые нам нужны, а для остальных мы можем даже не предусматривать обработчики, все остальное там за нас делает filter manager) |
Автор: bra1ny 11.11.2009, 13:34 | ||
Ну пока вы там с минифильтрами маетесь , я по быстрому вам скелет написал ![]() Простой драйве фильтр фс , который запрещает доступ к каталогу Temp на диске С. После запуска стэк устройств выглядит где-то так:
![]() ![]() |
Автор: KAlex1 11.11.2009, 16:39 |
Благодарю Вас, bra1ny. Думаю Ваш код будет мне очень полезен) Буду надеяться, что после окончания ознакомления с документацией, я напишу свой драйвер с такой же скоростью что и Вы этот) |
Автор: Alca 11.11.2009, 16:59 | ||
А как драйвер установить? |
Автор: bra1ny 11.11.2009, 17:15 |
Полно программ. можете свою написать , через сервисы или NtLoadDriver. |
Автор: Alca 11.11.2009, 17:34 |
спасибо |
Автор: KAlex1 13.11.2009, 14:41 |
А Microsoft Visual Studio предоставляет какие-либо возможности, которые могут помочь в разработке драйверов? |
Автор: bra1ny 13.11.2009, 17:41 |
Эээ какие возможности вы имеете в виду?Как настроить студию чтобы там драйвера собирать? http://alter.org.ua/ru/docs/nt_kernel/vc6_proj/ http://alter.org.ua/ru/docs/nt_kernel/vc8_proj/ Еше на диске к книжке Уолтера Они есть мастер для построения проектов драйверов для студии. Сам использую 6 студию + визуал асист , собираю драйвера в build . Уже привык , и менять ничего не собираюсь. |
Автор: KAlex1 15.11.2009, 20:43 |
Посоветуйте пожалуйста, что удобнее всего использовать для отладки драйвера фильтра и вообще драйверов? Bra1ny, в вашем исходнике есть папка objchk_wxp_x86, скажите пожалуйста что это за папка, и как создаются файлы входящие в нее?) И еще, файлы makefile. и sources. создаются вручную? Я так понял, вы имеете ввиду что драйвера лучше компилировать build-oм которые входит в WDK? Вы про этот говорите или про какой-то другой? Для меня это все ново, поэтому приходиться уточнять)) |
Автор: bra1ny 16.11.2009, 00:14 | ||||||
Да , вручную.
Да , это эталонная сборка.
WinDbg. Так как перед тем , как у вас что-то заработает будет очень много синих экранов , советую поставить виртуальную машину. Вот инструкция как настроить виндебаг и вмварю для удаленной отладки. http://silverstr.ufies.org/lotr0/windbg-vmware.html |
Автор: KAlex1 25.11.2009, 19:04 |
Bra1ny, благодарю за совет насчет vmware и windbg. Настроил, отлаживаю... Настройка не легкая конечно) Подскажите пожалуйста как посмотреть стэк устройств и есть ли какая-нибудь возможность посмотреть через какие драйвера IRP прошло или какими обрабатывалось и какими не успело обработаться, потому что я в своем драйвере обработку IRP завершаю (complete an I/O operation) со статусом STATUS_ACCESS_DENIED, but никакого эффекта на систему это не оказывает, и в папку всеравно заходит. И скажите еще пожалуйста, какую группу (Load order group) присваивать драйверу? |
Автор: bra1ny 26.11.2009, 00:10 | ||||
стэк устройств можно посмотреть командой !devstack
Если с отладчиком не очень подружились вроде бы былая такая полезная штука как irptrace поищите.
Давайте код , посмотрим. |
Автор: KAlex1 26.11.2009, 00:14 | ||
Взгляните, пожалуйста.
|
Автор: bra1ny 26.11.2009, 02:02 |
FltCancelFileOpen? |
Автор: KAlex1 30.11.2009, 23:33 |
Спасибо за подсказку. В ВДК написано что команда FltCancelFileOpen используется в PostOperationCallBack процедурах. Во всяком случае она мне не пригодилась, ошибка оказалась в сравнении имен каталогов. Это я уже исправил. Разработка продвигается) ![]() Подскажите пожалуйста какую фунцкию использовать для динамического выделения памяти, под массив переменных определенного типа, в режиме ядра. Необходимо динамически выделить память под массив UNICODE_STRING-ов. И затем также выделить память под массив buffer каждой из структур UNICODE_STRING. |
Автор: bra1ny 1.12.2009, 00:46 |
ExAllocatePool(). Выбирать тип пула надо в зависимости от irql. Если работаете на уровне < DISPATCH_LEVEL тогда можно paged pool. С nonpaged пулом можно работать на любом irql, но надо помнить что это очень ценный ресурс ![]() |
Автор: KAlex1 3.12.2009, 18:49 | ||
Благодаря документации и Вам, bra1ny, мне стало ясно что необходимо использовать ExAllocatePoolWithTag. Но у меня возникла очередная проблема: выделяется всего 4 байта, при том что мне нужно 5120 байт. Из DriverEntry вызываю свою процедуру, и в ней уже происходит вызов ExAllocatePoolWithTag. Вначале подумал что IRQL не тот, попробовал вызвать ExAllocatePoolWithTag их самой DriverEntry, но всеравно выделяются только 4 байта, вместо желаемых 5120. Выделяю из PagedPool. IRQL DriverEntry является PASSIVE_LEVEL. Вот он код:
Буду рад, если у вас есть какие-нибудь идеи по этому поводу) |
Автор: xvr 3.12.2009, 20:38 | ||
|
Автор: bra1ny 3.12.2009, 22:40 | ||||||
Вы совершенно правы.
ExAllocatePool это "обертка" которая в свою очередь вызывает ExAllocatePoolWithTag с тэгом None. Ну это так для справки)) |
Автор: KAlex1 3.12.2009, 22:45 | ||
Я бы спал спокойно если бы мне функция ZwQueryValueKey не возвращала BufferTooSmall, при том что проверку я перед этим тоже делаю)) И дебаггер показывает в buffer не нулевой адрес.
|
Автор: xvr 3.12.2009, 22:54 | ||
|
Автор: KAlex1 9.12.2009, 22:34 |
Скажите пожалуйста, драйвера откомпилированные в Windows XP x86 build Enviroment будут работать на Win Xp x64, и на Windows 7? Я думал что должно быть какое-нибудь Windows XP x64 build Enviroment, но его нету, поэтому драйвера получается будут 32х-битные. |
Автор: bra1ny 9.12.2009, 23:11 | ||
на сколько помню можно 2003 x64 использовать , схожие архитектуры. |
Автор: KAlex1 9.12.2009, 23:58 |
А вообще, драйвера откомпилированные в Windows XP x86 build Enviroment будут работать на Win Xp x64, и на Windows 7? |
Автор: bra1ny 10.12.2009, 00:11 | ||
Вообще-то тоскают с собой драйвера для разных платформ. Для x86 отдельно , для x64 отдельно. |
Автор: KAlex1 20.12.2009, 17:15 |
Подскажите пожалуйста как настраивать MVS 2005 для создния user-mode application, которые смогли бы взаимодействовать с kernel-mode драйвером? |
Автор: smoke_man 20.12.2009, 18:07 |
В смысле настраивать? Создаешь приложение, а для работы с драйвером используешь следующие функции: CreateFile -> IRP_MJ_CREATE CloseHandle -> IRP_MJ_CLEANUP & IRP_MJ_CLOSE WriteFile -> IRP_MJ_WRITE ReadFile-> IRP_MJ_READ DeviceIoControl -> IRP_MJ_DEVICE_CONTROL |
Автор: KAlex1 20.12.2009, 18:38 |
Всмысле какие папки указывать в настройка, типа Additional library directories, возможно какие-нибудь настройки линковщика. ЧТо-то наподобии http://alter.org.ua/ru/docs/nt_kernel/vc8_proj/ вот этого, если такое вообще есть. Потому что я пробовал подключить .h файл с нужной мне функцией, указыв на него необходимые пути в настройках проекта, но всеравно при линковании ошибки. |
Автор: bra1ny 20.12.2009, 18:40 |
не понял что-то на что ругается линковщик? пример хидера пожалуйста. |
Автор: smoke_man 20.12.2009, 18:43 |
А что за ошибки? И если есть возможность - можешь показать h-файл? |
Автор: bra1ny 20.12.2009, 19:04 | ||
В ддк кстати есть пример как общаться с драйвером.
|
Автор: xvr 20.12.2009, 20:00 |
user-mode application не могут напрямую вызывать kernel-mode драйвера, только стандартными, определенными в Win32 API методами (их smoke_man уже перечислил) Т.ч. ничего специально настраивать не надо |
Автор: KAlex1 21.12.2009, 00:26 |
Для загрузки драйвера минифильтра используется функция FilterLoad (The FilterLoad function dynamically loads a minifilter driver into the system). Объявление содержится в fltuser.h, который входит в WDK. Ее мне и нужно вызывать. При компиляции выдается ошибка: c:\ddk\inc\ddk\fltuserstructures.h(22) : fatal error C1012: unmatched parenthesis : missing ')'. А ведь fltuserstructures.h является майрософтским файлом. Навсякий случай прикрепляю эти два файла. |
Автор: smoke_man 21.12.2009, 09:49 |
Посмотри http://www.osronline.com/showthread.cfm?link=104885 |
Автор: KAlex1 21.12.2009, 23:22 | ||||||||
Smoke_man, Благодарю за полезную ссылку. оттуда я вынес что нужно в include directories добавить еще C:\WDK\inc\api. Добавив это, ошибка сменилась на error C3861: 'FilterLoad': identifier not found. Хотя нужный fltuser.h подключен. FilterLoad это функция которую я вызываю. Я предпологаю, что это из-за того что не выполняется условие #if FLT_MGR_BASELINE, после которого в хедере идет объявление FilterLoad. Кусочек кода fltuser.h :
Вот на каких основаниях я пологаю что не выполняется условие #if FLT_MGR_BASELINE: Включив в C/C++ -> Preprocessor -> Generate Processed File - "With Line Numbers (/P)". На этапе компиляции я получаю кучу файлов .i И вставив в свой код вот такую вот проверку:
В .i файле я нахожу вот что:
Заменив проверку на :
В .i файле я такого не нахожу. Что говорит, о том что #if FLT_MGR_BASELINE не выполняется. Причем с включенной опцией C/C++ -> Preprocessor -> Generate Processed File - "With Line Numbers (/P)". Мне выдает ошибку что cannot open file '.\Debug\stdafx.obj'. Т.е. этого файла просто нет. Но это неважно потому что если откулючить эту опцию, то такой ошибки не возникает. Система WINXP SP3. Есть ли у кого-нибудь идеи почему не выполняется #if FLT_MGR_BASELINE? |
Автор: smoke_man 21.12.2009, 23:57 | ||
А если добавить:
|
Автор: KAlex1 22.12.2009, 00:21 |
К той ошибке что была \usermodeapp1\usermodeapp1dlg.cpp(288) : error C3861: 'FilterLoad': identifier not found добавляется вот это: warning C4005: 'WINVER' : macro redefinition ...\usermodeapp1\stdafx.h(18) : see previous definition of 'WINVER' ....\usermodeapp1\usermodeapp1dlg.cpp(20) : warning C4005: '_WIN32_WINNT' : macro redefinition ....\usermodeapp1\stdafx.h(22) : see previous definition of '_WIN32_WINNT' ...\usermodeapp1\usermodeapp1dlg.cpp(21) : warning C4005: 'NTDDI_VERSION' : macro redefinition c:\ddk\inc\api\sdkddkver.h(203) : see previous definition of 'NTDDI_VERSION' |
Автор: bra1ny 22.12.2009, 00:47 |
скомпильте build'ом. |
Автор: KAlex1 22.12.2009, 01:04 |
У меня user-mode приложение содержит окно созданное при помощи классов MFC. Скомпилит ли build в этом случае? Я себе не совсем представляю как буду выглядеть файлы sources. и makefile. ) |
Автор: xvr 22.12.2009, 13:21 |
Проверь как определен NTDDI_VERSION (в \ddk\inc\api\sdkddkver.h) Он должен быть или NTDDI_VISTA, а для XP должен быть сервис пак не ниже 2 |
Автор: bra1ny 22.12.2009, 14:27 | ||
понятно) Я просто ради интереса скомпилил пример scanner из ддк(юзермодную часть) , которая использует FilterLoad(). Посмотрите файл sources к ней. |
Автор: bra1ny 24.12.2009, 22:11 |
А почему бы просто не подгрузить(GetProcAddress) fltlib.dll и Вызвать FilterLoad. |
Автор: KAlex1 26.12.2009, 14:26 |
я думаю, динамически вызывать FilterLoad не пойдет, потому что если бы ее можно было вызывать когда угодно, то в хедере не было бы всяких условий. Попробую скомпилить build-oм. |
Автор: bra1ny 26.12.2009, 14:45 | ||
Я бы так сделал) |
Автор: bra1ny 27.12.2009, 03:37 | ||||
И так можете меня считать извращенцем )) Но я разреверсил FilterLoad и написал свой аналог)) Кратко Говоря вызов FilterLoad сводится к NtDeviceIoControlFile на FltMgr. Посылается структура 2 байта + строка.
Ну вот мой пример(тестил на примере из ддк (scanner) ).
![]() |
Автор: xvr 27.12.2009, 12:14 |
А теперь выйдет очередной SP к Винде, или программу запустят на другой Винде, и MAGIC_IOCTL изменится, или _tagLOAD поменяется, и все, приплыли ![]() |
Автор: bra1ny 27.12.2009, 14:36 | ||
Да это все понятно) Это так чисто интерес в 4 утра) |
Автор: KAlex1 28.12.2009, 15:45 |
bra1ny, интерес как раз для 4х утра)) Если кто желает поиграться драйвером) Пожалуйста. юзер-мод приложение незаконченное немного. |
Автор: bra1ny 28.12.2009, 20:07 |
У меня ничего не заработало))) |
Автор: KAlex1 28.12.2009, 20:50 |
Вначеле драйвер устанавливаете при помощи .inf файла. Затем запускате прогу выбираете папки для блокирования. После того как выбрали. Нажимаете "Заблокировать". После нажимаете "Load". Если изменяете список папок, вначале нажмите "Unload". Потом ""Заблокировать" и потом "Load". |
Автор: bra1ny 28.12.2009, 22:37 |
а вот в чем фишка) Надо сначала указать папки, а потом load =) |
Автор: KAlex1 28.1.2010, 22:52 |
Вопрос считаю, на определенном уровне, решенным. Благодарю за полезные советы! ![]() |
Автор: Heal 22.4.2011, 16:39 |
Здравствуйте. Я написал программу, которая запрещает/разрешает доступ к каталогу на уровне прав доступа. Я так понимаю, что это не эффективно, т.к. можно вручную снять это ограничение. Про читая ваши посты, я понял, что драйвер получается ниже и так просто ограничение не снимешь. Подскажите какую информация мне посмотреть, что бы написать такой же драйвер и можно ли его написать на Builder'e 6? |
Автор: xvr 23.4.2011, 07:50 | ||
DDK/WDK в MSDN на MS Нет |
Автор: Heal 23.4.2011, 13:13 |
Спасибо. Т е его надо собирать в Visual studio, которая заточена на сбор драйвера??? |
Автор: Heal 24.4.2011, 16:04 |
Нубский вопрос, но все таки задам - там в чем его собирать? ![]() |
Автор: bra1ny 24.4.2011, 18:04 |
build' ом |
Автор: KAlex1 31.5.2012, 20:51 |
выкладываю сорцы(со вспомогательными проектами) 3х летней давности) может быть кому-нибудь будет полезно, для общего развития. помню что за этот курсовой получил твердую 5, и всем студентам того же желаю. Благодарю всех, кто принимал участие, и подсказывал. Особенно bra1ny и xvr. |