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

 eXeL@B —› Программирование —› Owner SID & Group SID
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2008 16:12 · Поправил: multiarc
· Личное сообщение · #1

Как получить SID создателя обьекта (процесса) без использования OpenProcessToken.
А точнее имя пользователя под которым выполняеться процесс.




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2008 16:15
· Личное сообщение · #2

Owner SID и Group SID полученный через GetSecurityInfo это не то... там нету юзера и домена, под которым процесс выполняеться.




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2008 16:32 · Поправил: multiarc
· Личное сообщение · #3

Я так понял дочитав в МСДН про tokens короче выходит не открыв token не получить и имя пользователя, а как например открыть в ХР SP2 token для svchost.exe который выполняеться под аккаунтом LOCAL SERVICE или NETWORK SERVICE? говорит Access Denied. ведь taskmgr.exe нормально показывает для всех процессов инфу.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 16 февраля 2008 16:44
· Личное сообщение · #4

multiarc пишет:
taskmgr.exe


он получает через WinStationConnect + WinStationGetProcessSid + LookupAccountSid для XP нада юзать GetKernelObjectSecurity + GetSecurityDescriptorOwner + LookupAccountSid, или также как taskmgr.exe, но там геморно с этими функциями.

-----
[nice coder and reverser]





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2008 18:51
· Личное сообщение · #5

Есть ли где-нить описание функи WinStationConnect, WinStationGetProcessSid? а то гугл ничего толкового не сказал... только синтаксис... а как пользоваться хз ))
BOOLEAN WINAPI WinStationGetProcessSid(
HANDLE hServer,
DWORD ProcessId ,
FILETIME ProcessStartTime ,
PBYTE pProcessUserSid ,
PDWORD dwSidSize
);

BOOLEAN
WINAPI
WinStationConnectA(
IN HANDLE hServer,
IN ULONG ConnectSessionId,
IN ULONG ActiveSessionId,
IN PCSTR Password,
IN ULONG Unknown
);

GetKernelObjectSecurity + GetSecurityDescriptorOwner + LookupAccountSid
спасибо... сейчас проверю...




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2008 18:57
· Личное сообщение · #6

GetKernelObjectSecurity + GetSecurityDescriptorOwner + LookupAccountSid
не то...
тоже самое что и GetSecurityInfo, например для процессов текущего пользователя выводит имя пользователя Administrators, домен BUILTIN.




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2008 19:22 · Поправил: multiarc
· Личное сообщение · #7

BOOLEAN WINAPI WinStationGetProcessSid(
HANDLE hServer,
DWORD ProcessId ,
FILETIME ProcessStartTime ,
PBYTE pProcessUserSid ,
PDWORD dwSidSize
);
void WINAPI CachedGetUserFromSid(
PSID pSid ,
PWCHAR pUserName ,
PULONG cbUserName
);

Код на асме
WinStationGetProcessSid typedef proto :dword,:dword,:dword,:dword,:dword,:dword
lpWinStationGetProcessSid typedef ptr _WinStationGetProcessSid
_CachedGetUserFromSid typedef proto :dword,:dword,:dword
lpCachedGetUserFromSid typedef ptr _CachedGetUserFromSid
.data?
ZwQuerySystemInformation lpZwQuerySystemInformation ?
WinStationGetProcessSid lpWinStationGetProcessSid ?
CachedGetUserFromSid lpCachedGetUserFromSid ?

;_PID为进程的PID
;_lpCreateTime为指向进程创建的时间结构的指针
;_lpUser指向用于存储用户名的缓冲区
_GetProcUser proc USES ebx esi edi _PID,_lpCreateTime,_lpUser
LOCAL @dwSize
LOCAL @User[1024]:BYTE

invoke LoadLibrary,CTEXT("winsta.dll")
invoke GetProcAddress,eax,CTEXT("WinStationGetProcessSid")
mov WinStationGetProcessSid,eax
invoke LoadLibrary,CTEXT("UTILDLL.dll")
invoke GetProcAddress,eax,CTEXT("CachedGetUserFromSid")
mov CachedGetUserFromSid,eax

mov edi,_lpCreateTime
mov @dwSize,0
invoke WinStationGetProcessSid,0,_PID,[edi],[edi+4],\
0,addr @dwSize
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,@dwSize
mov esi,eax

invoke WinStationGetProcessSid,0,_PID,[edi],[edi+4],\
esi,addr @dwSize
invoke IsValidSid,esi
.if eax
invoke CachedGetUserFromSid,esi,addr @User,\
addr @dwSize
invoke wsprintf,_lpUser,CTEXT("%ws"),\
addr @User
.else
mov BYTE PTR [_lpUser],0
.endif
invoke GlobalFree,esi
ret
_GetProcUser endp

CachedGetUserFromSid чё за? и можно ли LookUpAccountSid юзать?
взято отсюда www.cwo1f.cn/blog/?m=200802




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 16 февраля 2008 20:17
· Личное сообщение · #8

дык CachedGetUserFromSid эта херь и достаёт бзера из сида
LookUpAccountSid можно юзать, пихаешь в него сид и будит тебе счастье)

-----
[nice coder and reverser]





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2008 21:04 · Поправил: multiarc
· Личное сообщение · #9

WinStationGetProcessSid говорит invalid handle value
видимо hServer...
ессно дальше не работает




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 16 февраля 2008 21:30
· Личное сообщение · #10

я же писал выше! WinStationConnect нужен

-----
[nice coder and reverser]





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2008 22:04
· Личное сообщение · #11

WinStationConnectW(0,1,0,'',true);//Acess Denied
WinStationGetProcessSid(0,procid,ProcStartTime,nil,cb);//Invalid Handle Value
GetMem(OwnerSid,cb);
WinStationGetProcessSid(0,procid,ProcStartTime,OwnerSid,cb);//Invalid Handle Value




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 16 февраля 2008 22:45
· Личное сообщение · #12

уу мля, думаешь так легко всё)) бери иду и дизасми taskmgr.exe!
ты зачем по сложному пути пошёл? я же показал альтернативу

If (GetKernelObjectSecurity(h,OWNER_SECURITY_INFORMATION,@sd,Size,Length) ) then
begin
aDef:=false;
GetSecurityDescriptorOwner(@sd,sid,aDef);
result:=GetAccountBySID(sid);
end;


-----
[nice coder and reverser]





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 02 марта 2008 20:25 · Поправил: multiarc
· Личное сообщение · #13

В общем отладкой пришёл к выводу... (winsta.dll) (Windows Server 2008 RC1)
function WinStationGetProcessSid (int:integer;ProcessId:cardinal;hServer:cardinal;ProcessStartTime:PFIL ETIME;pProcessUserSid:PByte;var dwSidSize:cardinal):boolean;stdcall;

вот так обьявляеться эта функа... первый int всегда равен 0 (push 0), ?hServer? для каждого процесса свой!!! :O и значение лежит по адресу, который находиться в регистре edi, ещё до вызова функции, в которой произойдёт вызов API!!!! :O :O если кто может чё-нить посоветуйте...
и это значение не меняеться до перезагрузки... у меня например для smss.exe = 0x4DB89144. Я думал может это я напутал... короче что это типа ProcessStartTime, но почему тогда GetProcessTimes выводит совсем другую инфу... и далеко не 0x4DB89144
И ещё нашёл 1 интересную функцию WTSEnumerateProcesses, но она не использует WinStationGetProcessSid в общем требуеться помощь в отладке...




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 02 марта 2008 20:31
· Личное сообщение · #14

И ещё...
WinStationConnect не нужен совсем!!! он не используеться taskmgr'ом совсем.




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 02 марта 2008 22:56 · Поправил: multiarc
· Личное сообщение · #15

NtQuerySystemInformation вроде если не ошибаюсь то откуда берёт нужное значение...
Осталось найти где и что это такое




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 02 марта 2008 23:02
· Личное сообщение · #16

я же дал тебе способ рабочий, сам его юзаю, что не устраивает то?

-----
[nice coder and reverser]





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 02 марта 2008 23:13
· Личное сообщение · #17

Hellspawn пишет:
я же дал тебе способ рабочий, сам его юзаю, что не устраивает то?

то что надо процесс открывать... а например audiodg.exe в висте не откроешь с доступом PROCESS_QUERY_INFORMATION... а taskmgr.exe получает о нём почти всю инфу, которую даже не может получить process explorer




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 02 марта 2008 23:31
· Личное сообщение · #18

