Возможно ли открыть драйвер из-под user-а
От: Аноним  
Дата: 06.03.12 14:42
Оценка:
Здравствуйте всем!
Возникла следующая ситуация:
имеется драйвер-фильтр, который я хочу открыть в приложении с помощью функции
m_hDriver = CreateFile(
IPM_SYMBOLIC_DRIVER_NAME,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);

Если приложение работает под админом — все отлично. Как только запускаю приложение
под пользователем без прав админа, при открытии драйвера появляется ошибка access denied.

В связи с этим хотелось бы спросить у участников форума, возможно ли открытие драйвера под user-ом
с помощью CreateFile. Может быть помогут некие манипуляции с параметром LPSECURITY_ATTRIBUTES, который сейчас NULL.
Re: Возможно ли открыть драйвер из-под user-а
От: CaptainFlint http://flint-inc.ru/
Дата: 06.03.12 15:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте всем!

А>Возникла следующая ситуация:
А>имеется драйвер-фильтр, который я хочу открыть в приложении с помощью функции
А> 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, подсунув ему соответствующим образом настроенный набор разрешающих привилегий, — всё сразу заработало.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re: Возможно ли открыть драйвер из-под user-а
От: okman Беларусь https://searchinform.ru/
Дата: 06.03.12 15:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте всем!

А>Возникла следующая ситуация:
А>имеется драйвер-фильтр, который я хочу открыть в приложении с помощью функции
А> 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), которое
цепляется к стеку, или же для этого сделаны отдельные устройства ?
Re[2]: Возможно ли открыть драйвер из-под user-а
От: okman Беларусь https://searchinform.ru/
Дата: 06.03.12 16:11
Оценка:
O>Один вопрос — а драйвер управляется через то же самое устройство (DEVICE_OBJECT), которое
O>цепляется к стеку, или же для этого сделаны отдельные устройства ?

Поясню свой вопрос.
Дело в том, что диспетчер ввода-вывода посылает IRP верхнему устройству в стеке.
Если Ваш фильтр сидит ниже него, управляющие сигналы будут приходить не напрямую, а после
обработки устройствами, находящимися сверху. Даже если вы открываете свой фильтр по
символьной ссылке, управляющий код IRP_MJ_CREATE сначала получит верхнее устройство стека,
и лишь потом он дойдет до фильтра.
Причем еще не факт, что дойдет — устройство, находящееся
выше, запросто может блокировать запросы, идущие от недоверенных процессов.
Или быть создано в экслюзивном режиме, как это имеет место с клавиатурой и мышью.

Рецепт тут такой — создать второе устройство, специально для управления фильтром.
Его к стеку цеплять не нужно. Этому устройству следует присвоить символьную ссылку, и
тогда открывать его можно будет везде и всегда, если только Вы не пожелаете обратного.
Re: Возможно ли открыть драйвер из-под user-а
От: ononim  
Дата: 09.03.12 10:27
Оценка:
А>имеется драйвер-фильтр, который я хочу открыть в приложении с помощью функции
А> 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);
Re[2]: Возможно ли открыть драйвер из-под user-а
От: x64 Россия  
Дата: 11.03.12 14:02
Оценка:
А>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.

Re[2]: Возможно ли открыть драйвер из-под user-а
От: ononim  
Дата: 11.03.12 19:25
Оценка:
Я так понимаю тут кое чего не хватает в строках, ну да ладно.
Проверьте на предмет существования значения Security в ключе "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DriverName\Security"
Если оно там есть — это security descriptor для этого драйвера self-relative формате.
..Но проще тупо глянуть в windbg
Как много веселых ребят, и все делают велосипед...
Re: Возможно ли открыть драйвер из-под user-а
От: yol  
Дата: 20.03.12 08:56
Оценка:
Здравствуйте, всем!

Вот здесь у человека подобная проблема:
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.
...

Thomas F. Divine
http://www.pcausa.com

Значит, все-таки с помощью прав можно что-то сделать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.