информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеАтака на InternetПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
При ближайшем рассмотрении DDK 2K оказалось, что есть: 27.01.06 10:49  Число просмотров: 2721
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Тебе же уже ниже написали - эта функция есть только в
> юзерспейсе в advapi32.dll
При ближайшем рассмотрении DDK 2K оказалось, что есть:
- описание в файле WINBASE.H
- функция в библиотеке C:\NTDDK\libchk\i386\advapi32.lib и C:\NTDDK\libfre\i386\advapi32.lib
просто я меня в проекте наверно не указано, что их надо подключить, а как я не нашел в док-ции
<programming>
[Win32] Не могу подключить ф-ю LookupAccountSid к драйверу 26.01.06 17:30  
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
В DDK не находит ни описания, ни библиотеки.
Подскажите, что надо добавить?
Нет в ядре такой функии 26.01.06 18:29  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Тебе же уже ниже написали - эта функция есть только в юзерспейсе в advapi32.dll
При ближайшем рассмотрении DDK 2K оказалось, что есть: 27.01.06 10:49  
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Тебе же уже ниже написали - эта функция есть только в
> юзерспейсе в advapi32.dll
При ближайшем рассмотрении DDK 2K оказалось, что есть:
- описание в файле WINBASE.H
- функция в библиотеке C:\NTDDK\libchk\i386\advapi32.lib и C:\NTDDK\libfre\i386\advapi32.lib
просто я меня в проекте наверно не указано, что их надо подключить, а как я не нашел в док-ции
Гы... Действительно, пропуская чужие грабли, теряешь бесценный опыт! ;-)) Расскажешь потом про синие экраны. 27.01.06 10:58  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 27.01.06 11:00  Количество правок: 1
<"чистая" ссылка>
Пойми, нельзя драйверу ядра подключать в своё адресное пространство библиотеку пользовательского режима! А ещё посмотри сколько зависимостей у самой advapi.dll — офигеешь.
[Win32] Гы... Действительно, пропуская чужие грабли, теряешь бесценный опыт! ;-)) Расскажешь потом про синие экраны. 27.01.06 12:55  
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Пойми, нельзя драйверу ядра подключать в своё адресное
> пространство библиотеку пользовательского режима! А ещё
> посмотри сколько зависимостей у самой advapi.dll —
> офигеешь.
Я же не сам эту функцию выдумал подключать - мне у вас на форуме подсказали ссылку https://www.osronline.com/article.cfm?article=17#Q35, а там написано следующее:
Q35 How do I retrieve the "user name" for the user performing a given operation?

User names, per se, are not a concept of the core OS. Rather, users are tracked internally as "security identifiers" or SIDs. It is possible to extract the SID of the current thread. If a "user name" is needed, a user mode service can be used to convert from the SID to the corresponding text user name. This is done using the Win32 function LookupAccountSid, which is documented in the Platform SDK.

The SID of the calling thread can be extracted from its token. This is done by first attempting to open the thread token (ZwOpenThreadTokenEx or NtOpenThreadToken or NtOpenThreadTokenEx). If this fails because the thread has no token, the filter should open the process token (ZwOpenProcessTokenEx or NtOpenProcessToken or NtOpenProcessTokenEx). In either case, the filter will have a handle for a token.

The SID can be retrieved from the given token using NtQueryInformationToken or ZwQueryInformationToken. The filter should specify TokenUser as the TOKEN_INFORMATION_CLASS value. The call will return a buffer that contains the TOKEN_USER structure. This structure contains the SID of the token.

Note, however, that obtaining the SID of the current caller is often not precisely what a filter is trying to accomplish. Instead, often the filter wishes to know the SID of the requesting thread. For local calls, this will typically be the same. For remote calls, however, the CIFS server routinely utilizes impersonation during IRP_MJ_CREATE and for some IRP_MJ_SET_INFORMATION operations. Otherwise, the CIFS server uses the local system's credentials. To handle this case, a filter must store away the credential information of the original caller. In the case of IRP_MJ_CREATE the original caller's token is specified as part of the IO_SECURITY_CONTEXT parameter. The ACCESS_STATE structure in turn contains the SECURITY_SUBJECT_CONTEXT and the filter can retrieve a pointer to the token using SeQuerySubjectContextToken. The SID can then be retrieved from the token using SeQueryInformationToken.

и потом в lib она есть и связей всего четыре:
- ADVAPI32.DLL
- KERNEL32.DLL
- NTDLL.DLL
- RPCRT4.DLL

И SID мне как раз нужен не из реестра, а пользователя вызвавшего по сетке процедуру.
[Win32] Постараюсь объяснить 27.01.06 16:23  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
Драйвер в режиме ядра не может импортить функции из первой попавшейся DLL. Существует определённый набор ф-ий в ntoskrnl, hal.dll (если не ошибаюсь) которые можно вызывать. Если внимательно прочитать DDK то можно прочитать их список.

Что делать если хочется в драйвере использовать приятную и удобную ф-ю юзерленда.
Вариант 1:
написать программу-сателлит, которая запускается вместе с драйвером, общается с ним при помощи IOCTL, fread, fwrite и выполняет для него какую-то работу.
Вариант 2:
Тут начинаются полу-домыслы :) DDK под рукой нету, так что проверять тебе придётся самому. Если я не ошибаюсь в архитектуре NT предусмотрены "Worker threads". Драйвер которому надо высунуться в 3-е кольцо, может создать поток в процессе System (PID 8). И как-то с ним взаимодействовать. Подробностей не знаю.
Есть. И можно вставить свое задание в один из этих потоков,... 01.02.06 13:40  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Вариант 1:
> написать программу-сателлит, которая запускается вместе с
> драйвером, общается с ним при помощи IOCTL, fread, fwrite и
> выполняет для него какую-то работу.

> Вариант 2:
> Тут начинаются полу-домыслы :) DDK под рукой нету, так что
> проверять тебе придётся самому. Если я не ошибаюсь в
> архитектуре NT предусмотрены "Worker threads". Драйвер

Есть. И можно вставить свое задание в один из этих потоков, но для высовывания в юзера они совершенно неприменимы :-)

> которому надо высунуться в 3-е кольцо, может создать поток
> в процессе System (PID 8). И как-то с ним
> взаимодействовать. Подробностей не знаю.

У процесса System ВООБЩЕ нет пользовательского адресного пространства и соответственно пользовательский поток там создать невозможно. Но поток можно создать в любом другом процессе, а можно и найти ждущий в юзермоде Alertable поток (в том же explorer.exe их всегда целый пучок) и засунуть туда APC.

BOOL
IsUserApcAvailable(PKTHREAD Thread) {
return ((Thread->State == Waiting) && (Thread->WaitMode == UsedMode) && (Thread->Alertable))
}

---
А тред не может умереть до/во время исполнения твоей APC?... 01.02.06 13:54  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 01.02.06 14:06  Количество правок: 2
<"чистая" ссылка>
> BOOL
> IsUserApcAvailable(PKTHREAD Thread) {
> return ((Thread->State == Waiting) &&
> (Thread->WaitMode == UsedMode) &&
> (Thread->Alertable))
> }
А тред не может умереть до/во время исполнения твоей APC? Нехорошо получится... Имхо если человек пишет некий логгер файловых операций (как мне представляется) лучше всетаки дополнительный функционал вынести в юзерский сервис. А драйверу - общаться с ним. В будущем можно этот юзерский сервис на домене повесить если юзера доменные. Удобно и сухо. Имхо не стоит совать в драйвер все что можно.
На случай умирания есть rundown routine 01.02.06 15:11  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> А тред не может умереть до/во время исполнения твоей APC?

В которой можно поискать другой поток. Что же до убивания во время APC - очень маловероятно, но тоже вполне можно решить

> Нехорошо получится... Имхо если человек пишет некий логгер
> файловых операций (как мне представляется) лучше всетаки
> дополнительный функционал вынести в юзерский сервис. А

Я тоже считаю, что так безопаснее с точки зрения стабильности, но иногда хочется и покрасивше :-)

> драйверу - общаться с ним. В будущем можно этот юзерский
> сервис на домене повесить если юзера доменные. Удобно и
> сухо. Имхо не стоит совать в драйвер все что можно.

А он на домене и не нужен. С любой тачки можно спросить имя пользователя с таким то SID-ом.
Это ясно. Но просто чем запускать пачку сервисов на машине,... 01.02.06 15:36  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
> > драйверу - общаться с ним. В будущем можно этот
> юзерский
> > сервис на домене повесить если юзера доменные. Удобно
> и
> > сухо. Имхо не стоит совать в драйвер все что можно.
>
> А он на домене и не нужен. С любой тачки можно спросить имя
> пользователя с таким то SID-ом.
Это ясно. Но просто чем запускать пачку сервисов на машине, которые (по видимому) будут отсылать логи серверу не красивее ли запустить один сервис на сервере? Т.е. с точки зрения кода драйвера и сервера никакой разницы не будет если юзать пайпы например. Просто имя компа на который коннектится не . а сервер
[Win32] Мы говорим на разных языках... 27.01.06 14:10  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 27.01.06 14:18  Количество правок: 2
<"чистая" ссылка>
> Я же не сам эту функцию выдумал подключать - мне у вас на
> форуме подсказали ссылку
> https://www.osronline.com/article.cfm?article=17#Q35, а там
> написано следующее:
> Q35 How do I retrieve the "user name" for the user
> performing a given operation?
>
> User names, per se, are not a concept of the core OS.
> Rather, users are tracked internally as "security
> identifiers" or SIDs. It is possible to extract the SID of
> the current thread. If a "user name" is needed, a user mode
> service can be used to convert from the SID to the
> corresponding text user name. This is done using the Win32
> function LookupAccountSid, which is documented in the
> Platform SDK.

Пойми, функции API вызываются из библиотек. В твоём случае это advapi32.dll. Эта dll НЕ ПРЕДНАЗНАЧЕНА быть загруженной в адресное пространство ядра. Твой драйвер не стартанёт, а если и стартанёт, то уложит систему в синий экран смерти. Аминь.
Не стартанет он.. 27.01.06 16:24  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Залинковаться он то на нее мот и залинкуется но при его запуске винда скажет 126 или 127 :)
[Win32] Не стартанет он.. 27.01.06 17:49  
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Залинковаться он то на нее мот и залинкуется но при его
> запуске винда скажет 126 или 127 :)
Вы правы !
Действительно не стартует :(
Как же я буду в SID имя пользователя искать :(
Да ещё ZwQueryInformationToken на клиентский хэндл ругается, взятый как положено из
IrpStack->Parameters.Create.SecurityContext->AccessState->SubjectSecurityContext.
Труба однако :...(
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach