Im Gegensatz zu dem, was viele Leute glauben, gibt es tatsächlich mehrere Möglichkeiten, dies zu tun. Einige von ihnen sind häufig, andere selten zu sehen. Einige von ihnen sind schwach, andere stark. Es hängt alles davon ab, wie Sie es tun.
Lassen Sie uns eine Sammlung davon durchgehen:
1. Pre-NT RegisterServiceProcess
Trick
Windows 9x und andere Pre-NT-Betriebssysteme hatten in kernel32.dll eine undokumentierte API namens RegisterServiceProcess
, die (wie der Name schon sagt) registriert den Prozess als Systemdienst. Nachdem ein Prozess diese Funktion aufgerufen hatte, hielt das Betriebssystem sie für kritisch und erlaubte dem Task-Manager nicht, sie zu beenden. Diese Funktion wurde entfernt, als NT auf den Markt kam, sodass sie unter XP oder höher nicht funktioniert.
2. Tricks zur Prozessbenennung
In WinXP enthielt die ausführbare Datei des Task-Managers eine fest codierte Liste von Prozessnamen, die nicht beendet werden sollten, und stattdessen eine Meldung wie die von Ihnen erwähnte. Diese betrafen im Wesentlichen die kritischen Systemdienste wie smss.exe
und rpcss.exe
. Das Problem war, dass der Pfad nicht überprüft wurde, sodass jede andere ausführbare Datei mit demselben Namen zu einem nicht tötbaren Prozess führen würde. Dieser Trick verhindert nicht, dass der Prozess per se beendet wird, sondern verhindert, dass der Windows XP-Task-Manager den Prozess beenden kann. Es ist weiterhin möglich, ein anderes Tool zu verwenden, um den Prozess abzubrechen.
3. Keep-Alive-Prozesse
Diese sind bei weitem am häufigsten. Es werden zwei Prozesse erstellt, die wiederholt auf die Existenz des anderen prüfen. Wenn einer getötet wird, lässt der andere ihn wieder auferstehen. Dies hindert Sie nicht daran, den Prozess wirklich zu beenden, aber es macht es ärgerlich, zu verhindern, dass der Prozess zurückkommt.
Der Task-Manager enthält eine Option zum Beenden des Prozessbaums, mit der Sie einen Prozess und alle untergeordneten Prozesse beenden können, um dieses Problem zu beheben. Wenn ein Prozess in Windows erstellt wird, verfolgt das Betriebssystem die Prozess-ID, die ihn erstellt hat. Der Prozessbaum "Kill" durchläuft alle Prozesse und sucht nach Personen, deren übergeordnete ID der Prozess-ID entspricht, die Sie beenden. Da Keep-Alive-Prozesse normalerweise bei einer wiederholten Abfrage ausgeführt werden, können Sie beide Prozesse beenden, bevor sie feststellen, dass ein Fehler aufgetreten ist.
Eine Verteidigung dagegen besteht darin, einen Dummy-Prozess zu erstellen, der dann den Keep-Alive-Prozess auslöst Lassen Sie diesen Dummy-Prozess beenden. Der Hauptprozess übergibt seine ID an den Dummy-Prozess, und der Dummy-Prozess übergibt seine ID an den Keep-Alive-Prozess. Die Kette wird jedoch unterbrochen, wenn der Dummy-Prozess beendet wird. Dadurch bleiben sowohl der primäre als auch der Keep-Alive-Prozess ausgeführt, es ist jedoch unmöglich, die Kill-Prozessbaumfunktion des Task-Managers zu verwenden. Stattdessen müssten Sie ein Skript schreiben, um sie zu beenden, oder ein Tool verwenden, mit dem Sie mehrere Prozesse gleichzeitig beenden können.
4. Hooks im Benutzermodus über geladene DLLs
Es ist möglich, eine DLL in einen laufenden Prozess einzufügen. Tatsächlich bietet Windows eine Funktion, mit der jede DLL aus Gründen der Erweiterbarkeit in alle Prozesse geladen werden kann, die user32.dll importieren. Diese Methode wird als AppInit-DLLs bezeichnet. Sobald eine DLL eingefügt wurde, kann sie den Speicher des Prozesses manipulieren. Es ist dann möglich, die Werte bestimmter Funktionszeiger so zu überschreiben, dass der Aufruf an eine Stub-Routine umgeleitet wird, die dann die Zielfunktion aufruft. Diese Stub-Routine kann verwendet werden, um die Parameter zu filtern oder zu manipulieren und Werte eines Funktionsaufrufs zurückzugeben. Diese Technik wird als Hooking bezeichnet und kann sehr leistungsfähig sein. In diesem Fall ist es möglich, eine DLL in laufende Prozesse einzufügen, die OpenProcess
und TerminateProcess
verknüpfen, um sicherzustellen, dass keine Anwendung einen Handle für Ihren Prozess erhalten oder ihn beenden kann . Dies führt in gewisser Weise zu einem Wettrüsten, da alternative APIs im Benutzermodus zum Beenden von Prozessen verwendet werden können und es schwierig ist, sie alle zu verknüpfen und zu blockieren, insbesondere wenn wir nicht dokumentierte APIs in Betracht ziehen.
5 . Hooks im Benutzermodus über injizierte Threads
Dieser Trick funktioniert genauso wie bei DLLs, außer dass keine DLL-Datei benötigt wird. Ein Handle für den Zielprozess wird erstellt, ein Teil des Speichers wird über VirtualAllocEx
darin zugewiesen, Code und Daten werden über WriteProcessMemory
in den Speicherblock kopiert und ein Thread wird in erstellt der Prozess über CreateRemoteThread
. Dies führt dazu, dass in einem Zielprozess Fremdcode ausgeführt wird, der dann verschiedene Hooks auslösen kann, um zu verhindern, dass ein Prozess beendet wird.
6. Call-Hooks im Kernel-Modus
Im Kernel gibt es eine spezielle Struktur namens System Service Dispatch Table (SSDT), die Funktions-IDs von Aufrufen im Benutzermodus in Funktionszeiger auf Kernel-APIs abbildet. Diese Tabelle dient zum Übergang zwischen Benutzermodus und Kernelmodus. Wenn ein böswilliger Treiber geladen werden kann, kann er die SSDT so ändern, dass anstelle der richtigen API eine eigene Funktion ausgeführt wird. Dies ist ein Kernel-Modus-Hook, der ein Rootkit darstellt. Im Wesentlichen ist es möglich, die Wolle über die Augen des Betriebssystems zu ziehen, indem falsche Daten von Anrufen zurückgegeben werden. Tatsächlich ist es möglich, den Prozess nicht nur nicht tötbar, sondern auch unsichtbar zu machen. Ein Problem bei x64-Builds ist, dass der SSDT durch Kernel Patch Protection (KPP) geschützt ist. Es ist möglich, KPP zu deaktivieren, dies hat jedoch weitreichende Konsequenzen, die die Entwicklung eines Rootkits erschweren können.
7. Direkte Kernel-Objektmanipulation (DKOM)
Dieser Trick beinhaltet auch das Laden eines böswilligen Treibers auf dem Betriebssystem, erfordert jedoch keine Änderung des SSDT. Prozesse auf dem System werden als EPROCESS
-Strukturen im Kernel gespeichert. Beachten Sie, dass diese Struktur vollständig versionierungsabhängig ist und nur teilweise von Microsoft dokumentiert wird. Daher ist für mehrere Zielversionen ein Reverse Engineering erforderlich, um sicherzustellen, dass der Code nicht versucht, die falschen Zeiger oder Daten zu lesen. Wenn Sie jedoch EPROCESS
-Strukturen im Kernel erfolgreich suchen und auflisten können, können Sie sie bearbeiten.
Jeder Eintrag in der Prozessliste verfügt über einen Zeiger FLink
und BLink
, die auf den nächsten und vorherigen Prozess in der Liste verweisen. Wenn Sie Ihren Zielprozess identifizieren und die Zeiger FLink
und BLink
auf sich selbst verweisen lassen und der FLink
und BLink
Wenn seine Geschwister aufeinander zeigen, überspringt das Betriebssystem einfach Ihren Prozess, wenn Sie Reinigungsarbeiten ausführen, z Tötungsprozesse. Dieser Trick wird als Aufheben der Verknüpfung bezeichnet. Dies macht den Prozess nicht nur für den Benutzer unsichtbar, sondern verhindert auch, dass alle Benutzermodus-APIs auf den Prozess abzielen, es sei denn, ein Handle für den Prozess wurde generiert, bevor die Verknüpfung aufgehoben wurde. Dies ist eine sehr leistungsfähige Rootkit-Technik, insbesondere weil es schwierig ist, sich davon zu erholen.
8. Debugger-Tricks
Dies ist ein ziemlich cooler Trick, den ich in freier Wildbahn noch nicht gesehen habe, der aber recht gut funktioniert. Die Windows-Debugger-API ermöglicht es jedem Prozess, einen anderen zu debuggen, sofern er über die entsprechenden Berechtigungen verfügt. Wenn Sie die Debugger-API verwenden, können Sie einen Prozess in einen "debuggten" Zustand versetzen. Wenn dieser Prozess einen Thread enthält, der derzeit von einem Debugger angehalten wird, kann der Prozess von Windows nicht beendet werden, da die ordnungsgemäße Thread-Kontrolle während der Beendigung nicht garantiert werden kann, wenn der Thread blockiert ist. Wenn Sie den Debugger beenden, wird der Prozess natürlich nicht mehr debuggt und entweder geschlossen oder stürzt ab. Es ist jedoch manchmal möglich, eine Situation zu erzeugen, in der eine Kette von Prozessen existiert, die sich gegenseitig in einer Schleife debuggen. Wenn jeder Prozess einen Dummy-Thread im nächsten anhält, kann keiner beendet werden. Beachten Sie, dass es einem Benutzer möglich ist, andere Threads innerhalb des Prozesses manuell zu beenden, wodurch sie unbrauchbar werden, aber dennoch nicht beendet werden.
9. Windows 8 DRM
Dies ist eine neue, von der ich erst kürzlich gehört habe, aber ich weiß nicht viel darüber. Auf Twitter ging ein Gerücht um, und ich habe hier und da auf verschiedenen technischen Websites Ausschnitte gesehen, aber ich habe noch keine konkreten Nachforschungen angestellt. Ich denke, es ist noch früh. Im Wesentlichen geht es darum, dass Windows 8 über einen Mechanismus verfügt, mit dem "vertrauenswürdige Anbieter" Prozesse als DRM-kritisch registrieren können, um zu verhindern, dass sie vom Benutzer getötet oder manipuliert werden. Einige Leute haben spekuliert, dass der Mechanismus zur Überprüfung vertrauenswürdiger Anbieter schwach ist und möglicherweise angegriffen werden kann.< - Sieht so aus, als wäre dieser gefälscht. Soviel zur Gerüchteküche! Strike>
Update: Harry Johnston wies in den Kommentaren darauf hin, dass Windows 8.1 geschützte Dienste einführt, die für die Verwendung durch AV und entwickelt wurden DRM zum Schutz vor Manipulation oder Angriff durch Code mit niedrigeren Berechtigungen auf dem System.
10. Werkzeugmanipulation
Dieser wurde wahrscheinlich viel in freier Wildbahn verwendet, aber ich habe noch nie gesehen, dass er richtig ausgeführt wurde. Im Wesentlichen beinhaltet dieser Trick das Targeting spezifischer Werkzeuge, z. Task-Manager, indem Sie die ausführbaren Dateien auf der Festplatte so bearbeiten, dass die Funktionalität geändert wird. Dies ist den zuvor erwähnten Hook-Tricks im Benutzermodus sehr ähnlich, aber in diesem Fall bleiben sie auf der Festplatte bestehen und haben weitreichendere Konsequenzen als einfaches API-Hooking. Ein Problem ist natürlich, dass Windows File Protection (WFP) die Änderung bestimmter kritischer Systemdateien, einschließlich des Task-Managers, verhindert. Amüsanterweise ist es jedoch möglich, den ausführbaren Pfad des Standard-Task-Managers über die Registrierung zu ändern. Anstatt mit der ausführbaren Datei des Task-Managers herumzuspielen, sichern Sie einfach Ihre eigene Version irgendwo und lassen Sie das Betriebssystem sie verwenden.
Alles in allem gibt es viele Möglichkeiten, dies mit unterschiedlichem Grad an Robustheit zu erreichen. Das Obige stellt eine Mehrheit von ihnen dar, ist jedoch nicht erschöpfend. Tatsächlich können viele der von mir beschriebenen Tricks auf alternative Weise erreicht werden, indem verschiedene Mechanismen oder APIs verwendet werden, um dasselbe Ziel zu erreichen.