WinStationGetProcessSid

Тема в разделе "WASM.WIN32", создана пользователем multiarc, 24 фев 2008.

  1. multiarc

    multiarc New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2008
    Сообщения:
    21
    Адрес:
    РБ Жодино
    Код (Text):
    1. ...
    2.  
    3. var
    4.   WinStationGetProcessSid: function (hServer:cardinal;ProcessId:cardinal;var ProcessStartTime:FILETIME;pProcessUserSid:PByte;var dwSidSize:cardinal):boolean;safecall = nil;
    5.  
    6. ...
    7.  
    8. begin
    9.   Winsta := LoadLibrary('winsta.dll');
    10.   WinStationGetProcessSid := GetProcAddress(Winsta,'WinStationGetProcessSid');
    11. WinStationGetProcessSid(0,procid,ProcStartTime,nil,cb);
    12. GetMem(OwnerSID,cb);
    13. if OwnerSID=nil then
    14. exit;
    15. WinStationGetProcessSid(0,procid,ProcStartTime,OwnerSid,cb);
    16. //возвращает Invalid Handle Value
    17. ...
    Как это реализовано в taskmgr?? пытался отладить, но не смог разобраться, потому как там библиотека подключаеться через Delay Load и саму точку входа нашёл, поставив бряк на GetProcAddress, но не смог найти как получить параметры, т.к. там они в стек не ложаться а идёт сразу переход на функу WinStationGetProcessSid...
    Код (Text):
    1. EAX 0005A028 taskmgr.0005A028
    2. ECX 0015E3D4
    3. EDX 00000000
    4. EBX 00000000
    5. ESP 0015E394
    6. EBP 0015E7EC
    7. регистры в точке 0004A2F2 тоесть на call    taskmgr.000479C6
    8.  
    9. 0004A2E3  /. B8 28A00500    mov     eax, taskmgr.0005A028
    10. 0004A2E8  |. EB 00          jmp     short taskmgr.0004A2EA
    11. 0004A2EA  |> 51             push    ecx
    12. 0004A2EB  |. 52             push    edx
    13. 0004A2EC  |. 50             push    eax                              ; /Arg2
    14. 0004A2ED  |. 68 E4790500    push    taskmgr.000579E4                 ; |Arg1 = 000579E4
    15. 0004A2F2  |. E8 CFD6FFFF    call    taskmgr.000479C6                 ; \собсно то что ниже...
    16. 0004A2F7  |. 5A             pop     edx
    17. 0004A2F8  |. 59             pop     ecx
    18. 0004A2F9  \.-FFE0           jmp     eax ;\тут будет в итоге адрес на WinStationGetProcessSid
    19.  
    20. 000479C6  /$ 8BFF           mov     edi, edi
    21. 000479C8  |. 55             push    ebp
    22. 000479C9  |. 8BEC           mov     ebp, esp
    23. 000479CB  |. 83EC 2C        sub     esp, 2C
    24. 000479CE  |. 8B45 08        mov     eax, [arg.1]
    25. 000479D1  |. 8365 F8 00     and     [local.2], 0
    26. 000479D5  |. 53             push    ebx
    27. 000479D6  |. 8B58 04        mov     ebx, dword ptr [eax+4]
    28. 000479D9  |. 56             push    esi
    29. 000479DA  |. 8B70 08        mov     esi, dword ptr [eax+8]
    30. 000479DD  |. 57             push    edi
    31. 000479DE  |. 8B7D 0C        mov     edi, [arg.2]
    32. 000479E1  |. 2B78 0C        sub     edi, dword ptr [eax+C]
    33. 000479E4  |. 8B40 10        mov     eax, dword ptr [eax+10]
    34. 000479E7  |. B9 00000400    mov     ecx, taskmgr.00040000
    35. 000479EC  |. 2BF9           sub     edi, ecx
    36. 000479EE  |. C1FF 02        sar     edi, 2
    37. 000479F1  |. 03F1           add     esi, ecx
    38. 000479F3  |. 8B16           mov     edx, dword ptr [esi]
    39. 000479F5  |. 8D84B8 0000040>lea     eax, dword ptr [eax+edi*4+40000]
    40. 000479FC  |. 03D9           add     ebx, ecx
    41. 000479FE  |. 8B08           mov     ecx, dword ptr [eax]
    42. 00047A00  |. 85C9           test    ecx, ecx
    43. 00047A02  |. 8D81 02000400  lea     eax, dword ptr [ecx+40002]
    44. 00047A08  |. 0F88 975C0000  js      taskmgr.0004D6A5
    45. 00047A0E  |> 85D2           test    edx, edx
    46. 00047A10  |. 8945 FC        mov     [local.1], eax
    47. 00047A13  |. 75 52          jnz     short taskmgr.00047A67
    48. 00047A15  |. 53             push    ebx                              ; /FileName
    49. 00047A16  |. FF15 58100400  call    dword ptr [<&KERNEL32.LoadLibrar>; \LoadLibraryA
    50. 00047A1C  |. 8BF8           mov     edi, eax
    51. 00047A1E  |. 85FF           test    edi, edi
    52. 00047A20  |. 897D 08        mov     [arg.1], edi
    53. 00047A23  |. 74 66          je      short taskmgr.00047A8B
    54. 00047A25  |. 6A 00          push    0
    55. 00047A27  |. 57             push    edi
    56. 00047A28  |. 56             push    esi
    57. 00047A29  |. FF15 5C100400  call    dword ptr [<&KERNEL32.Interlocke>;  kernel32.InterlockedCompareExchange
    58. 00047A2F  |. 8BF0           mov     esi, eax
    59. 00047A31  |. 85F6           test    esi, esi
    60. 00047A33  |. 0F85 815C0000  jnz     taskmgr.0004D6BA
    61. 00047A39  |. 6A 08          push    8
    62. 00047A3B  |. 59             pop     ecx
    63. 00047A3C  |. 8D7D D8        lea     edi, [local.10]
    64. 00047A3F  |. F3:AB          rep     stos dword ptr es:[edi]
    65. 00047A41  |. 8B45 08        mov     eax, [arg.1]
    66. 00047A44  |. 8945 EC        mov     [local.5], eax
    67. 00047A47  |. A1 807A0400    mov     eax, dword ptr [47A80]
    68. 00047A4C  |. 85C0           test    eax, eax
    69. 00047A4E  |. C745 D4 240000>mov     [local.11], 24
    70. 00047A55  |. 895D E0        mov     [local.8], ebx
    71. 00047A58  |. 0F85 4F5C0000  jnz     taskmgr.0004D6AD
    72. 00047A5E  |> 837D 08 00     cmp     [arg.1], 0
    73. 00047A62  |. 74 27          je      short taskmgr.00047A8B
    74. 00047A64  |. 8B55 08        mov     edx, [arg.1]
    75. 00047A67  |> FF75 FC        push    [local.1]                        ; /ProcNameOrOrdinal
    76. 00047A6A  |. 52             push    edx                              ; |hModule
    77. 00047A6B  |. FF15 64100400  call    dword ptr [<&KERNEL32.GetProcAdd>; \GetProcAddress
    78. 00047A71  |. 85C0           test    eax, eax
    79. 00047A73  |. C745 F8 010000>mov     [local.2], 1
    80. 00047A7A  |. 75 1D          jnz     short taskmgr.00047A99
    81. 00047A7C  |. EB 0D          jmp     short taskmgr.00047A8B
    82. 00047A7E  |  90             nop
    83. 00047A7F  |  90             nop
    84. 00047A80  |. 00000000       dd      00000000
    85. 00047A84  |> 5F             pop     edi
    86. 00047A85  |. 5E             pop     esi
    87. 00047A86  |. 5B             pop     ebx
    88. 00047A87  |. C9             leave
    89. 00047A88  |. C2 0800        ret     8
    90. 00047A8B  |> FF75 FC        push    [local.1]
    91. 00047A8E  |. 53             push    ebx
    92. 00047A8F  |. E8 14FF0000    call    <jmp.&KERNEL32.DelayLoadFailureH>
    93. 00047A94  |. E9 305C0000    jmp     taskmgr.0004D6C9
    94. 00047A99  |> 8B4D 0C        mov     ecx, [arg.2]
    95. 00047A9C  |. 8901           mov     dword ptr [ecx], eax
    96. 00047A9E  \.^EB E4          jmp     short taskmgr.00047A84
     
  2. multiarc

    multiarc New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2008
    Сообщения:
    21
    Адрес:
    РБ Жодино
    В общем отладкой пришёл к выводу... (winsta.dll) (Windows Server 2008 RC1)
    Код (Text):
    1. 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
     
  3. multiarc

    multiarc New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2008
    Сообщения:
    21
    Адрес:
    РБ Жодино
    Проблема решена... =D
    А никто так и не ответил... =( =(
    Код (Text):
    1. unit Unit1;
    2.  
    3. interface
    4.  
    5. uses
    6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    7.   Dialogs, StdCtrls;
    8.  
    9. type
    10.   TForm1 = class(TForm)
    11.     Button1: TButton;
    12.     Memo1: TMemo;
    13.     Button2: TButton;
    14.     SaveDialog1: TSaveDialog;
    15.     procedure FormCreate(Sender: TObject);
    16.     procedure Button1Click(Sender: TObject);
    17.     procedure Button2Click(Sender: TObject);
    18.   private
    19.     { Private declarations }
    20.   public
    21.     { Public declarations }
    22.   end;
    23.   QWORD=LARGE_INTEGER;
    24.  
    25.   UNICODE_STRING = record
    26.     len:word;
    27.     maxlen:word;
    28.     str:pwchar;
    29.   end;
    30.  
    31.   VM_COUNTERS= record
    32.   PeakVirtualSize:DWORD;
    33.   VirtualSize:DWORD;
    34.   PageFaultCount:DWORD;
    35.   PeakWorkingSetSize:DWORD;
    36.   WorkingSetSize:DWORD;
    37.   QuotaPeakPagedPoolUsage:DWORD;
    38.   QuotaPagedPoolUsage:DWORD;
    39.   QuotaPeakNonPagedPoolUsage:DWORD;
    40.   QuotaNonPagedPoolUsage:DWORD;
    41.   PagefileUsage:DWORD;
    42.   PeakPagefileUsage:DWORD;
    43.   end;
    44.  
    45.   SYSTEM_THREAD = record
    46.   u1:DWORD;
    47.   u2:DWORD;
    48.   u3:DWORD;
    49.   u4:DWORD;
    50.   ProcessId:DWORD;
    51.   ThreadId:DWORD;
    52.   dPriority:DWORD;
    53.   dBasePriority:DWORD;
    54.   dContextSwitches:DWORD;
    55.   dThreadState:DWORD;      // 2=running, 5=waiting
    56.   WaitReason:DWORD;
    57.   u5:DWORD;
    58.   u6:DWORD;
    59.   u7:DWORD;
    60.   u8:DWORD;
    61.   u9:DWORD;
    62.   end;
    63.  
    64.   Threads=array of SYSTEM_THREAD;
    65.  
    66.   SYSTEM_PROCESS_INFORMATION = record
    67.     dNext:DWORD;
    68.     dThreadCount:DWORD;
    69.     dReserved01:DWORD;
    70.     dReserved02:DWORD;
    71.     dReserved03:DWORD;
    72.     dReserved04:DWORD;
    73.     dReserved05:DWORD;
    74.     dReserved06:DWORD;
    75.     qCreateTime:QWORD;
    76.     qUserTime:QWORD;
    77.     qKernelTime:QWORD;
    78.     usName:UNICODE_STRING;
    79.     BasePriority:DWORD;
    80.     dUniqueProcessId:DWORD;
    81.     dInheritedFromUniqueProcessId:DWORD;
    82.     dHandleCount:DWORD;
    83.     dReserved07:DWORD;
    84.     dReserved08:DWORD;
    85.     VmCounters:VM_COUNTERS;
    86.     dCommitCharge:DWORD;
    87.     Threads:array [0..1] of SYSTEM_THREAD;
    88.   end;  
    89.  
    90. var
    91.   Form1: TForm1;
    92.   Winsta:Cardinal;
    93.   NtQuerySystemInformation:function (
    94.   SystemInformationClass: Cardinal;
    95.   SystemInformation: Pointer;
    96.   SystemInformationLength: Cardinal;
    97.   var ReturnLength: Cardinal): Cardinal;stdcall=nil;
    98.   RtlNtStatusToDosError: function(Status:cardinal):cardinal;stdcall=nil;
    99.   WinStationGetProcessSid: function (hServer:Cardinal;ProcessId:Cardinal;ProcessStartTime:QWORD;pProcessUserSid:PByte;var dwSidSize:cardinal):boolean;stdcall = nil;
    100.  
    101. implementation
    102.  
    103. {$R *.dfm}
    104.  
    105. procedure ViewSysError(ErrCode:cardinal;func:string;DebugInfo:string);
    106. var str:pchar;
    107. begin
    108. FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ALLOCATE_BUFFER,
    109. nil,ErrCode,LANG_USER_DEFAULT,@str,0,nil);
    110. MessageBox(Form1.Handle,pchar(str+#13#10+DebugInfo),pchar(func),0);
    111. LocalFree(Cardinal(str));
    112. end;
    113.  
    114. function SetPrivilege(PrivilegeName:Pchar;Enabled:boolean):boolean;
    115. var
    116.   token,cb:Cardinal;
    117.   tkp:TOKEN_PRIVILEGES;
    118. begin
    119.   result:=OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,token);
    120.   if not result then
    121.     exit;
    122.   result:=LookupPrivilegeValue(nil,PrivilegeName,tkp.Privileges[0].Luid);
    123.   if not result then
    124.     exit;
    125.   tkp.PrivilegeCount:=1;
    126.   case Enabled of
    127.   True:
    128.   tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
    129.   false:
    130.   tkp.Privileges[0].Attributes:=0;
    131.   end;
    132.   cb:=0;
    133.   result:=AdjustTokenPrivileges(token,false,tkp,SizeOf(tkp),nil,cb);
    134.   CloseHandle(token);
    135. end;
    136.  
    137. function GetUserName(procid:Cardinal;CreationTime:QWORD;var User:string;var Domain:string):boolean;
    138. var
    139. PSID:Pointer;
    140. Owner,Group:Pchar;
    141. cb1,cb2,cb:cardinal;
    142. begin
    143. cb:=0;
    144. WinStationGetProcessSid(0,procid,CreationTime,nil,cb);
    145. GetMem(PSID,cb);
    146. if not WinStationGetProcessSid(0,procid,CreationTime,PSID,cb) then
    147. ViewSysError(GetLastError,'WinStationGetProcessSid','');
    148. cb1:=0;
    149. cb2:=0;
    150. LookupAccountSid(nil,PSID,nil,cb1,nil,cb2,cb);
    151. GetMem(Owner,cb1);
    152. GetMem(Group,cb2);
    153. result:=LookupAccountSid(nil,PSID,Owner,cb1,Group,cb2,cb);
    154. SetLength(User,cb1);
    155. SetLength(Domain,cb2);
    156. lstrcpy(Pchar(User),Owner);
    157. lstrcpy(Pchar(Domain),Group);
    158. FreeMem(Owner);
    159. FreeMem(Group);
    160. end;
    161.  
    162. procedure TForm1.Button1Click(Sender: TObject);
    163. var
    164.   tppi:pointer;
    165.   ppi:^SYSTEM_PROCESS_INFORMATION;
    166.   cb,err:cardinal;
    167.   User,Domain:string;
    168. begin
    169. SetPrivilege('SeDebugPrivilege',true);
    170. cb:=0;
    171. NtQuerySystemInformation(5,nil,0,cb);
    172. GetMem(ppi,cb);
    173. err:=RtlNtStatusToDosError(NtQuerySystemInformation(5,ppi,cb,cb));
    174. if err<>0 then
    175. ViewSysError(err,'NtQuerySystemInformation','');
    176. tppi:=ppi;
    177. while ppi.dNext<>0 do
    178. begin
    179. if (ppi.dUniqueProcessId=0) or (ppi.dUniqueProcessId=4) then
    180. begin
    181.   Cardinal(ppi):=Cardinal(ppi)+ppi.dNext;
    182.   Continue;
    183. end;
    184. GetUserName(ppi.dUniqueProcessId,ppi.qCreateTime,User,Domain);
    185. Memo1.Lines.Add('['+
    186. WideCharToString(ppi.usName.str)+
    187. '](User)['+inttostr(ppi.dUniqueProcessId)+']='+User);
    188. Memo1.Lines.Add('['+
    189. WideCharToString(ppi.usName.str)+
    190. '](Domain)['+inttostr(ppi.dUniqueProcessId)+']='+Domain);
    191. Cardinal(ppi):=Cardinal(ppi)+ppi.dNext;
    192. end;
    193. FreeMem(tppi);
    194. end;
    195.  
    196. procedure TForm1.Button2Click(Sender: TObject);
    197. begin
    198. if SaveDialog1.Execute then
    199.   memo1.Lines.SaveToFile(SaveDialog1.FileName);
    200. end;
    201.  
    202. procedure TForm1.FormCreate(Sender: TObject);
    203. begin
    204. Winsta := LoadLibrary('winsta.dll');
    205. WinStationGetProcessSid := GetProcAddress(Winsta,'WinStationGetProcessSid');
    206. NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),'NtQuerySystemInformation');
    207. RtlNtStatusToDosError := GetProcAddress(GetModuleHandle('ntdll.dll'),'RtlNtStatusToDosError');
    208. end;
    209.  
    210. end.
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    ты с КД что-ли? :))
     
  5. multiarc

    multiarc New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2008
    Сообщения:
    21
    Адрес:
    РБ Жодино
    КД????