it-swarm.com.de

Erstellen Sie einen nicht endbaren Prozess in Windows

Ich bin ein Student und bin wirklich neugierig auf nicht endbare Prozesse in Windows.

Zu Bildungszwecken möchte ich eine Anwendung (möglicherweise in VB6?) Erstellen, die von einem Benutzer nicht über den Task-Manager oder den Taskkill beendet werden kann. Welche Strategien und Exploits setzen solche Anwendungen ein, um dies zu ermöglichen?

41
user20825

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 von ihnen durchgehen:


1. Pre-NT RegisterServiceProcess Trick
Windows 9x und andere Betriebssysteme vor NT hatten in kernel32.dll eine undokumentierte API namens RegisterServiceProcess, die den Prozess (wie der Name schon sagt) als Systemdienst registriert. 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 auftauchte, daher funktioniert sie nicht auf XP oder höher).

2. Prozessbenennungstricks
Zurück in WinXP enthielt die ausführbare Datei des Task-Managers eine fest codierte Liste von Prozessnamen, die nicht beendet werden sollten, und zeigte stattdessen eine Nachricht wie die von Ihnen erwähnte an. Diese deckten 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 zum Beenden zu verwenden der Prozess.

3. Keep-Alive-Prozesse
Diese sind bei weitem die 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 wiederholten Abfragen 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 den Keep-Alive-Prozess erzeugt, und diesen Dummy-Prozess dann zu 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 einzufügen in einen laufenden Prozess. Tatsächlich bietet Windows eine Funktion zum Laden von DLL in alle Prozesse, die user32.dll importieren, um die Erweiterbarkeit zu gewährleisten. Diese Methode wird als AppInit-DLLs bezeichnet. Einmal a DLL eingefügt wird, kann dies 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 und Rückgabewerte eines Funktionsaufrufs zu filtern oder zu manipulieren. Diese Technik heißt Hooking und kann sehr leistungsfähig sein. In diesem Fall wäre es möglich, a zu injizieren DLL in laufende Prozesse, die OpenProcess und TerminateProcess einbinden, um sicherzustellen, dass keine Anwendung einen Handle für Ihren Prozess erhalten oder ihn beenden kann. Dies führt etwas 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. Benutzermodus-Hooks ü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, Code und Daten werden über WriteProcessMemory in den Speicherblock kopiert, und im Prozess wird über CreateRemoteThread ein Thread erstellt. Dies führt dazu, dass ein Teil des Fremdcodes innerhalb eines Zielprozesses ausgeführt wird kann dann verschiedene Hooks auslösen, um zu verhindern, dass ein Prozess abgebrochen wird.

6. Call-Hooks im Kernel-Modus
Im Kernel gibt es eine spezielle Struktur namens System Service Dispatch Table (SSDT), die Funktions-IDs aus Aufrufen im Benutzermodus in Funktionszeiger auf Kernel-APIs abbildet. Diese Tabelle wird zum Übergang zwischen Benutzermodus und Kernelmodus verwendet. 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 zurückweisen und die Zeiger FLink und BLink seiner Geschwister aufeinander zeigen Das Betriebssystem überspringt einfach Ihren Prozess, wenn Sie Reinigungsvorgänge 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, aber er funktioniert ganz gut. 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 kann nicht Von Windows beendet werden, da eine 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 ist einem Hauptbenutzer möglich ist, andere Threads innerhalb des Prozesses manuell zu beenden, wodurch es unbrauchbar wird, aber es wird trotzdem nicht beendet.

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 gab es ein Gerücht darüber, und ich habe hier und da Ausschnitte auf verschiedenen technischen Websites 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 aus wie dieser war falsch. Soviel zur Gerüchteküche!

Update: Harry Johnston wies in den Kommentaren darauf hin, dass Windows 8.1 geschützte Dienste einführt, die von AV und DRM verwendet werden sollen, um vor Manipulationen oder Angriffen durch Code mit niedrigeren Berechtigungen auf dem System zu schützen.

10. Werkzeugmanipulation
Dieser wurde wahrscheinlich viel in freier Wildbahn verwendet, aber ich habe noch nie gesehen, dass er richtig gemacht 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.

96
Polynomial

Ich glaube nicht, dass das, was Sie versuchen, möglich ist. Sie müssten das Betriebssystem untergraben, um zu verhindern, dass ein Prozess beendet werden kann. Alle Prozesse werden innerhalb des Betriebssystems ausgeführt, daher kann das Betriebssystem jeden Prozess beenden. Sie können sogar Prozesse wie "Explorer.exe" beenden, mit denen das Startmenü und der Desktop ausgeführt werden.

Die meisten Programme, die als "nicht tötbar" erscheinen, können tatsächlich beendet werden. Ein anderes Programm überwacht jedoch deren Ausführung. Wenn der Prozess geschlossen wird, wird es automatisch sofort neu gestartet. Wenn Sie processA beenden, startet processB es und wenn Sie processB beenden, startet processA es. Da Sie beide Prozesse nicht einfach genau zusammen beenden können, wird es sehr schwierig, sie zu entfernen, während das System ausgeführt wird.

