Izolacja procesów systemowych

Disclaimer: opisywane czynności nie są informacjami stricté technicznymi! jest to opis dokonany po własnoręcznych doświadczeniach “zabawy” z systemem. nieumiejętne korzystanie z edytora rejestru może spowodować, że uszkodzisz swój system!

Services

Kiedy zajrzy się do listy procesów systemowych okaże się, że usługi systemowe w w2k+ nie są uruchamiane jako oddzielne procesy. W zamian można zobaczyć, że działa kilka procesów o nazwie svchost. Osobom, które tego jeszcze nie zrobiły, polecam ściągnąć niezastąpione narzędzie, jakim jest Process Explorer. Można co prawda posłużyć się poleceniem 'tasklist /svc', aby uzyskać informacje o tym, który svchost przetrzymuje którą usługę… tylko po co?
Oto widok usług, obsługiwanych przez najbardziej przeciążonego svchosta - netsvcs:

svchost.jpg
Jak widać jest ich całkiem sporo. Kilkukrotnie szukałem dobrego wyjaśnienia, czemu procesy rozłożone są tak a nie inaczej, czy na prawdę wpływa to na wydajność lub chroni zasoby - i nie udało mi się póki co odpowiedzi na to pytanie znaleść. Generalnie svchost jest głównym procesem, uruchmiającym usługi w postaci DLL, co można porównać do programu master i pluginów. Tylko czemu są one rozłożone tak a nie inaczej?

Po co izolować?

