Сейчас на форуме: tyns777, zds (+3 невидимых)

 eXeL@B —› Программирование —› Kernel mode GetUserNameEx
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 8.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 декабря 2009 07:48
· Личное сообщение · #1

Приветствую вас, коллеги!
подскажите пож-ста, как я могу
из кернел-моде получить имя текущего пользователя,
а также имя исполняемого образа, в контексте которого
мы находимся, т.е. полный путь exe- (sys-, если возможно) файла.
и вот еще: если интерактивного юзера еще не было, т.е.
если мы при загрузке работаем как систем (я переделал) ntoskrnl.exe,
то на какой стадии загрузки мы можем начать юзать iocreatefile?
И будет ли система каллить эту функцию, если i/o manager еще не инициализировался?
заранее благодарен за ответ =)



Ранг: 3.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 декабря 2009 13:36
· Личное сообщение · #2

Kernel mode GetUserNameEx
1. Долгий метод KeUserModeCallback()
2. GUI-приложение передает IOCTL в ring0




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 07 декабря 2009 20:12 · Поправил: ARCHANGEL
· Личное сообщение · #3

Я сам использовал такой метод.
Имея ProcessId, вызываем PsLookupProcessByProcessId, получаем PEPROCESS, далее через ObOpenObjectByPointer получаем хэндл процесса, теперь через ZwQueryInformationProcess получаем PPEB, а далее оттуда извлекаем адрес первого загруженного модуля, и узнаем "ехе процесса".

Но это для любого процесса, а если для того, в контексте которого мы находимся, то код ещё упрощается.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 07 декабря 2009 21:14
· Личное сообщение · #4

ARCHANGEL пишет:
Но это для любого процесса

Для native процессов не будет работать, т.к. у них нет PEB. И полученной информации нельзя доверять, т.к. процесс может легко изменить свой PEB. Более надежно получать путь из SECTION_OBJECT в EPROCESS, но страшный гимор сделать это кроссплатформенно.
На Vista sp1 и выше можно сделать почти без плясок с бубном через PsSetCreateProcessNotifyRoutineEx

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 08 декабря 2009 00:33 · Поправил: ARCHANGEL
· Личное сообщение · #5

ntldr пишет:
И полученной информации нельзя доверять, т.к. процесс может легко изменить свой PEB
Если использовать PsSetCreateProcessNotifyRoutine, то получим уведомление до того, как процесс дотянется до своего PEB.

Более надежно получать путь из SECTION_OBJECT в EPROCESS, но страшный гимор сделать это кроссплатформенно.
Детект через PEB тоже ещё предстоит делать кроссплатформенным, хоть, по-моему, это и менее гиморная задача.

Kerne
Мы можем и сами читать верхние посты.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 08 декабря 2009 01:32
· Личное сообщение · #6

ARCHANGEL пишет:
Если использовать PsSetCreateProcessNotifyRoutine, то получим уведомление до того, как процесс дотянется до своего PEB

Если использовать PsSetCreateProcessNotifyRoutine, то в момент вызова каллбека ещё нет никакого PEB.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 8.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 декабря 2009 06:41
· Личное сообщение · #7

Всем огромное спасибо за ответы,
сам я пока не так силен в ядре. Но вопрос
пока не полностью исчерпан. Как получить имя юзера?
вроде GetUserNameEx уходит куда-то в дебри
secur32.dll, а оттуда делает что-то с каналами, созданными, как
я понял, sam, lsa или srm компонентами. Но где взять
точную инфу про это? и если интерактивного юзера еще
не было, то эти каналы будут работать? Я переписал ядро,
т.е. ntoskrnl.exe, перехватил код некоторых функций,
и хочу определить, кто обращается к ним. про exe-файл вроде
понятно, но не совсем. Откуда мне взять текущий ProcessID?



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 08 декабря 2009 06:55
· Личное сообщение · #8

MSDN мне говорит, что надо копать в сторону PsReferencePrimaryToken / SeQueryInformationToken и потом как-то переводить полученный SID в юзернейм. Похоже что в ядре это делается только поиском поиском соответствующего ключа в SAM.

_Immortal_ пишет:
Откуда мне взять текущий ProcessID?

PsGetCurrentProcessId
Если возникают такие вопросы, то может быть рано замахиваться на что-то более сложное?

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 3.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 декабря 2009 12:51 · Поправил: Kerne
· Личное сообщение · #9

Как получить имя юзера?
вроде GetUserNameEx уходит куда-то в дебри
secur32.dll, а оттуда делает что-то с каналами, созданными, как
я понял, sam, lsa или srm компонентами. Но где взять
точную инфу про это? и если интерактивного юзера еще
не было, то эти каналы будут работать?



Передавать управление user-mode коду т.е. использовать KeUserModeCallback()



Ранг: 8.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 декабря 2009 13:34
· Личное сообщение · #10

ntldr пишет:
Если возникают такие вопросы, то может быть рано замахиваться на что-то более сложное?
в большинстве случаев, можно сказать что рано.
но если поставить перед собой сложную задачу,
методы решения которой на начальной стадии неясны,
то её решение делает нас сильнее=)
я так всё стараюсь изучать =)
Ну вроде теперь ясно стало, всем big-big 10x =)




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 08 декабря 2009 15:14 · Поправил: ARCHANGEL
· Личное сообщение · #11

ntldr
С помощью определённым танцев с бубном можно вставить код, который передаст драйверу IOCTL, когда PEB уже будет. Но метод - так себе. Было бы интересно узнать, может, у кого-то получалось попроще.

Да, про нативные процессы и отсутствие у них PEB не знал, спасибо за инфу. А можно узнать, какие именно это процессы?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 08 декабря 2009 15:22
· Личное сообщение · #12

ARCHANGEL пишет:
С помощью определённым танцев с бубном

Проще будет потанцевать в направлении SECTION_OBJECT.

ARCHANGEL пишет:
А можно узнать, какие именно это процессы?

smss.exe, autochk.exe и прочие процессы работающие в native subsystem. PEB у таких процессов может присутствовать, а может и нет, я сталкивался с обоими случаями.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 08 декабря 2009 16:58 · Поправил: HiEndsoft
· Личное сообщение · #13

ntldr пишет:
smss.exe, autochk.exe и прочие процессы работающие в native subsystem. PEB у таких процессов может присутствовать, а может и нет, я сталкивался с обоими случаями.

Чтот - то с трудом верится (не видел, возможно козни антивирей). Зачем родным нативам менять свой PEB? Может у них по-вашему и TEB нету?

-----
продавец резиновых утёнков




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 08 декабря 2009 18:50
· Личное сообщение · #14

Проверил на XP и 2003 - PEB есть, но точно помню, что когда-то давно сталкивался с его отсутствием, т.к. не удавалось прочитать список модулей в таком процессе. Насчет TEB не знаю, не проверял.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 08 декабря 2009 20:40
· Личное сообщение · #15

ntldr пишет:
не удавалось прочитать список модулей в таком процессе

Список модулей можно получить не пребегая к двусвязанным спискам PEB (см. Рихтера).

-----
продавец резиновых утёнков




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 08 декабря 2009 21:56
· Личное сообщение · #16

HiEndsoft пишет:
(см. Рихтера).

Я не знаю более простого метода, кроме разве что нотификаций, которые не всегда применимы.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 3.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 декабря 2009 00:24 · Поправил: Kerne
· Личное сообщение · #17

Получение пути к драйверу используя SECTION_OBJECT (объект секцию)

[url] Тыц-тыц




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 09 декабря 2009 20:55
· Личное сообщение · #18

Kerne
И к чему ты меня цитируешь?

Kerne пишет:
Получение пути к драйверу используя SECTION_OBJECT (объект секцию)
Видна только идея, да описание структуры (даже непонятно, для какой Винды конкретно), а рабочего примера нету, а раз нету, то писать всякие сказки каждый может, особенно если это касается недокументированных структур.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 09 декабря 2009 21:23
· Личное сообщение · #19

ntldr пишет:
Я не знаю более простого метода, кроме разве что нотификаций, которые не всегда применимы.

RtlQueryProcessDebugInformation,
VMQuery (см. Рихтера) и т.д.

-----
продавец резиновых утёнков




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 09 декабря 2009 22:05
· Личное сообщение · #20

HiEndsoft пишет:
RtlQueryProcessDebugInformation,VMQuery (см. Рихтера) и т.д.

Отсутствует в экспорте ntoskrnl.exe
Сдается мне, что вы отвечаете не читая, потому что иначе знали бы, что речь идет исключительно о драйверах. Юзермодные API здесь знают не хуже вас, но речь не о том.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 09 декабря 2009 23:12 · Поправил: HiEndsoft
· Личное сообщение · #21

ntldr пишет:
Проверил на XP и 2003 - PEB есть, но точно помню, что когда-то давно сталкивался с его отсутствием, т.к. не удавалось прочитать список модулей в таком процессе. Насчет TEB не знаю, не проверял.

Это Вы сами затеяли. Вот и все.

-----
продавец резиновых утёнков




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 09 декабря 2009 23:32
· Личное сообщение · #22

Уважаемый HiEndsoft, до вас плохо доходит, но я всё-же попробую объяснить: разговор зашел о PEB потому, что речь шла о получении пути к модулю из драйвера. Драйвер может читать PEB, но не может вызывать юзермодные API, о которых здесь никто не спрашивал. Ваши посты насчет Рихтера являются оффтопиком.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 10 декабря 2009 00:18
· Личное сообщение · #23

_Immortal_
Решение твоей задачи зависит от многих факторов:
1) OS, на которых это должно работать.
2) требуется ли обеспечить независимость от будущих обновлений/сервиспаков.
3) возможно драйвер использует, или может использовать, такие возможности, как нотификаторы. Начиная с Vista SP1 можно получить указатель на объект FileObject модуля процесса в нотификаторе, которому можно послать IRP_MJ_QUERY_INFORMATION для опреления пути (поскольку поле FileObject->FileName гарантировано валидно только во время запроса IRP_MJ_CREATE, MSDN). В более ранних ОС, возможно, имеет смысл использовать смещения undoc структур для получения FILE_OBJECT: Eprocess->SectionObject->Segment->ControlArea->FileObject.
4) Если в драйвере есть возможность послать Lpc сообщение в user-mode и получить ответ, можно получить путь и имя процесса используя user-mode API (GetModuleFileNameEx, GetProcessImageFileName (подходит для x86 приложений в среде WOW в x64 OS)) и user-mode модуль. Возможны варианты с другими способами коммуникации.
5) имеются другие возможности, опять таки, зависящие от конкретных требований и условий.

-----
Research is my purpose




Ранг: 3.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 декабря 2009 02:49
· Личное сообщение · #24

ARCHANGEL
И к чему ты меня цитируешь?

Хорошо, не буду больше цитировать.


_Immortal_

К дополнению вариантов предлагавшихся выше
а) DriverEntry(IN PUNICODE_STRING RegPath) RegPath - полный путь к драйверу
б) Читать из KUSER_SHARED_DATA что довольно таки не надежный метод (смещения меняются от версии к версии)




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 10 декабря 2009 15:26
· Личное сообщение · #25

Из сервиса может быть взять ...

WTSGetActiveConsoleSessionId
WTSQueryUserToken
DuplicateToken
ImpersonateLoggedOnUser
// GetUserName

Там вроде нужно еще нумеровать терминые логины , чтобы код уж идеальный был и вытаскивать активного пользователя

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 8.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 декабря 2009 16:44
· Личное сообщение · #26

Error_Log пишет:
1) OS, на которых это должно работать.
2) требуется ли обеспечить независимость от будущих обновлений/сервиспаков.

Действительно, я не до конца поснил суть вопроса.
1). мультисистемность (!) обеспечивать не надо, т.к. мой код исполняется
не в драйвере, а в ядре системы, т.к. я переписал ntoskrnl.exe

получение пути к текущему exe-модулю я уже реализовал методом
undoc-функций, т.е. используя SECTION_OBJECT (спасибо Four-F за отличные туториалы).

кстати, из Driver_Entry этот метод не работает (тот, что описан Four-F). в других контекстах
(т.е. не System) работает на 5+ =) (ещё раз спасибо Four-F)

Далее. Чтобы получить юзер нэйм, можно сделать так:
1). RtlGetCurrentProcessID
2). PsReferencePrimaryToken - получение токена защиты процесса по ID
3). SeQueryInformationToken с классом информации TokenUser - получим SID юзера,
запустившего процесс.
4). Сканируем таблицу Well-Known SID'ов, это есть на support.microsoft.com/kb/243330.
Если Sid не найден, то запрашиваем об этом LSA (сам не пробовал, но так делает GetUserName в
Secur32.dll, посмотрите его в IDA).
5). Ответ не по сути, но все же вариант:
Принимайте в вашей программе решение не на основании имени юзера, а по его Sid. Я сам так сделал.
Sid высокослучаен, поэтому можно допустить, что он уникален =)
Вот так, сам спросил, сам и ответил =)
Еще раз всем спасибо за ответы. Не ожидал такой активности. Вместе мы сила =)



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 10 декабря 2009 20:35
· Личное сообщение · #27

_Immortal_ пишет:
1). мультисистемность (!) обеспечивать не надо, т.к. мой код исполняетсяне в драйвере, а в ядре системы, т.к. я переписал ntoskrnl.exe

Не совсем понял.

_Immortal_ пишет:
получение пути к текущему exe-модулю я уже реализовал методомundoc-функций, т.е. используя SECTION_OBJECT (спасибо Four-F за отличные туториалы).

С мультисистемностью будут проблемы из-за разных смещений указателя на SECTION_OBJECT в EPROCESS (они могут отличаться даже в сервиспаках). Также понадобятся отдельные прототипы структур для x64. И имеется 100% гарантия, что на следующей винде работать не будет.
Оптимальным компромиссом является применение этого способа на всех ОС до Vista SP1, а на Vista SP1 и выше следует использовать PsSetCreateProcessNotifyRoutineEx.

_Immortal_ пишет:
Если Sid не найден, то запрашиваем об этом LSA (сам не пробовал, но так делает GetUserName в Secur32.dll, посмотрите его в IDA).

Это слабое место метода. Получим непредсказуемый результат на тех системах, где код не тестировался.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 8.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 декабря 2009 21:53
· Личное сообщение · #28

Ntldr:
Я понимаю это, но сознательно привязываюсь к системе.
Я пишу антивирус. Ядер Windows не так много.
Значет, если кто-то хочет юзать результаты моего труда,
то пусть качает прошитый ntoskrnl.exe и прописывает его в boot.ini =)
Нормальный по-моему метод? да и потом портирование
само по себе не сложно, просто меняются RVA и заглушки
на перехватываемые функции (да и то не далеко всегда).
То есть для всех ядер можно сделать по отдельности,
и не нагромождать килобайты детектирующего кода. =)



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 10 декабря 2009 22:50
· Личное сообщение · #29

_Immortal_ пишет:
Нормальный по-моему метод?

Пожалуй промолчу о нормальности, ибо всей мощи русского языка не хватит чтобы выразить моё мнение. Остановлюсь лишь на том, что такой метод незаконен, читай EULA.

_Immortal_ пишет:
Я пишу антивирус.

Упаси меня бог от такого антивируса Мне заранее жаль ваших пользователей.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 8.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 декабря 2009 23:59
· Личное сообщение · #30

Кстати, напишу этот антивирь, статью к нему,
и предложу властьимущим выложить её на сайт.
Возможно, в этом случае Маэстро (ntldr) посмотрит
не это дело несколько иначе. =)

P.S. Да, это незаконно. Но я могу залить пачти к ядрам,
а не сами ядра.


. 1 . 2 . >>
 eXeL@B —› Программирование —› Kernel mode GetUserNameEx
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати