2012-06-26 15 views
18

Korzystam z programu antywirusowego ESET, a ostatnio zawieszono jego interfejs GUI front-end egui.exe, który pobierał 50% CPU (czyli 100% jednego rdzenia). O dziwo, stwierdziłem, że nie mogę go zabić, nawet z włączonym przywilejem debugowania.Kończenie chronionego procesu antywirusowego

Teraz jestem ciekawy: jak wdrażają taką obronę i czy istnieje sposób na zabicie jej przed napisaniem sterownika jądra?

Proces egui.exe działa pod zwykłym użytkownikiem (nie-administratorem) i próbuję go zabić na różne sposoby przy użyciu konta administracyjnego. Oto, co próbowałem.

  • nie można zabić go z menedżera zadań
  • nie można go zabić za pomocą pskill
  • nie można go zabić za pomocą Process Explorer, ani nie można dołączyć debugera do niego

Potem zacząłem niektóre programowania i stwierdził, że:

  • pod nieuprzywilejowanego użytkownika można go otworzyć z PROSESS_TERMINA Dostęp TE, ale faktyczne wywołanie funkcji TerminateProcess() kończy się niepowodzeniem z błędem 5.

  • pod kontem administratora można go otworzyć przy użyciu dowolnych praw dostępu (po włączeniu oczywiście uprawnienia do debugowania), a następnie wywołań TerminateProcess(), GetKernelObjectSecurity(), SetKernelObjectSecurity() wszystko powiedzie się z powodu błędu 5.

To zdecydowanie wskazuje na jakiś błahy poza tylko ustawienie procesu DACL, ponieważ gdyby nie było zakończyć w DACL, nie byłby w stanie otwórz proces z PROCESS_TERMINATE w pierwszej kolejności. Czy faktycznie przechwytują wywołania interfejsu Win32 API? Jeśli tak, to w jaki sposób? Minęło trochę czasu od kiedy programowałem na niskim poziomie, więc wybacz moją niewiedzę.

+2

Dlaczego chcesz to wiedzieć? :) –

+0

Pliki AV zazwyczaj zawierają komponenty trybu jądra. Gdybyś mógł go zabić tylko dając sobie najwyższe przywileje, byłaby to marna ochrona. –

+0

Czy możesz go zabić, gdy działa normalnie, czy jest to po prostu kiedy zawiesił się, że nie możesz go zabić? – nos

Odpowiedz

6

Jeśli uda Ci się zdobyć "System Virginity Verifier" od Joanny Rutkowskiej, to powinno dać ci całkiem niezły pomysł , gdzie implementują swoje haki. Podobne narzędzia (w tym GMER) można wykorzystać do zbadania, co dzieje się w jelitach systemu. Może wydawać się to dziwne, ale czasami AV używają technik powszechnie spotykanych w złośliwym oprogramowaniu, tj. Technik rootkitów, próbując chronić swoje oprogramowanie przed oszukaniem.

Wygląda na to, że SSDT-Hooking i podobne techniki zostały użyte do "ochrony" procesu. Moim pierwszym strzałem byłoby zawieszenie wszystkich wątków procesu. Większość takich mechanizmów ochrony (zarówno złośliwego oprogramowania, jak i złośliwego oprogramowania) wyzwala tylko przy próbach zakończenia. Ale gdy zawiesisz wszystkie wątki (Process Explorer może to zrobić), żaden z nich nie będzie już zaplanowany przez program planujący (prowadzący do braku użycia procesora).

SSDT (czasami SDT) oznacza tabelę deskryptorów usług systemowych. Jest to tabela z adresami funkcji usług systemowych (numer usługi systemowej stanowiącej indeks). Kiedy wywołasz coś takiego jak CreateFile ze swojej aplikacji Win32, skończy się ona NTDLL wywoływaniem NtCreateFile (== ZwCreateFile w UM). Stamtąd mechanizm (który zmienił się od Windows 2000/XP) będzie różnił się sposobem przejścia w tryb jądra (KM), czyli "ring 0". W każdym razie implementacja NtCreateFile w NTDLL z grubsza wykonuje następujące czynności: przenosi indeks usługi systemowej do rejestru, a następnie wywołuje metodę, która jest używana do przejścia do kodu operacji KM (sysenter w nowszych implementacjach). Przyjeżdżając do KM, handler sprawdzi indeks, odczyta adres funkcji z SSDT, a następnie wywoła tę funkcję. Jest tu jeszcze więcej sprawdzeń stosu UM (kiedy pochodzisz z UM), ale jest to proces w prostych słowach. Kiedy więc przechwycisz funkcjonalność na tym poziomie, możesz uniemożliwić działanie podsystemu, w tym podsystemu Win32. Jednak wiąże się to z kilkoma problemami (twój jest najmniejszy z nich). Większość implementatorów wykonuje złą robotę, którą często można spotkać w złośliwym oprogramowaniu, takim jak rootkit Sony, który zdecydował się umieścić na niektórych płytach audio w 2005 roku. Tak więc odhaczenie jest praktycznie niemożliwe bez ryzyka sprawdzenia błędu i kilku niezależnych fragmentów kodu zahaczających o to samo Indeks SSDT zwykle prowadzi do problemów z powodu lekkomyślności ze strony realizatorów.

Tak zawieszenie wątków wydaje się możliwe, chociaż to pytanie jest oczywiście otwarte (bez znajomości szczegółów sterowników ESET). Jeśli jednak zapobiegnie to również, należy rozważyć zmianę produktów. Zakładam, że wady stabilności systemu takich produktów przeważają nad dodatkową "ochroną", chociaż (ESET) powiedzą wam inaczej.

Inną możliwą metodą może być wstrzyknięcie kodu (np. Przez bibliotekę DLL) i sam proces powinien zadzwonić pod numer ExitProcess. To zależy również od tego, czy ich haczyki pozwalają na tę lukę.

+0

Dzięki! Próbowałem zawiesić wątki (i cały proces) w Process Explorer, który jest również wyłączony. Mogę jednak nadać temu priorytet bezczynności. Sprawdzę narzędzia, o których wspomniałeś: nie wiedziałem o zahaczeniu SSDT, myślę, że właśnie tego szukałem. –

+0

Mogę się mylić, ale myślę, że pamiętam gdzieś, że nie możesz już modyfikować SSDT w Vista/W7: dostaniesz niebieski ekran. –

+1

@Cicada: nie do końca prawda, ale tak, istnieje mechanizm o nazwie Patchguard, w szczególności w wersji x64. Są sposoby na obejście tego, a tym bardziej, że ISV mogą robić rzeczy, których normalnie nie można zrobić jako "zwykłego śmiertelnika". Authentium znalazło drogę do Patchguard jeszcze w czasach Visty, co najwyraźniej skłoniło MS do stworzenia innych sposobów dla ISV. – 0xC0000022L

1

Nie może być różne przypadki, powiedzmy:

  1. Jeśli nić dziecko procesu próbujesz zabić czeka na jakiegoś przedmiotu jądra, to nie zostanie zakończone do czasu oczekiwania została zakończona. Może to spowodować, że aplikacja przestanie odpowiadać. Wszelkie wątki w procesie są oznaczone do zakończenia - jest to jeden z kroków zakończenia procesu;
  2. Takie inteligentne oprogramowanie, takie jak zapory ogniowe, sprzęt AV i inne elementy związane z bezpieczeństwem, zawsze instaluje haki jądra (zwane również przechwytywaniem - przechwytywanie wywołań API, wiadomości lub zdarzeń przekazywanych między obiektami jądra lub komponentem oprogramowania). Zawsze mają tarczę chroniącą siły zewnętrzne.

Otrzymujesz ERROR_ACCESS_DENIED. Nie wiem, przez jakie kroki wszedłeś, ale mogę zasugerować:

  1. Otwórz Menedżera zadań i przejdź do zakładki Procesy;
  2. Kliknij prawym przyciskiem myszy egui.exe i kliknij Właściwości;
  3. Kliknij kartę Zabezpieczenia, a następnie Edytuj.
  4. W oknie Uprawnienia sprawdź swoje poświadczenia;
  5. Dodaj użytkownika i/lub ustaw pełne uprawnienia.

Możesz się z tym pogodzić, bo nawet jeśli uruchomisz swoją aplikację (to, co próbowałeś, jak sądzę) użyje danych logowania na Twoim koncie.

+0

W jaki sposób instalują one haki jądra? Jakie słowa kluczowe należy szukać? Co do reszty sugestii: to system Windows XP, brak "zabezpieczeń" w menedżerze zadań. Process Explorer pokazuje listę grup z flagą "OBOWIĄZKOWE" obok każdego, ale to jest tylko do odczytu i nie jestem pewien co to znaczy. Moje próby odczytu DACL dla procesu kończą się niepowodzeniem, więc nie widzę powodu, dla którego ich sukcesy będą bardziej skuteczne :) Mam wiele kont na komputerze, aplikacja "terminator", którą napisałem, działa pod kontem administratora, w przeciwnym razie na przykład , Nie byłbym w stanie ustawić SeDebugPrivilege. –

+0

Możesz spróbować tego: [link] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959 (v = vs.85) .aspx) – Oleg

+0

Są to haki trybu użytkownika –

Powiązane problemy