Пара вопросов...
От: Аноним  
Дата: 05.04.08 04:26
Оценка:
Привет!

1. Как проще всего получить ID сессии, в которой выполняется процесс, по ID этого процесса?
2. PEB — структура одинаковая в Windows XP/Server 2003/Vista или различается ?

Спасибо.
Re: Пара вопросов...
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 05.04.08 17:59
Оценка:
А>1. Как проще всего получить ID сессии, в которой выполняется процесс, по ID этого процесса?
UserMode:
ProcessIdToSessionId и процессу должно быть разрешено PROCESS_QUERY_INFORMATION.

Кстати ProcessIdToSessionId просто открывает процесс по ID и спрашивает NtQueryInformationProcess с ProcessSessionInformation

Если же речь про текущий процесс — может быть удобнее позвать GetSystemMetrics(SM_REMOTESESSION) да и все.
Вообще ссылок тут должно быть навалом — поишите по слову SessionId в форуме WINAPI?

KernelMode:
нужен токен процесса ибо с ним можно позвать SeQuerySessionIdToken

получить токен можно из разных мест:
или SeCaptureSubjectContext поможет
или параметры IRP иногда содержат требуемую структуру SECURITY_SUBJECT_CONTEXT
или еще каким-образом

Так вот имея ее на руках, можно натравить SeQuerySubjectContextToken и получить искомое.

Естественно, аналогичные вещи можно делать и в приложении, имея токен: зовем GetTokenInformation с классом TokenSessionId.

А>2. PEB — структура одинаковая в Windows XP/Server 2003/Vista или различается ?

windbg>dt _PEB

однозначно ответит на этот вопрос.

PS отрицательно
... << RSDN@Home 1.2.0 alpha rev. 0>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: Пара вопросов...
От: Аноним  
Дата: 05.04.08 18:55
Оценка:
А>>1. Как проще всего получить ID сессии, в которой выполняется процесс, по ID этого процесса?
VAB>KernelMode:

Нужно KernelMode. Посмотрел по ссылкам, — проще всего думаю будет через ZwOpenProcessTokenEx + ZwQueryInformationToken(TokenSessionId).

А>>2. PEB — структура одинаковая в Windows XP/Server 2003/Vista или различается ?

VAB>PS отрицательно

Re[3]: Пара вопросов...
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 05.04.08 19:58
Оценка:
А>Нужно KernelMode. Посмотрел по ссылкам, — проще всего думаю будет через ZwOpenProcessTokenEx + ZwQueryInformationToken(TokenSessionId).
это тоже по идее будет работать, просто часто Token или SECURITY_SUBJECT_CONTEXT уже имеется под рукой (см пред сообщ) посему удобнее (возможно мне, из-за специфики проектов) пользоваться SeXxx. возможно дело вкуса.

вот код который я имел ввиду для ядра — вставляем в любое место на PASSIVE_LEVEL и пользуемся:
SECURITY_SUBJECT_CONTEXT sc;
SeCaptureSubjectContext(&sc);

PACCESS_TOKEN Token = SeQuerySubjectContextToken(&sc);

ULONG SessionId;
NTSTATUS rc = SeQuerySessionIdToken(Token, &SessionId);

SeReleaseSubjectContext(&sc);


А>>>2. PEB — структура одинаковая в Windows XP/Server 2003/Vista или различается ?

VAB>>PS отрицательно

А>

почему? просто не надо лишний раз пользоваться тем, что не документировано официально.
Как правило пути всегда есть и часто они — оказываются правильные.
Например рыскать в поисках неких Id через PEB — не лучшая идея однозначно.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: Пара вопросов...
От: ononim  
Дата: 06.04.08 11:49
Оценка: +1
VAB>KernelMode:
VAB>нужен токен процесса ибо с ним можно позвать SeQuerySessionIdToken
ZwQueryInformationProcess и из ядра можно вызвать.
Как много веселых ребят, и все делают велосипед...
Re: Пара вопросов...
От: Ligen Украина http://zone-of-ambiguity.blogspot.com/
Дата: 06.04.08 12:46
Оценка: 13 (2)
Здравствуйте, Аноним, Вы писали:

А>Привет!


А>1. Как проще всего получить ID сессии, в которой выполняется процесс, по ID этого процесса?

А>2. PEB — структура одинаковая в Windows XP/Server 2003/Vista или различается ?

А>Спасибо.


1. Начиная с XP есть — nt!PsGetProcessSessionId
2. Для текущего хорош:
NTSTATUS GetSessionIdOfThread(PULONG pSessionId, PETHREAD pThread)
{
IRP irp;
NTSTATUS status;
irp.Tail.Overlay.Thread = pThread;

status = IoGetRequestorSessionId(&irp, pSessionId);
return status;
}
подробнее см тут
Viva el Junta Militar! Viva el Presidente!
Re[2]: Пара вопросов...
От: TarasCo  
Дата: 06.04.08 21:34
Оценка:
L>подробнее см тут

хороший блог — +1
Да пребудет с тобою сила
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.