Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Wprowadzenie do Sysinternals – Process Explorer
Windowsowy Menedżer zadań jest pierwszym narzędziem, po które sięgamy, gdy chcemy rozwiązać problem z działaniem danego programu. W Task Managerze możemy zobaczyć procesy systemu, uruchomione usługi i aplikacje, a także możemy nimi zarządzać w najbardziej podstawowym zakresie. Jeśli chcielibyśmy precyzyjnie ustalić szczegóły działania programów, np. przejrzeć listę zasobów przydzielonych do procesu, warto skorzystać z odpowiednika Menedżera zadań z narzędziownika Sysinternals, czyli z Process Explorera.
Pierwszą część znajdziesz tutaj: Wprowadzenie do Sysinternals Suite. Druga część: Wprowadzenie do Sysinternals – Autoruns
Ogólne cechy Process Explorera
Procesy i wątki są kluczowymi elementami Windowsa. Procesy zawierają zasoby, takie jak pamięć czy uchwyty do plików, a także wątki, które wykonują zaprogramowany wcześniej kod. Można więc powiedzieć, że każda czynność wykonana przez jakiś program w systemie, realizowana jest przez wątek, a ten zarządzany jest przez proces.
Do czasów Windowsa 10 Menedżer zadań był prostym programem wyświetlającym podstawowe informacje o najważniejszych procesach działających w systemie. W Windowsie 10, a następnie w Windowsie 11 Task Manager wzbogacił się o filtry, historię uruchamianych aplikacji, a także zintegrował się z narzędziami do zarządzania usługami systemowymi, autostartem i monitorem wydajności. W najnowszym Windowsie Menedżer zadań jest więc całkiem użytecznym narzędziem (rysunek 1).
Rysunek 1. Menedżer zadań w Windowsie 11 otrzymuje coraz to więcej usprawnień.
W profesjonalnych zastosowaniach Menedżer zadań pozostawia jednak dalej wiele do życzenia. Procesy, wątki i zasoby nie są w nim jasno odróżniane, ciężko w nim analizować zależności między programami, a informacje o samych procesach są bardzo ogólne.
Process Explorer to zaawansowany odpowiednik Menedżera zadań, z którym łatwo można zagłębić się w szczegóły procesów, wątków i zasobów systemowych. Process Explorer jest częścią Sysinternals Suite, więc – tak jak pozostałe narzędzia pakietu – można go uruchomić po ściągnięciu i wypakowaniu archiwum z witryny https://learn.microsoft.com/pl-pl/sysinternals/downloads/process-explorer#download.
Interfejs Process Explorera zaprezentowano na Rysunku 2. W głównej części programu widzimy tabelę z drzewem/listą aktualnie uruchomionych procesów wraz z informacjami, takimi jak nazwa danego procesu, stopień wykorzystania CPU, zajętość pamięci, identyfikator PID i tak dalej. Na górnej belce znajdziemy ikony skrótów najczęściej wykorzystywanych opcji, wykresy wydajności, a także pole tekstowe do filtrowania listy procesów. Dolna belka pokazuje całkowite wykorzystanie CPU i pamięci przez wszystkie procesy uruchomione w systemie (w opcjach programu można zmienić te statystyki na inne). W dolnej części programu znajduje się jeszcze panel dolny, wyświetlający uchwyty, biblioteki oraz wątki wykorzystywane przez aktualnie zaznaczony proces; panel ten można włączyć (lub wyłączyć) przez wybranie menu View > Show Lower Pane.
Rysunek 2. Interfejs graficzny programu Sysinternals Process Explorer.
Aby zaznajomić się z interfejsem programu, pobierz Process Explorera i uruchom go, podobnie jak inne programy pakietu Sysinternals (o sposobach instalacji i uruchamiania narzędzi można przeczytać w pierwszej części wprowadzenia do Sysinternals Suite).
Warto zapamiętać, że Process Explorer domyślnie uruchamia się z niskimi uprawnieniami. W takim wypadku nie zobaczymy wszystkich procesów w systemie, takich jak procesy innych użytkowników, procesy systemowe czy procesy działające z wyższymi uprawnieniami. Ponadto nie będziemy mieli dostępu do wszystkich informacji o zabezpieczeniach, do szczegółów dotyczących wykorzystania zasobów przez te procesy, a także możemy nie zobaczyć pełnych ścieżek do niektórych plików wykonywalnych.
Aby mieć kompletną listę procesów i dostęp do pełnych informacji, uruchamiaj Process Explorer z prawami administratora (prawy klawisz myszy > Uruchom z prawami administratora lub zrestartuj program przez wybranie z menu File pozycji Show Details for All Processes).
W głównym oknie programu zobaczysz tabelę z procesami aktualnie działającymi w systemie. Wpisy w tabeli mogą być pokazywane na dwa sposoby: w postaci listy lub drzewa procesów.
- Widok listy (domyślny) sortuje tabelę względem wybranej kolumny, np. alfabetycznie po nazwie procesu (kolumna Process).
- Widok drzewa pokazuje hierarchię procesów, tzn. buduje drzewo, w którym widzimy procesy potomne innych procesów.
Widok listy zostanie włączony, gdy klikniesz kolumnę tabeli. Widok drzewa wyświetli się po kliknięciu odpowiedniej ikony na górnej belce programu (można też użyć skrótu CTRL+T lub wybrać z menu View opcję Show Process Tree).
Kolumny w tabeli są konfigurowalne. Do wyboru mamy dziesiątki atrybutów, dzięki czemu możemy dostosować Process Explorera do wyświetlania dokładnie takich informacji, jakich potrzebujemy w swojej pracy. Aby to zrobić, należy z menu View wybrać opcję Save Column Set…
Rysunek 3. przedstawia przykładowy zestaw kolumn, których można używać do analizy bezpieczeństwa. Oprócz standardowych metryk jak Process, CPU, Priv Mem, Working Set, PID, Description, Company Name mamy tu też kolumnę: VirusTotal pokazującą, ile silników antywirusowych wykrywa dany plik jako potencjalnie złośliwy, Command Line, a także kolumny DEP, ASLR oraz Control Flow Guard informujący o funkcjach bezpieczeństwa danego procesu.
Rysunek 3. Przykładowa konfiguracja kolumn dla potrzeb analizy bezpieczeństwa oraz menu kontekstowe do wykonywania operacji na procesie Discord.exe.
Stan procesów można w każdym momencie zapisać do pliku tekstowego (File > Save), aby potem przeprowadzić analizę np. za pomocą innych narzędzi.
Za pomocą Process Explorera możemy oczywiście wykonywać też szereg operacji na wskazanych procesach. Aby to zrobić, należy kliknąć prawym klawiszem myszy na interesujący nas proces w tabeli. Za pomocą menu kontekstowego będziemy mogli:
- Window – zarządzać oknem procesu, przykładowo przenosząc je na wierzch innych aplikacji;
- Set affinity – przydzielić wybrane rdzenie (logiczne) do obsługi wskazanych wątków;
- Set priority – ustawić priorytet procesu, co daje systemowi informacje, jak efektywnie przydzielać zasoby;
- Kill process oraz Kill process tree – zakończyć proces (a także procesy potomne);
- Restart – zakończyć wybrany proces, a potem ponownie uruchomić go przy użyciu tych samych argumentów linii komend;
- Suspend – zawiesić wybrany proces. W takim wypadku czas procesora nie jest przydzielany do wątków, co pozwala na bardziej szczegółową analizę krótko żyjących procesów (szczególnie pomocne przy analizie potencjalnie złośliwego oprogramowania).
- Debug – uruchomić debugger dla wybranego procesu;
- Create dump – utworzyć zrzut pamięci procesu;
- Check VirusTotal.com – obliczyć hash obrazu (pliku wykonywalnego) i wysłać go do serwisu VirusTotal, aby sprawdzić go pod kątem znanych zagrożeń;
- Properties – otworzyć okno z właściwościami procesu;
- Search online – wyszukać informację o wybranym procesie w Internecie.
Ćwiczenie – Analiza procesu Process Explorera
Uruchom Process Explorera, zlokalizuj jego proces i odpowiedz na następujące pytania:
- Jaki jest identyfikator procesu (PID) Process Explorera?
- Kto jest rodzicem tego procesu?
- Z jakiej lokalizacji uruchomiono Process Explorera?
Uwaga: Odpowiedzi na powyższe pytania będą się różniły w zależności od systemu operacyjnego, a także od sposobu instalacji narzędzi Sysinternals.
Rysunek 4. Widok drzewa (CTRL+T) pokazujący zależności między procesami.
Na Rysunku 4. pokazano sytuację, w której Process Explorera uruchomiono na 64-bitowym Windowsie 11 przez plik procexp.exe.
W drzewie procesów można zauważyć dwa procesy Process Explorera: procexp.exe (PID 9372, dziecko explorer.exe) oraz procexp64.exe (PID 23324, dziecko procexp.exe). Po najechaniu kursorem na oba te procesy ujrzymy dymek informujący, że najpierw uruchomiono Process Explorer ze ścieżki C:\Downloads\ProcessExplorer\procexp.exe, a potem jego 64-bitową wersję ze ścieżki C:\Users\vizzd\AppData\Local\Temp\procexp64.exe. W tym wypadku procesem–rodzicem Process Explorera był explorer.exe, co jest typowe, gdy program uruchomia się przez dwukrotnie kliknięcie w jego ikonę.
Można tu zaobserwować sytuację, o której była mowa przy ogólnym opisie narzędzi Sysinternals. Program procexp.exe sprawdził architekturę systemu, na którym został uruchomiony, po czym do katalogu tymczasowego rozpakował i uruchomił Process Explorera dla odpowiedniej architektury (w tym wypadku procexp64.exe). Do takiej sytuacji nie doszłoby, gdyby w powyższym przykładzie Process Explorer został zainstalowany za pomocą Microsoft Store. Wtedy na liście procesów znajdowałby się tylko jeden proces procexp.exe, ponieważ aplikacja sklepu Microsoftu instaluje w systemie wersję już przystosowaną pod odpowiednią architekturę.
Dla ćwiczenia przyjrzyj się Rysunkowi 5. Pokazano na nim procesy Process Explorera, których rodzicem nie jest Eksplorator plików Windows, a inny program. Przeanalizuj drzewo procesów i postaraj się odpowiedzieć na pytanie, w jaki sposób uruchomiono Process Explorera.
Rysunek 5. Dlaczego w tej sytuacji Process Explorer ściągnięty ze strony Sysinternals nie jest procesem potomnym explorer.exe?
Poniżej znajduje się odpowiedź na pytanie, wraz z rysunkiem pomocniczym (Rysunek 6.).
Process Explorer ściągnięto jako archiwum zip z witryny Sysinternals. Po zapisaniu archiwum na dysk, dwukrotne kliknięto archiwum w Eksploratorze plików. Spowodowało to uruchomienie programu PeaZip, który w tym systemie domyślnie obsługuje pliki zip. W oknie tego programu dwukrotnie kliknięto w plik procexp.exe, co spowodowało uruchomienie Process Explorera z katalogu tymczasowego.
Rysunek 6. Process Explorer uruchomiony jako proces potomny PeaZip.
Wyszukiwanie procesów i wyświetlanie szczegółowych danych
Process Explorer może dostarczyć bardzo szczegółowych informacje o procesach.
Po podwójnym kliknięciu procesu w tabeli pokaże się okienko właściwości, tak jak pokazano na Rysunku 7.
Rysunek 7. Okienko właściwości procesu Spotify.exe z wyświetloną kartą Threads.
W okienku Properties możemy przejrzeć informacje o procesie w kategoriach:
- Image – zobaczymy tu atrybuty pliku wykonywalnego (image), takie jak ścieżka, użyte argumenty linii komend do uruchomienia, nazwa użytkownika na których prawach działa program, czy jest uruchamiany automatycznie itp. Na tej karcie możemy też zweryfikować podpis cyfrowy pliku, a także wyliczyć jego skrót SHA-1 i sprawdzić jego reputację w serwisie Virustotal;
- Performance / Performance Graph / Disk and Network / GPU Graph – to wykresy i mierniki wydajności procesu;
- Threads – pokazuje informacje o wątkach procesu. Dla każdego wątku odczytać jego identyfikator (TDI), obciążenie procesora, adres w pamięci itp. Wybrane wątki możemy też zatrzymywać (Kill) lub zawieszać (Suspend);
- TCP/IP – pokazuje aktywność sieciową procesu;
- Security – informacje bezpieczeństwa procesu, takie jak nazwa użytkownika czy członkostwo grup, w których kontekście działa proces;
- Environment – pokazuje wartości zmiennych środowiskowych, które zostały odczytane przez proces;
- Job – wyświetla informacje o zadaniach (jobs) przypisanych do procesu. Zadania to specjalne grupy procesów, które mogą być zarządzane jako osobne jednostki. Przykładowo Docker uruchamiając kontenery, może za pomocą zadań kontrolować CPU, pamięć oraz operacje I/O dla poszczególnych kontenerów;
- Strings – listuje fragmenty pamięci programu, które zawierają ciągi znaków;
- Services – jeżeli wybierzemy proces związany z usługami Windows, w karcie Services zobaczymy listę wszystkich usług, w których proces jest zarejestrowany. W tym samym miejscu możemy zarządzać uprawnieniami wypisanych usług, a także zatrzymywać je czy też restartować.;
- .NET (Assemblies / Performance) – pokazuje atrybuty specyficzne dla środowiska .NET;
Informacje na kartach są aktualizowane na bieżąco, oczywiście nic nie stoi na przeszkodzie, aby jednocześnie otworzyć właściwości kilku procesów, a nawet wielokrotnie otworzyć okno właściwości tego samego procesu. W ten sposób możemy zaprojektować sobie dashboard monitorujący właściwości interesujących nas procesów, tak jak pokazano na Rysunku 8.
Rysunek 8. Uruchomienie kilku okien właściwości obok siebie tworzy dashboard do monitorowania procesu.
Process Explorer daje nam kilka możliwości odnajdywania interesujących nas procesów.
Na górnej belce zlokalizowane jest pole tekstowe z filtrem nazwy procesów. To najszybszy i najbardziej intuicyjny sposób znajdowania procesów o znanej nazwie. Dostęp do filtrowania można uzyskać też przez skrót klawiszowy CTRL+F.
Jeżeli widzimy okno programu, ale nie znamy jego nazwy, w takim wypadku do lokalizacji procesu przyda się narzędzie Find Window’s Process. Aktywuje się go przez naciśnięcie i przytrzymanie ikony celownika z górnej belki Process Explorera, co zostało przedstawione na Rysunku 9. Przeciągając celownik na okno programu, a następnie zwalniając przycisk myszy, zobaczymy, że Process Explorer wskaże nam proces wskazanego programu.
Rysunek 9. Namierzanie procesu wskazanego okna programu.
Możemy też wyszukiwać procesy po uchwytach, jakimi zarządzają. Przydaje się to chociażby w sytuacji, gdy nie możemy usunąć lub zmodyfikować pewnego pliku, z powodu otwarcia go w innym, nieznanym nam programie. Blokujący dostęp program możemy w takiej sytuacji zlokalizować przez wybranie menu Find > Find handle or DLL Process Explorerze, co pokazano na Rysunku 10. W nowym oknie możemy wpisać interesujący nas uchwyt (czyli plik, którego nie możemy zapisać), a następnie po kliknięciu w Search zobaczymy wszystkie procesy, które utrzymują do niego dostęp. W ten sam sposób możemy sprawdzać dostęp do całych katalogów, a także kluczy rejestru.
Rysunek 10. Wyszukiwanie procesów korzystających z konkretnego pliku lub klucza rejestru.
Kolejnym sposobem lokalizowania interesujących nas procesów, jest spojrzenie na ich kolory tła, dzięki czemu w tabeli od razu widać procesy nowo-utworzone (zielone tło) lub procesy przed chwilą zakończone (tło czerwone). Kolory, tak jak inne wartości raportowane przez Process Explorera, są odświeżane co sekundę (z możliwością konfiguracji w zakresie 0,5–10 sekund). Możemy zatrzymać/wznowić odświeżanie danych (w tym kolorów) przez naciśnięcie spacji.
Rysunek 11. Ściąga ze schematem kolorowania procesów, dostępna w menu Options > Configure Colors…
Schemat kolorowania konfiguruje w menu Options opcji Configure Colors…, co pokazano na Rysunku 11. Oto strategia kolorowania domyślnie przyjęta przez Process Explorera:
- New Objects (zielony) – nowo utworzony proces;
- Deleted Objects (jaskrawy czerwony) – proces, który przed chwilą się zakończył (od poprzedniego odświeżenia). Jest to bardzo przydatna opcja, dzięki której możemy zauważyć krótko żyjące procesy;
- Own Processes (blady niebieski) – procesy uruchomione z poziomu tego samego konta, co Process Explorer, a więc najczęściej będą to aplikacje uruchomione przez użytkownika;
- Services (jasno-czerwony) – procesy realizujące usługi systemowe;
- Suspended Processes (szary) – procesy zawieszone (suspended), czyli takie, którym system nie przydziela czasu procesora. Do takiej sytuacji dochodzi przykładowo w momencie wystąpienia krytycznego błędu aplikacji obsługiwanego przez Windows Error Reporting. W Process Explorerze również możemy zawieszać i odwieszać procesy (Process > Suspend/Resume);
- Packed Images (fioletowy) – Process Explorer stara się wykryć dodatkowy, skompresowany (lub zaszyfrowany) kod w obrazie wykonywanego pliku. Jest to cecha szczególnie wykorzystywana przez złośliwe oprogramowanie;
- Immersive Process (jaskrawy niebieski) – w ten sposób oznaczane są aplikacje platformy Universal System Platform (UWP), czyli tzw. aplikacje uniwersalne/modern/metro (w taki sposób zostanie pokolorowana przykładowo aplikacja Xbox Windowsa 11, zainstalowana przez Microsoft Store).
Dodatkowo można włączyć jeszcze kolorowanie względem poniższych warunków:
- Relocated DLLs (żółty) – koloruje biblioteki (np. w panelu DLL), które nie zostały załadowane z innego adresu, niż swój adres bazowy;
- Jobs (brązowy) – wskazuje procesy będące częścią zadań, czyli grupy procesów, którym można jednocześnie np. ograniczyć pamięć lub czas procesora;
- .NET Processes (żółty) – procesy używane przez biblioteki .NET;
- Protected Process (różowy) – wskazuje procesy chronione, czyli oznaczone specjalną flagą (np. PsProtectedSignerAntimalware). Procesy takie wykonywane są najwyższych uprawnieniach i są szczególnie chronione (przykładowo nie można ich zakończyć, nawet mając prawa administratora).
Ćwiczenie – Znalezienie procesów uruchomionych w czasie instalacji czytnika PDF
Za pomocą Process Explorera sprawdź, jakie procesy były uruchamiane podczas instalacji czytnika PDF przez „Asystenta pobierania”.
Gdy będziemy chcieli zrealizować powyższe ćwiczenie, okaże się, że wypisanie listy procesów obserwacja pojawiających się i znikających procesów w systemie wcale nie jest łatwe. Szczególnie gdy analizujemy skomplikowane lub potencjalnie niechciane oprogramowanie.
W poprzedniej części artykułu, za pomocą Autoruns sprawdziliśmy, że asystent pobierania instalatora Ashampoo PDF Reader wprowadza wiele zmian w systemie, ściągając i uruchamiając instalatory innych programów, które rejestrują swoje binarki w autostartach systemu.
W takiej sytuacji najbardziej narzuca się podejście zapisanie stanu procesów systemu w dwóch sytuacjach: tuż przed instalacją czytnika oraz tuż po. Mimo że w Process Explorerze możemy zapisać stan tabeli procesów do pliku tekstowego, narzędzie nie posiada mechanizmu porównywania dwóch zapisanych w ten sposób stanów (czym może pochwalić się Autoruns). Oznacza to, że do analizy różnic między zapisanymi stanami procesów musimy użyć osobnych narzędzi.
Istnieje prostszy sposób realizacji tego ćwiczenia, wykorzystujący do tego funkcję pauzowania odświeżania danych. Oto jak zrealizować ćwiczenie właśnie za pomocą tej funkcji:
Krok 1. Uruchamiamy Process Explorera. Upewniamy się, że narzędzie pracuje na wysokich uprawnieniach, aby mieć dostęp do wszystkich informacji.
Krok 2. Naciskamy spację w głównym oknie Process Explorera. Spowoduje to zatrzymanie odświeżania listy procesów oraz wyświetlenie etykiety „Paused” na dolnej belce programu.
Krok 3. Uruchamiamy Asystenta pobierania Ashampoo PDF Reader. Wykonujemy jego polecenia, akceptując wszystkie domyślnie zaznaczone opcje. Spowoduje to ściągnięcie, a następnie uruchomienie procesów instalatorów nie tylko czytnika PDF, ale też dodatkowych programów „zaoferowanych” przez asystenta.
Krok 4. Po zakończeniu wszystkich instalacji wracamy do Process Explorera i odświeżamy listę za pomocą skrótu F5 (lub przez menu View > Refresh). Lista procesów dalej zostanie zapauzowana, ale kolory procesów zostaną odświeżone. Ważne, aby w tym momencie nie pomylić odświeżenia interfejsu (F5) z ponownym naciśnięciem spacji. Przy takiej pomyłce włączymy odświeżanie wyników co kilka sekund, tracąc możliwość porównania obecnego stanu procesów do stanu sprzed instalacji czytnika.
Po odświeżeniu lokalizujemy procesy zaznaczone na zielono, czyli procesy, które zostały uruchomione między odświeżeniami interfejsu. Rysunek 12. pokazuje, jak wiele procesów niezwiązanych z czytnikiem Ashampoo PDF zostało uruchomionych przez Asystenta pobierania. Moglibyśmy teraz przejść do dalszej analizy tych procesów (np. sprawdzić ich podpisy cyfrowe, parametry linii komend, czy uprawnienia), aby dowiedzieć się, co tak naprawdę zainstalowaliśmy w systemie.
Rysunek 12. Niektóre z procesów uruchomionych w czasie instalacji czytnika PDF.
~Adrian vizzdoom Michalczyk
Super artykuł, dzięki!
Bardzo fajny artykuł, słowa uznania dla autora.
I tak najlepszą funkcją jest find handle or dll i wpisanie litery dysku, który jest zablokowany przez jakiś proces. Wiadomo co ubić, żeby bezpiecznie wysunąć pendriva. :)
Ja tam używałem Process Hacker’a tylko że od 2014 r nie jest już aktualizowany.
System Informer jest kontynuatorem PH.
https://systeminformer.sourceforge.io/about