Здравствуйте всем!
Возникла следующая ситуация:
имеется драйвер-фильтр, который я хочу открыть в приложении с помощью функции
m_hDriver = CreateFile(
IPM_SYMBOLIC_DRIVER_NAME,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);
Если приложение работает под админом — все отлично. Как только запускаю приложение
под пользователем без прав админа, при открытии драйвера появляется ошибка access denied.
В связи с этим хотелось бы спросить у участников форума, возможно ли открытие драйвера под user-ом
с помощью CreateFile. Может быть помогут некие манипуляции с параметром LPSECURITY_ATTRIBUTES, который сейчас NULL.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте всем! А>Возникла следующая ситуация: А>имеется драйвер-фильтр, который я хочу открыть в приложении с помощью функции А> m_hDriver = CreateFile( А> IPM_SYMBOLIC_DRIVER_NAME, А> GENERIC_READ | GENERIC_WRITE, А> 0, А> NULL, А> OPEN_EXISTING, А> 0, А> NULL А> );
А>Если приложение работает под админом — все отлично. Как только запускаю приложение А>под пользователем без прав админа, при открытии драйвера появляется ошибка access denied.
А>В связи с этим хотелось бы спросить у участников форума, возможно ли открытие драйвера под user-ом А>с помощью CreateFile. Может быть помогут некие манипуляции с параметром LPSECURITY_ATTRIBUTES, который сейчас NULL.
Про общий случай и конкретно про драйвер-фильтр не скажу, но сам я однажды столкнулся с такой же задачей, когда дорабатывал для себя FileDisk: захотелось, чтобы монтировать диски мог кто угодно, а не только админ. Всё точно так же упёрлось в невозможность открытия устройства. Я заменил в коде драйвера вызов создания устройства IoCreateDevice на IoCreateDeviceSecure, подсунув ему соответствующим образом настроенный набор разрешающих привилегий, — всё сразу заработало.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте всем! А>Возникла следующая ситуация: А>имеется драйвер-фильтр, который я хочу открыть в приложении с помощью функции А> m_hDriver = CreateFile( А> IPM_SYMBOLIC_DRIVER_NAME, А> GENERIC_READ | GENERIC_WRITE, А> 0, А> NULL, А> OPEN_EXISTING, А> 0, А> NULL А> );
А>Если приложение работает под админом — все отлично. Как только запускаю приложение А>под пользователем без прав админа, при открытии драйвера появляется ошибка access denied.
А>В связи с этим хотелось бы спросить у участников форума, возможно ли открытие драйвера под user-ом А>с помощью CreateFile. Может быть помогут некие манипуляции с параметром LPSECURITY_ATTRIBUTES, который сейчас NULL.
Один вопрос — а драйвер управляется через то же самое устройство (DEVICE_OBJECT), которое
цепляется к стеку, или же для этого сделаны отдельные устройства ?
O>Один вопрос — а драйвер управляется через то же самое устройство (DEVICE_OBJECT), которое O>цепляется к стеку, или же для этого сделаны отдельные устройства ?
Поясню свой вопрос.
Дело в том, что диспетчер ввода-вывода посылает IRP верхнему устройству в стеке.
Если Ваш фильтр сидит ниже него, управляющие сигналы будут приходить не напрямую, а после
обработки устройствами, находящимися сверху. Даже если вы открываете свой фильтр по
символьной ссылке, управляющий код IRP_MJ_CREATE сначала получит верхнее устройство стека,
и лишь потом он дойдет до фильтра. Причем еще не факт, что дойдет — устройство, находящееся
выше, запросто может блокировать запросы, идущие от недоверенных процессов.
Или быть создано в экслюзивном режиме, как это имеет место с клавиатурой и мышью.
Рецепт тут такой — создать второе устройство, специально для управления фильтром.
Его к стеку цеплять не нужно. Этому устройству следует присвоить символьную ссылку, и
тогда открывать его можно будет везде и всегда, если только Вы не пожелаете обратного.
А>имеется драйвер-фильтр, который я хочу открыть в приложении с помощью функции А> m_hDriver = CreateFile( А>Если приложение работает под админом — все отлично. Как только запускаю приложение А>под пользователем без прав админа, при открытии драйвера появляется ошибка access denied.
Ну тут одно из двух — или драйвер создал девайс IoCreateDeviceSecure'ом и передал там SECURITY_DESCRIPTOR согласно которому у вас к нему нет доступа или в IRP_MJ_CREATE делает какието свои секурити чеки с аналогичным результатом.
В первом случае открываете девайс и зовете GetKernelObjectSecurity и анализируете его DACL, или просто глядите nt!_DEVICE_OBJECT::SecurityDescriptor этого девайса в Windbg, но это чисто любопытства ради — раз низзя значит низзя и ниче вы с этим уже не сделаете.
А во втором — смотрите логику обработки IRP_MJ_CREATE на предмет наличия уязвимостей
А>с помощью CreateFile. Может быть помогут некие манипуляции с параметром LPSECURITY_ATTRIBUTES, который сейчас NULL.
Не помогут.
Как много веселых ребят, и все делают велосипед...
Re: Возможно ли открыть драйвер из-под user-а
От:
Аноним
Дата:
11.03.12 13:49
Оценка:
Я имею дело с Ndis IM Driver, RegisterDevice осуществляется так:
Status = NdisMRegisterDevice(m_Handle, "\\Device\\", "\\DosDevices\\", &MajorFunction[0], &pDeviceObject, &m_pNdisDeviceHandle);
Это что за ересь?!
Имя девайса, имя ссылки где?
Русским языком же написано в священном писании:
DeviceName [in]
Pointer to an NDIS_STRING type containing a null-terminated Unicode string that names the device object. The string must be a full-path name--for example, \Device\DeviceName. For Windows 2000 and later, NDIS defines the NDIS_STRING type as a UNICODE_STRING type.
Я так понимаю тут кое чего не хватает в строках, ну да ладно.
Проверьте на предмет существования значения Security в ключе "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DriverName\Security"
Если оно там есть — это security descriptor для этого драйвера self-relative формате.
..Но проще тупо глянуть в windbg
Как много веселых ребят, и все делают велосипед...
Вот здесь у человека подобная проблема: http://www.winvistatips.com/user-application-not-able-open-ndis-im-driver-t194216.html.
> Hi, > I have developped NDIS IM driver. I am facing one problem with driver. > Sometimes, Driver gets installed but If user land test application is not > able to > open Driver handle. I have to restart the system the everything works fine.. > > Please suggset me how to look this problem.
И в качестве решения предлагают следующее:
Well, you start by finding out why the open failed...
Handles don't just "fail to open". They fail for a reason. Typically
you can use the GetLastError function to find out the reason.
With the reason in hand you go forward. If it is an access denied
error, study about permissions.
...