Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: DDK функция Get Process Name User ById  (Прочитано 19061 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Android9
Интересующийся

ru
Offline Offline

« : 23-05-2010 10:52 » 

Есть ли в DDK функция, позволяющая узнать имя пользователя, запустившего процесс?  Я получаю имя процесса по ID с помощью функции GetProcessNameById. А вот как имя пользователя узнать..??
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 23-05-2010 17:44 » 

посмотрите чем то похожую ветку https://forum.shelek.ru/index.php/topic,17998.0.html
может быть натолкнет на размышления.....

а так... наверное надо ZwQuerySystemInformation() с флагом SystemProcessInformation...
видимо вы его делаете в GetProcessNameById? http://www.rsdn.ru/forum/asm/2736475.all.aspx
потом можно попробовать PsLookupProcessByProcessId
и покопать что там есть в PEPROCESS, правда она не документирована....

возможно там где то есть SID пользователя...

PS может быть что нибудь типа ZwQuerySecurityObject() или ObGetObjectSecurity() с последующим RtlGetOwnerSecurityDescriptor() подойдет...

PPS либо кажется из драйвера WMI тоже доступен? тогда там тоже кажется были функции. возможно это даже самый прямой метод будет.
« Последнее редактирование: 23-05-2010 19:54 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Android9
Интересующийся

ru
Offline Offline

« Ответ #2 : 24-05-2010 13:00 » 

PPS либо кажется из драйвера WMI тоже доступен? тогда там тоже кажется были функции. возможно это даже самый прямой метод будет.
Я вот думаю, может, проще будет вызвать пользовательский код из режима ядра? Тогда можно будет узнать этого юзера с помощью обычной win api функции.
Один единственный  пример нашелся, как вызвать user код из ядра с помощью функции KeUserModeCallback. Да и тот не работает почему-то у меня (WIndows XP Sp2). Драйвер регистрируется, запускается. Но никаких отладочных сообщений а тем более MsgBox (который как раз и вызывается из режима ядра) не появляется. Кто-нибудь, может, сталкивался с этой функцией (KeUserModeCallback)?
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 24-05-2010 18:03 » 

Тогда можно будет узнать этого юзера с помощью обычной win api функции

О какой конкретно функции идет речь?
Записан
Android9
Интересующийся

ru
Offline Offline

« Ответ #4 : 24-05-2010 19:30 » 

GetUserName()
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 24-05-2010 21:06 » 

один минус KeUserModeCallback - все таки не документированная функция... это к сожалению главный минус...
равно как и использование _EPROCESS....
много статей по этому поводу было на www.wasm.ru
а так... я бы покопался с получением указателя на объект процесса и получением его дескриптора защиты.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 25-05-2010 06:55 » 

В ReactOS есть ее исходники. Там всё не так просто как хотелось бы. Но остается только смотреть и копать до сути вопроса
Записан
x64
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 28-05-2010 23:24 » 

Задача сводится к получению токена процесса и извлечению из него SID-а пользователя. Для этого следует использовать следующую последовательность вызовов:

  • ZwOpenProcessTokenEx.
  • ObReferenceObjectByHandle.
  • SeQueryInformationToken с классом TokenUser.
  • ObDereferenceObject.
  • ZwClose.

Извлечь имя из SID-а можно с помощью функции SecLookupAccountSid (начиная с Windows XP и выше).
Записан
Android9
Интересующийся

ru
Offline Offline

« Ответ #8 : 31-05-2010 04:48 » 

Спасибо большое, SID получилось найти: ZwOpenProcessTokenEx -> ZwQueryInformationToken
Еще функция RtlConvertSidToUnicodeString пригодилась.
 
Но вот с функцией SecLookupAccountSid ничего не получается, в обоих вызовах - эксепшены.  Жаль
Тестирую на Windows XP SP2. Линкую с ksecdd.lib (WINDDK\7600.16385.1\lib\wxp\i386) 
Посмотрите, пожалуйста, код
Код:
//extract UserName from SID
  PUNICODE_STRING NameBuffer;
  ULONG nameLength;
  //check IRQL
  if(KeGetCurrentIrql() > APC_LEVEL) {
DbgPrint("GetProcessInfo: IRQL too high.");
return FALSE;
}
  /*просто инициализирую NameBuffer, я пока не знаю, какого он должен быть размера.*/
  NameBuffer = (PUNICODE_STRING)ExAllocatePool(NonPagedPool, 1);
  nameLength=1; 
  __try {
  //вызываю, чтобы узнать размер возвращаемого буфера NameBuffer
  //В tokenInfoBuffer->User.Sid - SID
  status=SecLookupAccountSid(tokenInfoBuffer->User.Sid, &nameLength, NameBuffer, 0, NULL, NULL);
  //последние три параметра не нужны
  //по msdn, если размер буфера мал, то nameLength будет содержать нужный размер, а функция вернет STATUS_BUFFER_TOO_SMALL
  if(status != STATUS_BUFFER_TOO_SMALL) {
DbgPrint("Error: getting the size of the NameBuffer: \n");
                   return FALSE;
              }
  } __except (EXCEPTION_EXECUTE_HANDLER) {DbgPrint("Exception with getting the size of the NameBuffer");}
  __try {
  //выделяю нужное место под буфер
  NameBuffer = (PUNICODE_STRING)ExAllocatePool(NonPagedPool, nameLength);
           //теперь после вызова по идее в NameBuffer будет имя пользователя.
  SecLookupAccountSid(tokenInfoBuffer->User.Sid, &nameLength, NameBuffer, 0, NULL, NULL);
  DbgPrint("Name: %wZ",NameBuffer);
  }__except (EXCEPTION_EXECUTE_HANDLER) {DbgPrint("Exception with SecLookupAccountSid");}


 
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 31-05-2010 08:50 » 

попробуйте LookupAccountSid с теми же параметрами.

NameBuffer = (PUNICODE_STRING)ExAllocatePool(NonPagedPool, 1);
...как-то маловато памяти даже для UNICODE_STRING, не говоря уже о UNICODE_STRING с буфером.
может быть UNICODE_STRING надо сначала проинициализировать? может быть, тот размер буфера nameLength  касается не  UNICODE_STRING, а buff внутри UNICODE_STRING?

PS кстати... попробуйте задать все параметры. в том числе и те, которые опциональные...

Добавлено через 6 минут и 12 секунд:
ЗЫ и кстати последний параметр SecLookupAccountSid   никак не является опциональным.
NameUse [out]
A pointer to a SID_NAME_USE enumerated type that indicates the type of the account when the function returns.
« Последнее редактирование: 31-05-2010 09:03 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Android9
Интересующийся

ru
Offline Offline

« Ответ #10 : 31-05-2010 09:53 » 

В примере, перед первым вызовом LookupAccountSid буфер не инициализируется. http://msdn.microsoft.com/en-us/library/aa446629(VS.85).aspx

ЗЫ и кстати последний параметр SecLookupAccountSid   никак не является опциональным.
NameUse [out]
A pointer to a SID_NAME_USE enumerated type that indicates the type of the account when the function returns.
Я и с ним пробовала.. Результат тот же.

SID_NAME_USE siduser; 
PUNICODE_STRING NameBuffer={0}; 
status=SecLookupAccountSid(tokenInfoBuffer->User.Sid, &nameLength, NameBuffer, 0, NULL, &siduser);

Вообще было бы логично, если бы первый вызов был таким
SecLookupAccountSid(tokenInfoBuffer->User.Sid, &nameLength, NULL, 0, NULL, &siduser);
и теперь, зная nameLength, можно выделить место для NameBuffer.
В-общем, не понимаю, откуда тут BSOD может быть.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 31-05-2010 14:50 » 

Что-то я вообще не вижу где написано, что SecLookupAccountSid генерит эксепшены. Тут никакие try не нужны
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 31-05-2010 16:00 » 

а я под инициализацией совсем не ЭТО "PUNICODE_STRING NameBuffer={0};  "
понимал))))))))))))))
вообще то я имел в виду инициализацию полей NameBuffer...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Android9
Интересующийся

