Code (Text): ... var WinStationGetProcessSid: function (hServer:cardinal;ProcessId:cardinal;var ProcessStartTime:FILETIME;pProcessUserSid:PByte;var dwSidSize:cardinal):boolean;safecall = nil; ... begin Winsta := LoadLibrary('winsta.dll'); WinStationGetProcessSid := GetProcAddress(Winsta,'WinStationGetProcessSid'); WinStationGetProcessSid(0,procid,ProcStartTime,nil,cb); GetMem(OwnerSID,cb); if OwnerSID=nil then exit; WinStationGetProcessSid(0,procid,ProcStartTime,OwnerSid,cb); //возвращает Invalid Handle Value ... Как это реализовано в taskmgr?? пытался отладить, но не смог разобраться, потому как там библиотека подключаеться через Delay Load и саму точку входа нашёл, поставив бряк на GetProcAddress, но не смог найти как получить параметры, т.к. там они в стек не ложаться а идёт сразу переход на функу WinStationGetProcessSid... Code (Text): EAX 0005A028 taskmgr.0005A028 ECX 0015E3D4 EDX 00000000 EBX 00000000 ESP 0015E394 EBP 0015E7EC регистры в точке 0004A2F2 тоесть на call taskmgr.000479C6 0004A2E3 /. B8 28A00500 mov eax, taskmgr.0005A028 0004A2E8 |. EB 00 jmp short taskmgr.0004A2EA 0004A2EA |> 51 push ecx 0004A2EB |. 52 push edx 0004A2EC |. 50 push eax ; /Arg2 0004A2ED |. 68 E4790500 push taskmgr.000579E4 ; |Arg1 = 000579E4 0004A2F2 |. E8 CFD6FFFF call taskmgr.000479C6 ; \собсно то что ниже... 0004A2F7 |. 5A pop edx 0004A2F8 |. 59 pop ecx 0004A2F9 \.-FFE0 jmp eax ;\тут будет в итоге адрес на WinStationGetProcessSid 000479C6 /$ 8BFF mov edi, edi 000479C8 |. 55 push ebp 000479C9 |. 8BEC mov ebp, esp 000479CB |. 83EC 2C sub esp, 2C 000479CE |. 8B45 08 mov eax, [arg.1] 000479D1 |. 8365 F8 00 and [local.2], 0 000479D5 |. 53 push ebx 000479D6 |. 8B58 04 mov ebx, dword ptr [eax+4] 000479D9 |. 56 push esi 000479DA |. 8B70 08 mov esi, dword ptr [eax+8] 000479DD |. 57 push edi 000479DE |. 8B7D 0C mov edi, [arg.2] 000479E1 |. 2B78 0C sub edi, dword ptr [eax+C] 000479E4 |. 8B40 10 mov eax, dword ptr [eax+10] 000479E7 |. B9 00000400 mov ecx, taskmgr.00040000 000479EC |. 2BF9 sub edi, ecx 000479EE |. C1FF 02 sar edi, 2 000479F1 |. 03F1 add esi, ecx 000479F3 |. 8B16 mov edx, dword ptr [esi] 000479F5 |. 8D84B8 0000040>lea eax, dword ptr [eax+edi*4+40000] 000479FC |. 03D9 add ebx, ecx 000479FE |. 8B08 mov ecx, dword ptr [eax] 00047A00 |. 85C9 test ecx, ecx 00047A02 |. 8D81 02000400 lea eax, dword ptr [ecx+40002] 00047A08 |. 0F88 975C0000 js taskmgr.0004D6A5 00047A0E |> 85D2 test edx, edx 00047A10 |. 8945 FC mov [local.1], eax 00047A13 |. 75 52 jnz short taskmgr.00047A67 00047A15 |. 53 push ebx ; /FileName 00047A16 |. FF15 58100400 call dword ptr [<&KERNEL32.LoadLibrar>; \LoadLibraryA 00047A1C |. 8BF8 mov edi, eax 00047A1E |. 85FF test edi, edi 00047A20 |. 897D 08 mov [arg.1], edi 00047A23 |. 74 66 je short taskmgr.00047A8B 00047A25 |. 6A 00 push 0 00047A27 |. 57 push edi 00047A28 |. 56 push esi 00047A29 |. FF15 5C100400 call dword ptr [<&KERNEL32.Interlocke>; kernel32.InterlockedCompareExchange 00047A2F |. 8BF0 mov esi, eax 00047A31 |. 85F6 test esi, esi 00047A33 |. 0F85 815C0000 jnz taskmgr.0004D6BA 00047A39 |. 6A 08 push 8 00047A3B |. 59 pop ecx 00047A3C |. 8D7D D8 lea edi, [local.10] 00047A3F |. F3:AB rep stos dword ptr es:[edi] 00047A41 |. 8B45 08 mov eax, [arg.1] 00047A44 |. 8945 EC mov [local.5], eax 00047A47 |. A1 807A0400 mov eax, dword ptr [47A80] 00047A4C |. 85C0 test eax, eax 00047A4E |. C745 D4 240000>mov [local.11], 24 00047A55 |. 895D E0 mov [local.8], ebx 00047A58 |. 0F85 4F5C0000 jnz taskmgr.0004D6AD 00047A5E |> 837D 08 00 cmp [arg.1], 0 00047A62 |. 74 27 je short taskmgr.00047A8B 00047A64 |. 8B55 08 mov edx, [arg.1] 00047A67 |> FF75 FC push [local.1] ; /ProcNameOrOrdinal 00047A6A |. 52 push edx ; |hModule 00047A6B |. FF15 64100400 call dword ptr [<&KERNEL32.GetProcAdd>; \GetProcAddress 00047A71 |. 85C0 test eax, eax 00047A73 |. C745 F8 010000>mov [local.2], 1 00047A7A |. 75 1D jnz short taskmgr.00047A99 00047A7C |. EB 0D jmp short taskmgr.00047A8B 00047A7E | 90 nop 00047A7F | 90 nop 00047A80 |. 00000000 dd 00000000 00047A84 |> 5F pop edi 00047A85 |. 5E pop esi 00047A86 |. 5B pop ebx 00047A87 |. C9 leave 00047A88 |. C2 0800 ret 8 00047A8B |> FF75 FC push [local.1] 00047A8E |. 53 push ebx 00047A8F |. E8 14FF0000 call <jmp.&KERNEL32.DelayLoadFailureH> 00047A94 |. E9 305C0000 jmp taskmgr.0004D6C9 00047A99 |> 8B4D 0C mov ecx, [arg.2] 00047A9C |. 8901 mov dword ptr [ecx], eax 00047A9E \.^EB E4 jmp short taskmgr.00047A84
В общем отладкой пришёл к выводу... (winsta.dll) (Windows Server 2008 RC1) Code (Text): function WinStationGetProcessSid (int:integer;ProcessId:cardinal;hServer:cardinal;ProcessStartTime:PFILETIME;pProcessUserSid:PByte;var dwSidSize:cardinal):boolean;stdcall; вот так обьявляеться эта функа... первый int всегда равен 0 (push 0), ?hServer? для каждого процесса свой!!! :O и значение лежит по адресу, который находиться в регистре esi, ещё до вызова функции!!!! :O :O если кто может чё-нить посоветуйте... и это значение не меняеться до перезагрузки... у меня например для smss.exe = 0x4DB89144. Я думал может это я напутал... короче что это типа ProcessStartTime, но почему тогда GetProcessTimes выводит совсем другую инфу... и далеко не 0x4DB89144
Проблема решена... =D А никто так и не ответил... =( =( Code (Text): unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Button2: TButton; SaveDialog1: TSaveDialog; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; QWORD=LARGE_INTEGER; UNICODE_STRING = record len:word; maxlen:word; str:pwchar; end; VM_COUNTERS= record PeakVirtualSize:DWORD; VirtualSize:DWORD; PageFaultCount:DWORD; PeakWorkingSetSize:DWORD; WorkingSetSize:DWORD; QuotaPeakPagedPoolUsage:DWORD; QuotaPagedPoolUsage:DWORD; QuotaPeakNonPagedPoolUsage:DWORD; QuotaNonPagedPoolUsage:DWORD; PagefileUsage:DWORD; PeakPagefileUsage:DWORD; end; SYSTEM_THREAD = record u1:DWORD; u2:DWORD; u3:DWORD; u4:DWORD; ProcessId:DWORD; ThreadId:DWORD; dPriority:DWORD; dBasePriority:DWORD; dContextSwitches:DWORD; dThreadState:DWORD; // 2=running, 5=waiting WaitReason:DWORD; u5:DWORD; u6:DWORD; u7:DWORD; u8:DWORD; u9:DWORD; end; Threads=array of SYSTEM_THREAD; SYSTEM_PROCESS_INFORMATION = record dNext:DWORD; dThreadCount:DWORD; dReserved01:DWORD; dReserved02:DWORD; dReserved03:DWORD; dReserved04:DWORD; dReserved05:DWORD; dReserved06:DWORD; qCreateTime:QWORD; qUserTime:QWORD; qKernelTime:QWORD; usName:UNICODE_STRING; BasePriority:DWORD; dUniqueProcessId:DWORD; dInheritedFromUniqueProcessId:DWORD; dHandleCount:DWORD; dReserved07:DWORD; dReserved08:DWORD; VmCounters:VM_COUNTERS; dCommitCharge:DWORD; Threads:array [0..1] of SYSTEM_THREAD; end; var Form1: TForm1; Winsta:Cardinal; NtQuerySystemInformation:function ( SystemInformationClass: Cardinal; SystemInformation: Pointer; SystemInformationLength: Cardinal; var ReturnLength: Cardinal): Cardinal;stdcall=nil; RtlNtStatusToDosError: function(Status:cardinal):cardinal;stdcall=nil; WinStationGetProcessSid: function (hServer:Cardinal;ProcessId:Cardinal;ProcessStartTime:QWORD;pProcessUserSid:PByte;var dwSidSize:cardinal):boolean;stdcall = nil; implementation {$R *.dfm} procedure ViewSysError(ErrCode:cardinal;func:string;DebugInfo:string); var str:pchar; begin FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ALLOCATE_BUFFER, nil,ErrCode,LANG_USER_DEFAULT,@str,0,nil); MessageBox(Form1.Handle,pchar(str+#13#10+DebugInfo),pchar(func),0); LocalFree(Cardinal(str)); end; function SetPrivilege(PrivilegeName:Pchar;Enabled:boolean):boolean; var token,cb:Cardinal; tkp:TOKEN_PRIVILEGES; begin result:=OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,token); 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; function GetUserName(procid:Cardinal;CreationTime:QWORD;var User:string;var Domain:string):boolean; var PSID:Pointer; Owner,Group:Pchar; cb1,cb2,cb:cardinal; begin cb:=0; WinStationGetProcessSid(0,procid,CreationTime,nil,cb); GetMem(PSID,cb); if not WinStationGetProcessSid(0,procid,CreationTime,PSID,cb) then ViewSysError(GetLastError,'WinStationGetProcessSid',''); cb1:=0; cb2:=0; LookupAccountSid(nil,PSID,nil,cb1,nil,cb2,cb); GetMem(Owner,cb1); GetMem(Group,cb2); result:=LookupAccountSid(nil,PSID,Owner,cb1,Group,cb2,cb); SetLength(User,cb1); SetLength(Domain,cb2); lstrcpy(Pchar(User),Owner); lstrcpy(Pchar(Domain),Group); FreeMem(Owner); FreeMem(Group); end; procedure TForm1.Button1Click(Sender: TObject); var tppi:pointer; ppi:^SYSTEM_PROCESS_INFORMATION; cb,err:cardinal; User,Domain:string; begin SetPrivilege('SeDebugPrivilege',true); cb:=0; NtQuerySystemInformation(5,nil,0,cb); GetMem(ppi,cb); err:=RtlNtStatusToDosError(NtQuerySystemInformation(5,ppi,cb,cb)); if err<>0 then ViewSysError(err,'NtQuerySystemInformation',''); tppi:=ppi; while ppi.dNext<>0 do begin if (ppi.dUniqueProcessId=0) or (ppi.dUniqueProcessId=4) then begin Cardinal(ppi):=Cardinal(ppi)+ppi.dNext; Continue; end; GetUserName(ppi.dUniqueProcessId,ppi.qCreateTime,User,Domain); Memo1.Lines.Add('['+ WideCharToString(ppi.usName.str)+ '](User)['+inttostr(ppi.dUniqueProcessId)+']='+User); Memo1.Lines.Add('['+ WideCharToString(ppi.usName.str)+ '](Domain)['+inttostr(ppi.dUniqueProcessId)+']='+Domain); Cardinal(ppi):=Cardinal(ppi)+ppi.dNext; end; FreeMem(tppi); end; procedure TForm1.Button2Click(Sender: TObject); begin if SaveDialog1.Execute then memo1.Lines.SaveToFile(SaveDialog1.FileName); end; procedure TForm1.FormCreate(Sender: TObject); begin Winsta := LoadLibrary('winsta.dll'); WinStationGetProcessSid := GetProcAddress(Winsta,'WinStationGetProcessSid'); NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),'NtQuerySystemInformation'); RtlNtStatusToDosError := GetProcAddress(GetModuleHandle('ntdll.dll'),'RtlNtStatusToDosError'); end; end.