Android9
Интересующийся
Offline
|
|
« : 23-05-2010 10:52 » |
|
Есть ли в DDK функция, позволяющая узнать имя пользователя, запустившего процесс? Я получаю имя процесса по ID с помощью функции GetProcessNameById. А вот как имя пользователя узнать..??
|
|
|
Записан
|
|
|
|
|
Android9
Интересующийся
Offline
|
|
« Ответ #2 : 24-05-2010 13:00 » |
|
PPS либо кажется из драйвера WMI тоже доступен? тогда там тоже кажется были функции. возможно это даже самый прямой метод будет.
Я вот думаю, может, проще будет вызвать пользовательский код из режима ядра? Тогда можно будет узнать этого юзера с помощью обычной win api функции. Один единственный пример нашелся, как вызвать user код из ядра с помощью функции KeUserModeCallback. Да и тот не работает почему-то у меня (WIndows XP Sp2). Драйвер регистрируется, запускается. Но никаких отладочных сообщений а тем более MsgBox (который как раз и вызывается из режима ядра) не появляется. Кто-нибудь, может, сталкивался с этой функцией (KeUserModeCallback)?
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #3 : 24-05-2010 18:03 » |
|
Тогда можно будет узнать этого юзера с помощью обычной win api функции О какой конкретно функции идет речь?
|
|
|
Записан
|
|
|
|
Android9
Интересующийся
Offline
|
|
« Ответ #4 : 24-05-2010 19:30 » |
|
GetUserName()
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #5 : 24-05-2010 21:06 » |
|
один минус KeUserModeCallback - все таки не документированная функция... это к сожалению главный минус... равно как и использование _EPROCESS.... много статей по этому поводу было на www.wasm.ru а так... я бы покопался с получением указателя на объект процесса и получением его дескриптора защиты.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #6 : 25-05-2010 06:55 » |
|
В ReactOS есть ее исходники. Там всё не так просто как хотелось бы. Но остается только смотреть и копать до сути вопроса
|
|
|
Записан
|
|
|
|
x64
|
|
« Ответ #7 : 28-05-2010 23:24 » |
|
Задача сводится к получению токена процесса и извлечению из него SID-а пользователя. Для этого следует использовать следующую последовательность вызовов: - ZwOpenProcessTokenEx.
- ObReferenceObjectByHandle.
- SeQueryInformationToken с классом TokenUser.
- ObDereferenceObject.
- ZwClose.
Извлечь имя из SID-а можно с помощью функции SecLookupAccountSid (начиная с Windows XP и выше).
|
|
|
Записан
|
|
|
|
Android9
Интересующийся
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
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Android9
Интересующийся
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
Молодой специалист
Offline
Пол:
|
|
« Ответ #11 : 31-05-2010 14:50 » |
|
Что-то я вообще не вижу где написано, что SecLookupAccountSid генерит эксепшены. Тут никакие try не нужны
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 31-05-2010 16:00 » |
|
а я под инициализацией совсем не ЭТО "PUNICODE_STRING NameBuffer={0}; " понимал)))))))))))))) вообще то я имел в виду инициализацию полей NameBuffer...
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Android9
Интересующийся
Offline
|
|
« Ответ #13 : 31-05-2010 16:30 » |
|
_try я ставлю, так как иначе BSOD
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #14 : 31-05-2010 16:58 » |
|
Ну дык зато по крэшдампу однозначно можно понять в чем причина. На то BSOD и нужен
|
|
|
Записан
|
|
|
|
Android9
Интересующийся
Offline
|
|
« Ответ #15 : 31-05-2010 19:18 » |
|
Ну дык зато по крэшдампу однозначно можно понять в чем причина. На то BSOD и нужен
Да он секунду висит и после сразу перезагрузка, я не успеваю ничего сделать.. Успеваю прочитать, только если ошибка с IRQL (в этом случае почему то нет перезагрузки). В-общем, отлавливаю __try и гадаю, отчего ошибка
|
|
|
Записан
|
|
|
|
Android9
Интересующийся
Offline
|
|
« Ответ #16 : 31-05-2010 19:21 » |
|
а ну да. можно дамп памяти ядра посмотреть ведь.
спасибо всем за ответы..
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #17 : 31-05-2010 21:20 » |
|
то что ошибка (видимо 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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|