Windows jaki jest, każdy widzi. Są osoby, które mając problem z windą - reinstalują ją. To najgorszy z możliwych sposobów, bo problemy są jak bumerangi. Nie dywagując nad sensownością tego rodzaju rozwiązywania problemu - jak pokazuje google svchost potrafi zdenerwować (ja miałem ponad 75o.ooo wyników), i często odpowiedzią jest - “trzeba najpierw sprawdzić, który konkretnie serwis jest przyczyną”.
W moim przypadku, do izolacji procesów pchnął mnie problem z zawieszającym się modemem GPRS. Po zawieszeniu się modemu, zwisały również procesy TapiSrv oraz RasMan. Oba te procesy znajdują się w obrębie przedstawionego powyżej svchosta, więc skillowanie czy restart wiązały się w restartem maszyny. O ile wyizolowanie nie rozwiązało ostatecznie mojej sytuacji [nawet po restarcie procesów nie mogłem się połączyć], o tyle bez restartu mogłem przywrócić serwisy do działania… nie wspominając o zabawie, jaką jest zawsze grzebanie w rejestrze i adrenalinka “rozleci sie ta winda, czy sie nie rozleci?” (;.

Izolacja - jak

Jeśli z jakiegoś powodu chciałbyś, drogi czytelniku, wyizolować którąś z usług systemowych, zapoznaj się najpierw z tym artem ze strony Microsoftu. Wyjaśni on kilka podstawowych kwestii dotyczących bohatera niniejszego textu, i ujawni dwie bardzo ważne informacje, które są clue do izolacji procesu systemowego do oddzielnego mastera. Informacje te, to dwa klucze rejestru, które pokazują gdzie będzie należało dokonać zmian:

HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Svchost
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\%ServiceName%

A zmian należy dokonać w obu kluczach. Ale zanim się do tego przystąpi, proponuję oba wymienione klucze zbackupować - wystarczy je wyexportować do rega za pomocą regedita.

Po pierwsze trzeba stworzyć nowego svchosta, modyfikując pierwszy klucz:

SvcHost:
  (Default)       REG_MULTI_SZ (value not set)
  DcomLaunch      REG_MULTI_SZ  HttpFilter
  imgsvc          REG_MULTI_SZ  StiSvc
  LocalService    REG_MULTI_SZ  Alerter WebClient LmHosts RemoteRegistry upnphost SSDPSRV
  netsvcs         REG_MULTI_SZ  6to4 AppMgmt AudioSrv Browser CryptSvc DMServer \
                   DHCP ERSvc EventSystem FastUserSwitchingCompatibility HidServ Ias Iprip \
                   Irmon LanmanServer LanmanWorkstation Messenger Netman Nla Ntmssvc NWCWorkstation \
                   Nwsapagent Remoteaccess Schedule Seclogon SENS Sharedaccess SRService Themes \
                   TrkWks W32Time WZCSVC Wmi WmdmPmSp winmgmt TermService wuauserv BITS ShellHWDetection \
                   helpsvc xmlprov wscsvc WmdmPmSN Rasauto Rasman Tapisrv
  NetworkService  REG_MULTI_SZ  DnsCache
  rpcss           REG_MULTI_SZ  RpcSs
  termsvcs        REG_MULTI_SZ  TermService

Oczywistym jest, że jest to informacja jak są poprzydzielane procesy, i że niemal wszystkie usługi sieciowe zostały pchnięte do jednego procesu master, o nazwie netsvcs. Dodajmy swój własny klucz:

  Telephony       REG_MULTI_SZ  Rasauto Rasman Tapisrv Netman

Następnie wszystkie 4 wartości wymienone w nowym kluczu, należy usunąć z netsvcs.

Należy się tu chwilka wyjaśnienia - czemu akurat cztery procesy a nie jeden? Otóż jak się okazło, niektóre procesy będące w obszarze innego mastera, nie potrafiły się wzajemnie komunikować [nie wiem jak bardzo to stwierdzenie odzwierciedla rzeczywisty mechanizm, ale fakt jest iż] - jeśli wyizolowało się tylko serwis TapiSrv (telephony), to Netman, który jest odpowiedzialny m.in. za wyświetlanie dostępnych połączeń seciowych (lamersko - ikonek w “network connections”), nie wyświetlał połączeń modemowych. Trzeba zatem zatem urzyć intuicji co do powiązania między procesami, lub poszukać jakiegoś stricté technicznego dokumentu opisującego te zależności. Osobiście wątpie, aby takowy istniał [jeśli znajdziesz - sprawisz mi olbrzymią radość, podsyłając linka! (:]. Z tego też powodu, niestety, nigdy nie będzie się miało pewności, czy dokonanie izolacji nie wpłynie w jakimś stopniu na funkcjonalność systemu.

Następnie trzeba dodać gałąź o nazwie stworzonego klucza, i wpisać tam dwa klucze, dokładnie tak, jak jest to w netsvc:

  SvcHost
    netsvcs
      AuthenticationCapabilities  REG_DWORD 0x00003020 (12320)
      CoInitializeSecurityParam   REG_DWORD 0x00000001 (1)
    Telephony
      AuthenticationCapabilities  REG_DWORD 0x00003020 (12320)
      CoInitializeSecurityParam   REG_DWORD 0x00000001 (1)

… tak na prawde bardziej poprawnym, byłoby stwierdzenie “wydaje mi się, iż trzeba”. Klucz o wartości 1 (ten co-cośtam) definiuje, iż ma być brany pod uwagę ten pierwszy (auth-cośtam). Ten z kolei, jest maskowym zapisem uprawnień, jakie mają procesy z niego korzystające. Szczegółów można szukać w SDK, w kodzie bibliotek. Myślę, że nawet developerzy korzystają z API, żeby niewiedzieć takich szczegółów - i ja także nie dociekałem. Czynność wykonałem “na intuicję”.


To, co pozostało do zrobienia, to zdefiniowanie w odpowiednich kluczach, odpowiedzialnych za wymienione 4 procesy, iż powinny uruchamiać się w oddzielnym svchoście. W każdej z gałęzi:


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rasauto
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TapiSrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netman

znajduje się klucz o wartości:

ImagePath REG_EXPAND_SZ %SystemRoot%\System32\svchost.exe -k netsvcs

Nie cięzko się domyśleć, iż “netsvcs” należy zmienić na własną wartość - w opisywanym przypadku - “telephony”.

Teraz już tylko restart systemu - i voilá
svchost2.jpg

Refs

Komentarze (1)

  1. strasznyfilm napisał:

    sa takie procesy ktore sie uruchamiaja i sa nieurzywane bo np przegladasz tylko int. albo grasz to po co ci uruchomiony proces do javy czy jakiegos odtwarzacza filmow a trojany niech sobie sa ;p

Dodaj komentarz

Sprawdzanie komentarzy jest włączone i może opóźnić pojawienie się Twojego komentarza.