ru
Offline Offline

« Ответ #13 : 31-05-2010 16:30 » 

_try  я ставлю, так как иначе BSOD
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 31-05-2010 16:58 » 

Ну дык зато по крэшдампу однозначно можно понять в чем причина. На то BSOD и нужен
Записан
Android9
Интересующийся

ru
Offline Offline

« Ответ #15 : 31-05-2010 19:18 » 

Ну дык зато по крэшдампу однозначно можно понять в чем причина. На то BSOD и нужен
Да он секунду висит и после сразу перезагрузка, я не успеваю ничего сделать..
Успеваю прочитать, только если ошибка с IRQL (в этом случае почему то нет перезагрузки).
В-общем, отлавливаю __try и гадаю, отчего ошибка Улыбаюсь
Записан
Android9
Интересующийся

ru
Offline Offline

« Ответ #16 : 31-05-2010 19:21 » 

а ну да. можно дамп памяти ядра посмотреть ведь.

спасибо всем за ответы..
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 31-05-2010 21:20 » new

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

  PUNICODE_STRING pNameBuffer;
  PUNICODE_STRING pDomainBuffer;
  ULONG DomainSize;
 ULONG nameLength;
SID_NAME_USE NameUse;

pNameBuffer = ExAllocatePool(NonPagedPool, 1024);
pNameBuffer->Length = 0;
pNameBuffer->MaximumLength = 1024;
pNameBuffer->Buffer = ExAllocatePool(NonPagedPool, 1024);
nameLength  =1024;

pDomainBuffer = ExAllocatePool(NonPagedPool, 1024);
pDomainBuffer->Length = 0;
pDomainBuffer->MaximumLength = 1024;
pDomainBuffer->Buffer = ExAllocatePool(NonPagedPool, 1024);
DomainSize = 1024;

if (tokenInfoBuffer->User.Sid != NULL)//а вообще стоит посмотреть что там лежит....
{
 status=SecLookupAccountSid(tokenInfoBuffer->User.Sid, &nameLength, pNameBuffer, &DomainSize, pDomainBuffer, &NameUse);
  }

« Последнее редактирование: 31-05-2010 21:40 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines