> Короче, суть бага такова, что включение SeDebugPrivilege > выключает SeSecurityPrivilege. Это вряд ли. Я видел токены со включенными обоими этими привилегиями.
> //чтобы потестить только с SeSecurityPrivilege, > выставьте здесь единичку вместо двойки. Потестить не могу, так как не дельфиец (СОВСЕМ не дельфиец :-) ). А переписывать самому в лом. Я так понимаю, пока не включается SE_DEBUG_NAME все работает отлично?
> pHndl := OpenProcess(MAXIMUM_ALLOWED Or > ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID); > End; // Прикольно, что здесь всё нормально, OS выдаёт > дескриптор процесса с этим уровнем доступа! Вот главная причина, по которой можно судить что SE_SECURITY_NAME не вырубилась. Хендл получен - значит привилегия есть. А не хватает запрошенных прав в самом хендле. Можно попробовать открыть процесс с PROCESS_ALL_ACCESS и посмотреть что получится. (небольшой оффтоп: тем кто говорил, что у паскаля ясный синтаксис - мне вот например ну ничего не говорит о том, что GetCurrentProcessID на самом деле функция).
> aSD := Nil; // VVV А вот здесь ненормально - > возвращает false и говорит, что в доступе отказано! > GetKernelObjectSecurity(pHndl, > SACL_SECURITY_INFORMATION, aSD, 0, aSize); Попробуй посмотреть какие реально привилегии у процесса и какие права у хендла. Можно написать самому что нить в этом роде, но мне вот например нравятся утилитки со http://www.smidgeonsoft.com/ В частности TopToBottomNT может это все посмотреть.
Кто соображает в NT security — вроде как баг отловил...20.05.03 22:15 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 20.05.03 22:21 Количество правок: 1
Короче, суть бага такова, что включение SeDebugPrivilege выключает SeSecurityPrivilege.
program TestProg;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
function SysErrorMessage(ErrorCode: Integer): string;
begin
Result := SysUtils.SysErrorMessage(ErrorCode);
ANSItoOEM(PChar(Result), PChar(Result));
If Result <> '' Then
Result := Format('%s (Error %d)', [Result, ErrorCode]);
end;
Type
TTokenPrivileges = record
PrivilegeCount: DWORD;
Privileges: array[0..1] of TLUIDAndAttributes;
end;
Var
pHndl: THandle;
aSD: PSecurityDescriptor;
aSize: DWord;
hToken: THandle;
tkp: TTokenPrivileges;
begin
hToken := 0;
Try
ZeroMemory(@tkp, SizeOf(tkp));
//чтобы потестить только с SeSecurityPrivilege, выставьте здесь единичку вместо двойки.
tkp.PrivilegeCount := 2;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.Privileges[1].Attributes := SE_PRIVILEGE_ENABLED;
If Not (//Выставляем привилегии для процесса
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) And
LookupPrivilegeValue(Nil, 'SeSecurityPrivilege', tkp.Privileges[0].Luid) And
LookupPrivilegeValue(Nil, 'SeDebugPrivilege', tkp.Privileges[1].Luid) And
AdjustTokenPrivileges(hToken, False, PTokenPrivileges(@tkp)^, 0, Nil, PDWORD(Nil)^))
Then Begin
WriteLn(SysErrorMessage(GetLastError));
Exit;
End;
//Открываем процесс с требуемым уровнем доступа
pHndl := OpenProcess(MAXIMUM_ALLOWED Or ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID);
If pHndl = 0 Then Begin
WriteLn(SysErrorMessage(GetLastError));
Exit;
End; // Прикольно, что здесь всё нормально, OS выдаёт дескриптор процесса с этим уровнем доступа!
Try
aSD := Nil; // VVV А вот здесь ненормально - возвращает false и говорит, что в доступе отказано!
GetKernelObjectSecurity(pHndl, SACL_SECURITY_INFORMATION, aSD, 0, aSize);
If GetLastError <> ERROR_INSUFFICIENT_BUFFER Then
Begin
WriteLn(SysErrorMessage(GetLastError));
Exit;
End;
GetMem(aSD, aSize);
Try
If Not GetKernelObjectSecurity(pHndl, SACL_SECURITY_INFORMATION, aSD, aSize, aSize) Then
Begin
WriteLn(SysErrorMessage(GetLastError));
Exit;
End;
Finally
FreeMem(aSD);
End;
Finally
CloseHandle(pHndl);
End;
WriteLn('Success!');
Finally
If hToken <> 0 Then CloseHandle(hToken);
Write('Press Enter to continue...');
ReadLn;
End;
end.
---
Я не гуру конечно, но21.05.03 10:13 Автор: amirul <Serge> Статус: The Elderman
> Короче, суть бага такова, что включение SeDebugPrivilege > выключает SeSecurityPrivilege. Это вряд ли. Я видел токены со включенными обоими этими привилегиями.
> //чтобы потестить только с SeSecurityPrivilege, > выставьте здесь единичку вместо двойки. Потестить не могу, так как не дельфиец (СОВСЕМ не дельфиец :-) ). А переписывать самому в лом. Я так понимаю, пока не включается SE_DEBUG_NAME все работает отлично?
> pHndl := OpenProcess(MAXIMUM_ALLOWED Or > ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID); > End; // Прикольно, что здесь всё нормально, OS выдаёт > дескриптор процесса с этим уровнем доступа! Вот главная причина, по которой можно судить что SE_SECURITY_NAME не вырубилась. Хендл получен - значит привилегия есть. А не хватает запрошенных прав в самом хендле. Можно попробовать открыть процесс с PROCESS_ALL_ACCESS и посмотреть что получится. (небольшой оффтоп: тем кто говорил, что у паскаля ясный синтаксис - мне вот например ну ничего не говорит о том, что GetCurrentProcessID на самом деле функция).
> aSD := Nil; // VVV А вот здесь ненормально - > возвращает false и говорит, что в доступе отказано! > GetKernelObjectSecurity(pHndl, > SACL_SECURITY_INFORMATION, aSD, 0, aSize); Попробуй посмотреть какие реально привилегии у процесса и какие права у хендла. Можно написать самому что нить в этом роде, но мне вот например нравятся утилитки со http://www.smidgeonsoft.com/ В частности TopToBottomNT может это все посмотреть.
Успехов
Нда. Почти всё так, но косяк всё равно ;-)21.05.03 10:35 Автор: HandleX <Александр М.> Статус: The Elderman
> > Короче, суть бага такова, что включение > SeDebugPrivilege > > выключает SeSecurityPrivilege. > Это вряд ли. Я видел токены со включенными обоими этими > привилегиями. Я знаю. Я специально при отладке смотрел токен — обе привилегии включены.
> > > //чтобы потестить только с SeSecurityPrivilege, > > выставьте здесь единичку вместо двойки. > Потестить не могу, так как не дельфиец (СОВСЕМ не дельфиец > :-) ). А переписывать самому в лом. Я так понимаю, пока не > включается SE_DEBUG_NAME все работает отлично? Да, без SE_DEBUG_NAME всё работает.
> > pHndl := OpenProcess(MAXIMUM_ALLOWED Or > > ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID); > > End; // Прикольно, что здесь всё нормально, OS > выдаёт > > дескриптор процесса с этим уровнем доступа! > Вот главная причина, по которой можно судить что > SE_SECURITY_NAME не вырубилась. Хендл получен - значит > привилегия есть. А не хватает запрошенных прав в самом > хендле. Можно попробовать открыть процесс с Не помогает. Да и более того:
PROCESS_ALL_ACCESS = 111110000111111111111 (binary);
ACCESS_SYSTEM_SECURITY = 1000000000000000000000000 (binary),
т.е. PROCESS_ALL_ACCESS на самом деле не такой уж и «полный» ;-)
> (небольшой > оффтоп: тем кто говорил, что у паскаля ясный синтаксис - > мне вот например ну ничего не говорит о том, что > GetCurrentProcessID на самом деле функция). В смысле можно спутать с переменной? По семантике, если вникнуть, скобки () избыточны, если параметров нет ;-) Это дело привычки...
> > aSD := Nil; // VVV А вот здесь ненормально > - > > возвращает false и говорит, что в доступе отказано! > > GetKernelObjectSecurity(pHndl, > > SACL_SECURITY_INFORMATION, aSD, 0, aSize); > Попробуй посмотреть какие реально привилегии у процесса и > какие права у хендла. Можно написать самому что нить в этом > роде, но мне вот например нравятся утилитки со > http://www.smidgeonsoft.com/ > В частности TopToBottomNT может это все посмотреть. > > Успехов Спасибо, попробую.