включи отладочные привелегии или в висте таких нету?

-----
[nice coder and reverser]





Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 02 марта 2008 23:39
· Личное сообщение · #19

Hellspawn пишет:
включи отладочные привелегии или в висте таких нету?

если это SeDebugPrivilege, то и так включено всё... просто это защищённый процесс...



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 03 марта 2008 10:49
· Личное сообщение · #20

multiarc пишет:
Owner SID и Group SID полученный через GetSecurityInfo это не то... там нету юзера и домена, под которым процесс выполняеться.


Брехня...
Можно получить с помощью GetSecurityInfo SID создателя? Можно. А SID откуда берется? Если домен, назначается RID хозяином домена. Далее, как уже писал Hellspawn LookupAccountSid. Кстати, и привелегии надо включать явно. И делать всякие там ImpersonateSelf....




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 03 марта 2008 17:31 · Поправил: multiarc
· Личное сообщение · #21

Со всеми процессами кроме audiodg.exe всё работает ну конечно со включеной привилегией...
WinStationGetProcessSid не требует открытия... процесса, она сама его открывает через NtOpenProcess...
Тогда вопрос как открыть процесс audiodg.exe? хоть бы и через NtOpenProcess...
Как получить не имя владельца, а имя пользователя... ImpersonateSelf? хм... а зачем?

"The ImpersonateSelf function is used for tasks such as enabling a privilege for a single thread rather than for the entire process or for changing the default discretionary access control list (DACL) for a single thread."
Если я что-то не так понял, то обьясни...



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 03 марта 2008 21:11 · Поправил: S_T_A_S_
· Личное сообщение · #22

Для протектед процесса только PROCESS_QUERY_LIMITED_INFORMATION можно указать D-Pin Purr для отключения фичи использует драйвер http://www.alex-ionescu.com/?p=36 (хз что именно делает)

Хм, а вот тут http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1394821&SiteID=1 пишут:
As I have read in MSDN, you need to call OpenProcess with PROCESS_QUERY_INFORMATION access rights in order to get its token with OpenProcessToken. After trying several combinations, I've found, that PROCESS_QUERY_LIMITED_INFORMATION whould be enough;




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 03 марта 2008 22:02
· Личное сообщение · #23

S_T_A_S_ пишет:
Для протектед процесса только PROCESS_QUERY_LIMITED_INFORMATION можно указать D-Pin Purr для отключения фичи использует драйвер (хз что именно делает)

Драйвер не пойдёт... надо изначально права админа для установки хотя бы...
S_T_A_S_ пишет:
Хм, а вот тут пишут:
As I have read in MSDN, you need to call OpenProcess with PROCESS_QUERY_INFORMATION access rights in order to get its token with OpenProcessToken. After trying several combinations, I've found, that PROCESS_QUERY_LIMITED_INFORMATION whould be enough;

А в XP этого нету... есть только в висте, в ХР не открываеться токен для процесса svchost.exe который запущен от имени LOCAL SERVICE и NETWORK SERVICE...
Вопрос: как получить время создания процесса, нужно для WinStationGetProcessSid... без этого не работает! я короче докапался вроде...



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 04 марта 2008 10:46
· Личное сообщение · #24

multiarc кто является создателем процесса? Разве не пользователь, запустивший процесс? Вообще прослеживается закономерность: если запуск произведен от имени SYSTEM владельцем процесса является группа Администраторы. Если NETWORK SERVICE, то NETWORK_SERVICE, если LOCAL SERVICE то LOCAL SERVICE, если персонифицированный пользователь, то он.



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 04 марта 2008 11:06
· Личное сообщение · #25

Насчет ImpersonateSelf, как то бился над сменой владельца. Ничего не получалось ( хотя SeTakeOwnership присутствовала у запускающего процесс пользователя), пока не вызвал ImpersonateSelf. Приложение было однопоточное.




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 04 марта 2008 14:25
· Личное сообщение · #26

