Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
DeathSleep — Eine PoC-Implementierung einer Evasionstechnik, um den aktuellen Thread zu beenden und vor der Wiederaufnahme der Ausführung wiederherzustellen, während Seitenschutzänderungen während der Nichtausführung implementiert werden. | Kitploit
Tools/GitHubGitHub/janoglezcampos/deathsleep
ExploitationMalware-AnalyseRed TeamingPayload-Entwicklung
GitHubjanoglezcampos/deathsleep

DeathSleep

Eine PoC-Implementierung einer Evasionstechnik, um den aktuellen Thread zu beenden und vor der Wiederaufnahme der Ausführung wiederherzustellen, während Seitenschutzänderungen während der Nichtausführung implementiert werden.

Repository anzeigen
538778vor 4 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

██████╗ ███████╗ █████╗ ████████╗██╗ ██╗███████╗██╗ ███████╗███████╗██████╗ ██╔══██╗██╔════╝██╔══██╗╚══██╔══╝██║ ██║██╔════╝██║ ██╔════╝██╔════╝██╔══██╗ ██║ ██║█████╗ ███████║ ██║ ███████║███████╗██║ █████╗ █████╗ ██████╔╝ ██║ ██║██╔══╝ ██╔══██║ ██║ ██╔══██║╚════██║██║ ██╔══╝ ██╔══╝ ██╔═══╝ ██████╔╝███████╗██║ ██║ ██║ ██║ ██║███████║███████╗███████╗███████╗██║
╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚══════╝╚═╝

Eine PoC-Implementierung einer Evasion-Technik zum Beenden des aktuellen Threads und Wiederherstellen vor der Fortsetzung der Ausführung, während Seitenberechtigungsänderungen während der Nicht-Ausführung implementiert werden.

Einleitung

Schlaf- und Verschleierungsmethoden sind in der Maldev-Community wohlbekannt. Mit verschiedenen Implementierungen haben sie das Ziel, sich während des Schlafens vor Speicherscannern zu verstecken. Normalerweise werden Seitenberechtigungen geändert und sogar coole Funktionen wie die Verschlüsselung des Shellcodes hinzugefügt, aber es gibt einen weiteren wichtigen Punkt, um unseren Shellcode zu verstecken: den aktuellen Ausführungsthread zu verstecken. Das Spoofen des Stacks ist cool, aber nachdem ich ein wenig darüber nachgedacht habe, dachte ich, dass es nicht nötig ist, den Stack zu spoofen … wenn es keinen Stack gibt :)

Die Nutzbarkeit dieser Technik bleibt dem Leser überlassen, aber auf jeden Fall denke ich, dass es eine coole Art ist, einige Themen zu wiederholen und etwas Maldev für diejenigen zu lernen, die, wie ich, gerade in dieser Welt anfangen.

Die hier gezeigte Hauptimplementierung hält alles, was wir aus dem Stack nehmen müssen, in der Datensektion als globale Variablen, aber eine Implementierung, die alles auf den Heap verschiebt, wird bald veröffentlicht. Sie zielt darauf ab, einige wichtige Änderungen zu zeigen, die vorgenommen werden müssen, um diesen Code PIC und injizierbar zu machen.

Dieses Repository wird zwischen GitHub und GitLab gespiegelt.


Was ist los?

Zuallererst

Alles, was hier gesagt wird, stammt aus meinem Verständnis der verschiedenen behandelten Themen, entweder aus Lektüre oder Erfahrung während der Entwicklung. Mir ist bewusst, dass ich kein Experte bin, und das Letzte, was ich tun möchte, ist, Fehlinformationen zu verbreiten. Wenn du also denkst, dass etwas nicht korrekt ist, würde ich mich freuen, wenn du mich darauf aufmerksam machst. Du kannst mich auf Twitter kontaktieren oder Issues in diesem Repo eröffnen. Vielen Dank für dein Verständnis. :)

Grundlagen

Das Hauptziel dieser Technik ist klar: den aktuellen Thread zu beenden und ihn vor der Fortsetzung der Ausführung wiederherzustellen. Aber was bedeutet das genau und welche neuen Einschränkungen bringt es mit sich?

Um die Ausführung wiederherzustellen zu können, müssen wir zwei Dinge speichern, bevor der Thread beendet wird: erstens den CPU-Zustand und zweitens den Stack, und sie nach dem Start des neuen Threads effektiv wiederherstellen.

Ich habe über neue Einschränkungen gesprochen, die bei dieser Technik auftreten werden, und es gibt zwei große: Erstens müssen wir außerhalb des Stacks alles speichern, was von dem Moment an benötigt wird, in dem der Thread beendet wird, bis der Stack wiederhergestellt ist, und das schafft, wie du sehen wirst, einige neue Herausforderungen.

Zweitens brauchen wir immer mindestens einen anderen Thread in unserem Prozess, da wir unseren Thread beenden. Wenn es keine anderen Threads gibt, wird der Prozess beendet. Ich denke nicht, dass dies ein großes Problem ist, da die meisten Agents in andere Prozesse injiziert werden. Wir können davon ausgehen, dass dieser Prozess mindestens einen Thread am Laufen hält.

DeathSleep-Komponenten:

Wir können in diesem POC 4 Kernfunktionen sehen:

  • Hauptprogramm: Hier würdest du deinen Agent-Code schreiben, und es ist der Teil des Codes, der DeathSleep verwendet.
  • Awake-Funktion: Dies ist der Einstiegspunkt aller unserer Threads und ist dafür verantwortlich, den Startpunkt des Stacks zu speichern, den wir wiederherstellen werden. Außerdem ist sie dafür verantwortlich, den Stack und den CPU-Kontext bei Bedarf wiederherzustellen oder einfach unser Hauptprogramm zu starten.
  • DeathSleep: Dies ist die Hauptfunktion dieser Technik und ist dafür verantwortlich, den Thread-Kontext und den Stack zu sichern und alles für das magische Ereignis vorzubereiten.
  • Rebirth: Eine einfache Funktion, die nur dafür zuständig ist, unsere neuen Threads zu starten.

Den Stack speichern.

Wenn wir kurz davor sind, den Stack zu speichern, stellt sich die Frage: Wie viel vom Stack muss gespeichert werden?

Lass uns zuerst überprüfen, was im Stack ist, nachdem wir die DeathSleep-Funktion aufgerufen haben (dies ist die Funktion, die den Kontext und den Stack speichert und alles für die Verschleierung und Wiederherstellung vorbereitet).

Wie wir sehen können, hat jede Funktion drei Teile:

  • Shadow Space: Dies ist ein 32-Byte-Bereich, der vom Aufrufer reserviert, aber vom Aufgerufenen verwendet wird. Soweit ich weiß und sehen konnte, besteht seine Hauptfunktion darin, bei Bedarf die an die aufgerufene Funktion in Registern übergebenen Argumente aufzunehmen, aber der Aufgerufene kann es für alles verwenden, was er entscheidet.
  • Rücksprungadresse: Dies ist die Adresse der nächsten auszuführenden Anweisung in der aufrufenden Funktion, die von der CALL-Anweisung auf den Stack gelegt wird, sodass die RET-Anweisung im Aufgerufenen diese Adresse nimmt und beim Ende dorthin "springt".
  • Funktions-Stack-Bereich: Dies ist der vom Aufgerufenen reservierte Bereich, um die Werte der Register, die wiederhergestellt werden müssen, und die Werte seiner lokalen Variablen zu speichern.

Der minimale Teil des Stacks, den wir offensichtlich speichern müssen, ist alles innerhalb unseres Hauptprogramms, das heißt sein Shadow Space, seine Rücksprungadresse und alles bis zur DeathSleep-Funktion. Alles davor ist nicht wirklich erforderlich (das Speichern des Stacks, der von der Einstiegsfunktion verwendet wird, hat seine Vorteile, aber wir werden später darauf eingehen), da dies der Stack ist, der von Windows-Routinen zum Starten unseres neuen Threads verwendet wird. Abgesehen davon habe ich mich entschieden, auch den Shadow Space der DeathSleep-Funktion zu speichern (nicht wirklich nötig, aber es erleichtert die Berechnung des Rsp zum Zeitpunkt des Aufwachens).

Am Ende speichern wir also dies:

So finden wir unsere Stack-Adressen:

Jede Funktion in einer Standardkompilierung sollte aus 3 Teilen bestehen: dem Prolog, dem Funktionscode und dem Epilog.

Der Rsp (Stack-Zeiger) sollte nur im Funktionsprolog und -epilog modifiziert werden. Der Prolog erhöht den Stack-Zeiger (denke daran, das Erhöhen des Stacks bedeutet das Verringern der Adressen, da sie in entgegengesetzte Richtungen gehen), um Register zu sichern, um alle seine lokalen Variablen zu halten und dann den Shadow Space zu halten, und der Epilog tut genau das Gegenteil.

Tool herunterladen