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ę.
Dlaczego chcesz to wiedzieć? :) –
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. –
Czy możesz go zabić, gdy działa normalnie, czy jest to po prostu kiedy zawiesił się, że nie możesz go zabić? – nos