sss пишет:
multiarc кто является создателем процесса? Разве не пользователь, запустивший процесс? Вообще прослеживается закономерность: если запуск произведен от имени SYSTEM владельцем процесса является группа Администраторы. Если NETWORK SERVICE, то NETWORK_SERVICE, если LOCAL SERVICE то LOCAL SERVICE, если персонифицированный пользователь, то он.

Да, но у меня вопрос был не в том:
1) нельзя открывать процесс, потому что в любом случае это можно запретить, например как это делает касперский... А в ХР нету флага PROCESS_QUERY_LIMITED_INFORMATION, да и вообще открытие процесса не проблема запретить, всего-лишь перехватив нужную функцию...
2) получить имя пользователя (локального аккаунта (например "Вася")) который находиться в Token и называеться User SID.




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 04 марта 2008 16:18
· Личное сообщение · #27

Проблема решена...
NtQuerySystemInformation+WinStationGetProcessSid+LookUpAccountSid
Без включённой привелегии дебага в Windows Server 2008 RC1 не определяеться SID только для 1 процесса csrss.exe, со включённой всё определяет... (ну конечно кроме System Idle и System)
Если интересно могу сюда код положить...




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 04 марта 2008 16:29
· Личное сообщение · #28


function SetPrivilege(PrivilegeName:Pchar;Enabled:boolean):boolean;
var
token,cb:Cardinal;
tkp:TOKEN_PRIVILEGES;
begin
result:=OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,tok en);
if not result then
exit;
result:=LookupPrivilegeValue(nil,PrivilegeName,tkp.Privileges[0].Luid) ;
if not result then
exit;
tkp.PrivilegeCount:=1;
case Enabled of
True:
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
false:
tkp.Privileges[0].Attributes:=0;
end;
cb:=0;
result:=AdjustTokenPrivileges(token,false,tkp,SizeOf(tkp),nil,cb);
CloseHandle(token);
end;

procedure TForm1.Button1Click(Sender: TObject);
type
t=SYSTEM_PROCESS_INFORMATION;
var
ppi,tppi,PSID,Owner,Group:pointer;
cb,err,cb1,cb2:cardinal;
begin
SetPrivilege('SeDebugPrivilege',true);
NtQuerySystemInformation(5,nil,0,cb);
GetMem(ppi,cb);
err:=RtlNtStatusToDosError(NtQuerySystemInformation(5,ppi,cb,cb));
ViewSysError(err,'NtQuerySystemInformation','');
tppi:=ppi;
while t(ppi^).dNext<>0 do
begin
cb:=0;
WinStationGetProcessSid(0,t(ppi^).dUniqueProcessId,t(ppi^).qCreateTime ,nil,cb);
GetMem(PSID,cb);
cb2:=cb;
if not WinStationGetProcessSid(0,t(ppi^).dUniqueProcessId,t(ppi^).qCreateTime ,PSID,cb2) then
ViewSysError(GetLastError,'WinStationGetProcessSid','');
LookupAccountSid(nil,PSID,nil,cb1,nil,cb2,cb);
GetMem(Owner,cb1);
GetMem(Group,cb2);
LookupAccountSid(nil,PSID,Owner,cb1,Group,cb2,cb);
Memo1.Lines.Add('['+
WideCharToString(t(ppi^).usName.str)+
']='+Pchar(Owner));
Memo1.Lines.Add('['+
WideCharToString(t(ppi^).usName.str)+
']='+Pchar(Group));
Cardinal(ppi):=Cardinal(ppi)+t(ppi^).dNext;
FreeMem(PSID);
FreeMem(Owner);
FreeMem(Group);
end;
FreeMem(tppi);
end;




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

Создано: 19 марта 2008 01:03
· Личное сообщение · #29

2multiarc:
1) у меня данный пример "врет" - показывает только "nt auth...\local service" и "nt auth...\system". пользователь нигде не фигурирует.
2) этот пример, как и другие подобные косвено загружает систему (нагружается процесс lsass). как от этого избавиться?

зыж система winxp sp2




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 19 марта 2008 16:38
· Личное сообщение · #30

Что значит врёт??
В аттаче полностью прога с исходниками...
Там почти идентичный код...

6947_19.03.2008_CRACKLAB.rU.tgz - ProcessInformation.7z


. 1 . 2 . >>
 eXeL@B —› Программирование —› Owner SID & Group SID
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати