Wykryj to usunięcie usługi Windows

9

Czy istnieje sposób na wykrycie, kiedy usługa Windows została usunięta? Sprawdziłem dziennik zdarzeń, ale nie wykrył tylko usuniętych usuniętych działań.

Wydaje mi się, że może istnieć sposób korzystania z dzienników kontroli, ale nie jestem pewien, jak to zrobić?

Każda pomoc jest mile widziana.

Dzięki

BillyDay
źródło

Odpowiedzi:

6

Chociaż nie ma śladu usunięciem usług w Event lub audytu logów, co można zrobić, to stworzyć małą aplikację konsoli, który wykrywa, czy usługa istnieje i dołączyć tę aplikację Windows Task Schedulertak, że jest zaplanowane do wykonania w oparciu o częstotliwość lub wyzwalania że ciebie możesz dostosować do swoich wymagań , aby otrzymywać powiadomienia, jeśli usługa została dodana lub usunięta itp.

Aplikacja konsoli została zaprojektowana w taki sposób, że przy pierwszym uruchomieniu rejestruje wszystkie usługi w systemie, a przy kolejnych uruchomieniach będzie śledzić zmiany wprowadzane w usługach za pośrednictwem servicesRemovedi servicesAddeddzięki temu możemy zdecydować, jakie działania podjąć, gdy usługa ma został zmodyfikowany

Aplikacja konsoli: ServiceDetector.exe

static void Main(string[] args)
{
    var path = @"C:\AdminLocation\ServicesLog.txt";

    var currentServiceCollection = ServiceController.GetServices().Select(s => s.ServiceName).ToList(); //Queries the most current Services from the machine

    if (!File.Exists(path)) //Creates a Log file with current services if not present, usually means the first run
    {
        // Assumption made is that this is the first run
        using (var text = File.AppendText(path))
        {
            currentServiceCollection.ForEach((s) => text.WriteLine(s));
        }
        return;
    }

    // Fetches the recorded services from the Log
    var existingServiceCollection = File.ReadAllLines(path).ToList();

    var servicesRemoved = existingServiceCollection.Except(currentServiceCollection).ToList();
    var servicesAdded = currentServiceCollection.Except(existingServiceCollection).ToList();

    if (!servicesAdded.Any() && !servicesRemoved.Any())
    { Console.WriteLine("No services have been added or removed"); return; }

    //If any services has been added
    if (servicesAdded.Any())
    {
        Console.WriteLine("One or more services has been added");
        using (var text = File.AppendText(path))
        {
            servicesAdded.ForEach((s) => text.WriteLine(s));
        }
        return;
    }
    //Service(s) may have been deleted, you can choose to record it or not based on your requirements
    Console.WriteLine("One or more services has been removed");

}

Planowanie zadania

Windows Start> Harmonogram zadań> Utwórz zadanie podstawowe> Ustaw wyzwalacz> Załącz plik exe> Zakończ

Clint
źródło
Dzięki za sugestię. Problemem jest to, że może to być dowolna usługa, której nie znam szczególnie na nazwę usługi, która zostanie usunięta.
BillyDay
@BillyDay, ahh, widzę, zaktualizowałem odpowiedź
Clint
Myślę, że to najlepsze podejście. Utworzę usługę, która działa przy starcie i pętli, i wykryję, kiedy usługa zostanie usunięta, i albo zapiszę do pliku, albo podniosę i zdarzenie. Dzięki
BillyDay
0

Masz rację, że usunięcie usługi systemu Windows powoduje dodanie zdarzenia do dziennika zdarzeń systemowych (źródło: /superuser/1238311/how-can-we-detect-if-a-windows- service-is-delete-is-there-an-event-log-id-for-i ).

AFAIK nie ma żadnych zasad audytu do kontrolowania usunięcia usługi i myślę, że gdyby tak było, myślę, że byłoby to tutaj: https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/ podstawowe śledzenie procesu audytu

Zakładam, że odpytywanie nie ServiceController.GetServices()wchodzi w rachubę, ponieważ Twój program może nie działać po odinstalowaniu usługi?

Simon-Pearson
źródło
Dokładnie mój proces może nie być uruchomiony.
BillyDay
Ok, myślę, że nie masz szczęścia wtedy @BillyDay
Simon-Pearson
Dlaczego nie po prostu sprawdzić plik związany z tą usługą ... np. MyService.exe
5
możesz również sprawdzić rejestr, aby upewnić się, że usługa istnieje HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services, jeśli chcesz się upewnić, że żadna usługa nie zostanie usunięta, musisz dodać własną pamięć podręczną
Johnny 5
0

Istnieje wiele sposobów budowania oprzyrządowania, dopóki nie dowiesz się, co stanowi dobre oprzyrządowanie. Moje instrukcje pochodzą zasadniczo od wpisu w Wikipedii https://en.wikipedia.org/wiki/Instrumentation .

Poradniki na temat oprzyrządowania

http://www.powersemantics.com/e.html

  • Niezintegrowane
  • Tylko dane podstawowe
  • Nie ciągnij
  • Zorganizowane według procesu
  • Nigdy offline

Rozwiązanie problemu pomiaru wskaźników istnieje, ale utknąłeś w wyobrażaniu sobie, w jaki sposób oprzyrządowanie „push” może sygnalizować inny system. Jak wyjaśnia mój artykuł E, instrumenty powinny zawsze pobierać dane, nigdy ich nie popychać. Sygnalizacja zdarzeniowa jest potencjalnym punktem awarii, którego nie potrzebujesz.

Aby wyjaśnić wszelkie niezdecydowanie lub wątpliwości związane z budowaniem oddzielnej aplikacji, monitory są zwykle niezależnymi ( niezintegrowanymi, jak mówi Wikipedia) procesami. Mówiąc, że Twój monitor „może nie działać” oznacza, że ​​nie zdecydowałeś się zbudować prawdziwego niezintegrowanego monitora, który zawsze jest włączony. Twój system konsumencki nieprawidłowo modeluje oprzyrządowanie, ponieważ integruje kontrolę we własnym procesie.

Rozdziel te obowiązki i kontynuuj. Zdecyduj, jak często instrument powinien racjonalnie odpytywać o usunięte usługi i sondować dane za pomocą timera. Jeśli użyjesz sugerowanego wywołania API simon-pearson, możesz również wykryć, kiedy usługi zostały dodane. Oczywiście monitor musi lokalnie buforować kopię listy usług, aby wskaźniki mogły wywnioskować, co zostało dodane lub usunięte.

RBJ
źródło