Dieselbe Technik wird von mehreren Antiviren-Anbietern sowie dem beliebten Anti-Cheating-Programm PunkBuster verwendet.

Auf älteren Systemen ist es auch möglich, dass der Prozess als Dienst ausgeführt wird. In Windows XP und Windows 2000) kann der Task-Manager keine Prozesse beenden, die vom Service-Manager gestartet wurden, da der Service-Manager in einem anderen Benutzerkontext ausgeführt wird. Auf diesen älteren Systemen wird ein erstellt Der Windows-Dienst kann mit dem Task-Manager nicht direkt beendet werden. In neueren Windows-Versionen kann er jedoch beendet werden.

Es kann hilfreich sein zu sehen, in welchem ​​Kontext der Prozess ausgeführt wird, wenn die Berechtigung verweigert wird. Sie können ein Tool wie Process Explorer aus der SysInternal-Suite verwenden, um zu sehen, unter welchem ​​Benutzerkontext der Prozess ausgeführt wird. Wenn der Benutzerkontext, unter dem der Task-Manager ausgeführt wird, keinen Zugriff auf Kill-Prozesse hat, die unter dem Benutzerkontext ausgeführt werden, unter dem der Prozess ausgeführt wird, schlägt der Kill fehl.

Verwandte Informationen sind für Superuser unter dieser Frage verfügbar https://superuser.com/questions/109010/kill-a-process-which-gives-access-denied . Es scheint, dass es eine Sicherheitseinstellung pro Prozess gibt, die angewendet werden kann, um das Recht zum Töten zu entfernen. Dies könnte programmgesteuert erfolgen und das Beenden erschweren. Ein Administrator könnte jedoch weiterhin die Verantwortung für den Prozess übernehmen und dann die Berechtigungen zurücksetzen, um das Beenden zu ermöglichen. Die speziellen Windows-APIs sind CreateProcessWithTokenW und SetSecurityInfo.

8
AJ Henderson

Wie von AJ erwähnt, ist letztendlich das Betriebssystem verantwortlich. Es entscheidet, ob ein Prozess beendet werden kann, wann er beendet wird, wie usw. Bestimmte Prozesse können durch das Betriebssystem "geschützt" werden, wodurch verhindert wird, dass sie beendet werden, oder wie es auch der Fall ist, kann der Prozess technisch beendet werden, aber Das Beenden des Prozesses löst ein Herunterfahren der gesamten Maschine aus.

Wenn Sie Malware schreiben und es unmöglich machen möchten, einen Prozess abzubrechen, ist es am besten, das Betriebssystem zu ändern, um dies zu verhindern. Dies kommt nicht in Frage und ist tatsächlich etwas, worüber Autoren bereits nachgedacht haben. Tatsächlich sind Änderungen am Betriebssystem zum Schutz von Ressourcen ein so häufiger Thread, dass sie einen Namen dafür haben: " rootkit ".

Wie ändern Sie das laufende Betriebssystem? Glücklicherweise sind alle modernen Betriebssysteme so geschrieben, dass Sie solche Änderungen vornehmen können. Schreiben Sie einfach ein Kernelmodul (a.k.a. "Treiber"). Es gibt sogar ein Development Kit , um Ihnen den Einstieg zu erleichtern.

Sobald Sie dort sind, verknüpfen Sie einfach den Codepfad, der die Prozesssteuerung übernimmt, und geben Sie Ihre kleine Ausschlussregel ein. Weitere Informationen finden Sie in den Rootkits.

1
tylerl

Es ist keine gute Idee, einen wirklich nicht tötbaren Prozess zu erstellen. Es ist jedoch durchaus möglich, einen Prozess davor zu schützen, von einem anderen Benutzer als einem Administrator beendet zu werden. Administratoren haben und sollten vollen Zugriff auf den Prozess haben und können den Prozess beenden.

Die Vorgehensweise besteht darin, die Prozess-ACL zu ändern, damit das Betriebssystem alle Versuche ablehnt, den Prozess von Nicht-Administratoren abzubrechen.

In Ihrem Prozess-Starup-Code sollten Sie die Prozess-DACL abrufen, eine Einschränkung hinzufügen, damit "Jeder" beim Versuch, den Prozess abzubrechen, einen "Zugriff verweigert" erhält, und dann die Prozess-DACL zurückschreiben.

Wenn Sie interessiert sind, kann ich Ihnen .NET-Quellcode zur Verfügung stellen.

1
Evert

Eine Sache, die hier übersehen wurde, ist das Konzept der (ab) Verwendung der Virtualisierung, um einen Hypervisor über Fenstern zu implementieren, die Ihren Code enthalten.

Da Ihr Code dann außerhalb und über Windows ausgeführt wird, ist er weder leicht zu erkennen noch kann er von Windows beendet werden.

" Blue Pill " war ein Proof of Concept eines solchen Konzepts, aber nach anfänglichem Aufhebens wird eine solche Implementierung sehr selten erwähnt und ich persönlich habe so etwas noch nicht in freier Wildbahn gesehen.

1
braindigitalis