Skip to content
KitploitKITPLOIT
ToolsBlog
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
SysWhispers2 — AV/EDR-Umgehung durch direkte Systemaufrufe. | Kitploit
Tools/GitHubGitHub/jthuraisamy/syswhispers2
DefensivwerkzeugeIDS/IPS-UmgehungShellcodeRed TeamingPayload-EntwicklungBinary-Exploitation
GitHubjthuraisamy/syswhispers2

SysWhispers2

AV/EDR-Umgehung durch direkte Systemaufrufe.

Repository anzeigen
1.8k265vor 3 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

SysWhispers2

SysWhispers hilft bei der Umgehung von Sicherheitsmaßnahmen, indem es Header/ASM-Dateien generiert, die Implantate verwenden können, um direkte Systemaufrufe durchzuführen.

Alle Kern-Syscalls werden unterstützt, und Beispieldateien sind im Ordner example-output/ verfügbar.

Unterschied zwischen SysWhispers 1 und 2

Die Verwendung ist fast identisch mit SysWhispers1, aber Sie müssen nicht angeben, welche Windows-Versionen unterstützt werden sollen. Die meisten Änderungen finden hinter den Kulissen statt. Es stützt sich nicht mehr auf die Syscall-Tabellen von @j00ru, sondern verwendet die Technik des "Sortierens nach Systemaufrufadresse", die von @modexpblog popularisiert wurde. Dies reduziert die Größe der Syscall-Stubs erheblich.

Die spezifische Implementierung in SysWhispers2 ist eine Variation des Codes von @modexpblog. Ein Unterschied besteht darin, dass die Funktionsnamen-Hashes bei jeder Generierung zufällig sind. @ElephantSe4l, der diese Technik bereits früher veröffentlicht hatte, hat eine weitere Implementierung auf Basis von C++17, die ebenfalls einen Blick wert ist.

Das ursprüngliche SysWhispers-Repository ist noch verfügbar, könnte aber in Zukunft veraltet sein.

Einführung

Verschiedene Sicherheitsprodukte platzieren Hooks in User-Mode-API-Funktionen, die es ihnen ermöglichen, den Ausführungsfluss zu ihren Engines umzuleiten und verdächtiges Verhalten zu erkennen. Die Funktionen in ntdll.dll, die die Syscalls ausführen, bestehen aus nur wenigen Assembler-Anweisungen, sodass eine Neuimplementierung in Ihrem eigenen Implantat die Auslösung dieser Sicherheitsprodukt-Hooks umgehen kann. Diese Technik wurde von @Cn33liz popularisiert, und sein Blogbeitrag enthält weitere technische Details, die lesenswert sind.

SysWhispers bietet Red Teamern die Möglichkeit, Header/ASM-Paare für jeden Systemaufruf im Kern-Kernel-Image (ntoskrnl.exe) zu generieren. Die Header enthalten auch die notwendigen Typdefinitionen.

Installation

root@kitploit:~
> git clone https://github.com/jthuraisamy/SysWhispers2.git
> cd SysWhispers2
> py .\syswhispers.py --help

Verwendung und Beispiele

Befehlszeilen

root@kitploit:~
# Export all functions with compatibility for all supported Windows versions (see example-output/).
py .\syswhispers.py --preset all -o syscalls_all

# Export just the common functions (see below for list).
py .\syswhispers.py --preset common -o syscalls_common

# Export NtProtectVirtualMemory and NtWriteVirtualMemory with compatibility for all versions.
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem

Skriptausgabe

root@kitploit:~
PS C:\Projects\SysWhispers2> py .\syswhispers.py --preset common --out-file syscalls_common

python syswhispers.py -p all -a all -l all -o example-output/Syscalls

                  .                         ,--.
,-. . . ,-. . , , |-. o ,-. ,-. ,-. ,-. ,-.    /
`-. | | `-. |/|/  | | | `-. | | |-' |   `-. ,-'
`-' `-| `-' ' '   ' ' ' `-' |-' `-' '   `-' `---
     /|                     |  @Jackson_T
    `-'                     '  @modexpblog, 2021

SysWhispers2: Why call the kernel when you can whisper?

All functions selected.

Complete! Files written to:
        example-output/Syscalls.h
        example-output/Syscalls.c
        example-output/SyscallsStubs.std.x86.asm
        example-output/SyscallsStubs.rnd.x86.asm
        example-output/SyscallsStubs.std.x86.nasm
        example-output/SyscallsStubs.rnd.x86.nasm
        example-output/SyscallsStubs.std.x86.s
        example-output/SyscallsStubs.rnd.x86.s
        example-output/SyscallsInline.std.x86.h
        example-output/SyscallsInline.rnd.x86.h
        example-output/SyscallsStubs.std.x64.asm
        example-output/SyscallsStubs.rnd.x64.asm
        example-output/SyscallsStubs.std.x64.nasm
        example-output/SyscallsStubs.rnd.x64.nasm
        example-output/SyscallsStubs.std.x64.s
        example-output/SyscallsStubs.rnd.x64.s
        example-output/SyscallsInline.std.x64.h
        example-output/SyscallsInline.rnd.x64.h

Vorher-Nachher-Beispiel der klassischen CreateRemoteThread-DLL-Injektion

root@kitploit:~
py .\syswhispers.py -f NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx -o syscalls
root@kitploit:~
#include <Windows.h>

void InjectDll(const HANDLE hProcess, const char* dllPath)
{
    LPVOID lpBaseAddress = VirtualAllocEx(hProcess, NULL, strlen(dllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
	
    WriteProcessMemory(hProcess, lpBaseAddress, dllPath, strlen(dllPath), nullptr);
    CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)lpStartAddress, lpBaseAddress, 0, nullptr);
}
root@kitploit:~
#include <Windows.h>
#include "syscalls.h" // Import the generated header.

void InjectDll(const HANDLE hProcess, const char* dllPath)
{
    HANDLE hThread = NULL;
    LPVOID lpAllocationStart = nullptr;
    SIZE_T szAllocationSize = strlen(dllPath);
    LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
	
    NtAllocateVirtualMemory(hProcess, &lpAllocationStart, 0, (PULONG)&szAllocationSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    NtWriteVirtualMemory(hProcess, lpAllocationStart, (PVOID)dllPath, strlen(dllPath), nullptr);
    NtCreateThreadEx(&hThread, GENERIC_EXECUTE, NULL, hProcess, lpStartAddress, lpAllocationStart, FALSE, 0, 0, 0, nullptr);
}

Allgemeine Funktionen

Die Verwendung des Schalters --preset common erstellt ein Header/ASM-Paar mit den folgenden Funktionen:

Klicken Sie, um die Funktionsliste zu erweitern.
  • NtCreateProcess (CreateProcess)
  • NtCreateThreadEx (CreateRemoteThread)
  • NtOpenProcess (OpenProcess)
  • NtOpenThread (OpenThread)
  • NtSuspendProcess
  • NtSuspendThread (SuspendThread)
  • NtResumeProcess
  • NtResumeThread (ResumeThread)
  • NtGetContextThread (GetThreadContext)
  • NtSetContextThread (SetThreadContext)
  • NtClose (CloseHandle)
  • NtReadVirtualMemory (ReadProcessMemory)
  • NtWriteVirtualMemory (WriteProcessMemory)
  • NtAllocateVirtualMemory (VirtualAllocEx)
  • NtProtectVirtualMemory (VirtualProtectEx)
  • NtFreeVirtualMemory (VirtualFreeEx)
  • NtQuerySystemInformation (GetSystemInfo)
  • NtQueryDirectoryFile
  • NtQueryInformationFile
  • NtQueryInformationProcess
  • NtQueryInformationThread
  • NtCreateSection (CreateFileMapping)
  • NtOpenSection
  • NtMapViewOfSection
  • NtUnmapViewOfSection
  • NtAdjustPrivilegesToken (AdjustTokenPrivileges)
  • NtDeviceIoControlFile (DeviceIoControl)
  • NtQueueApcThread (QueueUserAPC)
  • NtWaitForMultipleObjects (WaitForMultipleObjectsEx)

Importieren in Visual Studio

  1. Kopieren Sie die generierten H/C/ASM-Dateien in den Projektordner.
  2. Gehen Sie in Visual Studio zu Projekt → Build Customizations... und aktivieren Sie MASM.
  3. Fügen Sie im Projektmappen-Explorer die .h- und .c/.asm-Dateien als Header- bzw. Quelldateien zum Projekt hinzu.
  4. Gehen Sie zu den Eigenschaften der x86-ASM-Datei.
  5. Wählen Sie Alle Konfigurationen aus der Dropdown-Liste Konfiguration.
  6. Wählen Sie Win32 aus der Dropdown-Liste Plattform.
  7. Legen Sie die folgenden Optionen fest:
    • Von Build ausschließen = Nein
    • Inhalt = Ja
    • Elementtyp = Microsoft Macro Assembler
  8. Klicken Sie auf Übernehmen.
  9. Wählen Sie x64 aus der Dropdown-Liste Plattform.
  10. Legen Sie die folgenden Optionen fest:
    • Von Build ausschließen = Ja
    • Inhalt = Ja
    • Elementtyp = Microsoft Macro Assembler
  11. Klicken Sie auf Übernehmen, dann auf OK.
  12. Gehen Sie zu den Eigenschaften der x64-ASM-Datei.
  13. Wählen Sie Alle Konfigurationen aus der Dropdown-Liste Konfiguration.
  14. Wählen Sie Win32 aus der Dropdown-Liste Plattform.
  15. Legen Sie die folgenden Optionen fest:
    • Von Build ausschließen = Ja
    • Inhalt = Ja
    • Elementtyp = Microsoft Macro Assembler
  16. Klicken Sie auf Übernehmen.
  17. Wählen Sie x64 aus der Dropdown-Liste Plattform.
  18. Legen Sie die folgenden Optionen fest:
    • Von Build ausschließen = Nein
    • Inhalt = Ja
    • Elementtyp = Microsoft Macro Assembler
  19. Klicken Sie auf Übernehmen, dann auf OK.

Kompilieren mit MinGW und NASM

Die folgenden Beispiele zeigen, wie die obigen Beispielprogramme als EXE und DLLs mit MinGW und dem NASM-Assembler kompiliert werden:

x86 Beispiel EXE

root@kitploit:~
i686-w64-mingw32-gcc -c main.c syscalls.c -Wall -shared
nasm -f win32 -o syscallsstubs.std.x86.o syscallsstubs.std.x86.nasm
i686-w64-mingw32-gcc *.o -o temp.exe
i686-w64-mingw32-strip -s temp.exe -o example.exe
rm -rf *.o temp.exe

x86 Beispiel DLL mit Exports

root@kitploit:~
i686-w64-mingw32-gcc -c dllmain.c syscalls.c -Wall -shared
nasm -f win32 -o syscallsstubs.std.x86.o syscallsstubs.std.x86.nasm
i686-w64-mingw32-dllwrap --def dllmain.def *.o -o temp.dll
i686-w64-mingw32-strip -s temp.dll -o example.dll
rm -rf *.o temp.dll

x64 Beispiel EXE

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -c main.c syscalls.c -Wall -shared
nasm -f win64 -o syscallsstubs.std.x64.o syscallsstubs.std.x64.nasm
x86_64-w64-mingw32-gcc *.o -o temp.exe
x86_64-w64-mingw32-strip -s temp.exe -o example.exe
rm -rf *.o temp.exe

x64 Beispiel DLL mit Exports

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -c dllmain.c syscalls.c -Wall -shared
nasm -f win64 -o syscallsstubs.std.x64.o syscallsstubs.std.x64.nasm
x86_64-w64-mingw32-gcc-dllwrap --def dllmain.def *.o -o temp.dll
x86_64-w64-mingw32-strip -s temp.dll -o example.dll
rm -rf *.o temp.dll

Kompilieren mit MinGW und GNU Assembler (GAS)

x86 Beispiel EXE

root@kitploit:~
i686-w64-mingw32-gcc -m32 -Wall -c main.c syscalls.c syscallsstubs.std.x86.s -o temp.exe
i686-w64-mingw32-strip -s temp.exe -o example.exe

x86 Beispiel DLL mit Exports

root@kitploit:~
i686-w64-mingw32-gcc -m32 -Wall -c dllmain.c syscalls.c syscallsstubs.std.x86.s -o temp.dll
i686-w64-mingw32-dllwrap --def dllmain.def *.o -o temp.dll
i686-w64-mingw32-strip -s temp.dll -o example.dll

x64 Beispiel EXE

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -Wall -c main.c syscalls.c syscallsstubs.std.x64.s -o temp.exe
x86_64-w64-mingw32-strip -s temp.exe -o example.exe

x64 Beispiel DLL mit Exports

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -Wall -c dllmain.c syscalls.c syscallsstubs.std.x64.s -o temp.dll
x86_64-w64-mingw32-dllwrap --def dllmain.def *.o -o temp.dll
x86_64-w64-mingw32-strip -s temp.dll -o example.dll

Verwendung mit LLVM/Clang

SysWhispers2 gibt eine clang-kompatible .s-Datei aus, die die ASM-Stubs enthält. Diese kann mit llvm verwendet werden, um Ihren Code zu kompilieren. Zum Beispiel unter Verwendung des obigen CreateRemoteThread-DLL-Injektionsbeispiels:

root@kitploit:~
clang -D nullptr=NULL main.c syscall.c syscallstubs.std.x64.s -o test.exe

Nur Inline-Header

Die Ausgabeoption inlinegas generiert eine reine Header-Version von SysWhispers2, die bei der Kompilierung von BOFs verwendet werden kann. Binden Sie einfach den Header in Ihr Projekt ein.

Zufällige Syscall-Sprünge

Durch die Verwendung der zufälligen Syscall-Sprungroutine ist es möglich, den "mark of the syscall" zu vermeiden. Der Assembly-Stub ruft eine neue Funktion SW__GetRandomSyscallAddress auf, die nach einer sauberen Syscall-Anweisung in ntdll.dll sucht und diese auswählt. Auf diese Weise ist es möglich, auch die Auslösung von Userland-Syscall-Anweisungen zu vermeiden.

Um zufällige Syscall-Sprünge zu verwenden, müssen Sie beim Kompilieren Ihres Programms RANDSYSCALL definieren und die rnd-Version der SysWhispers2-Ausgabe verwenden. Die folgenden Beispiele demonstrieren die Verwendung der GNU-Assembler-Stubs.

x86 Beispiel EXE - Verwendung zufälliger Syscall-Sprünge

root@kitploit:~
i686-w64-mingw32-gcc main.c syscalls.c syscallsstubs.rnd.x86.s -DRANDSYSCALL -Wall -o example.exe

x64 Beispiel EXE - Verwendung zufälliger Syscall-Sprünge

root@kitploit:~
x86_64-w64-mingw32-gcc main.c syscalls.c syscallsstubs.rnd.x64.s -DRANDSYSCALL -Wall -o example.exe

Einschränkungen und Hinweise

  • Systemaufrufe aus dem grafischen Subsystem (win32k.sys) werden nicht unterstützt.
  • Getestet mit Visual Studio 2019 (v142) und Windows 10 SDK.

Fehlerbehebung

  • Fehler durch doppelte Typdefinitionen: Ein Projekt kompiliert möglicherweise nicht, wenn typedefs in syscalls.h bereits definiert wurden.
    • Stellen Sie sicher, dass nur die erforderlichen Funktionen enthalten sind (d. h. --preset all ist selten notwendig).
    • Wenn ein typedef bereits in einem anderen verwendeten Header definiert ist, kann es aus syscalls.h entfernt werden.

Danksagungen

Entwickelt von @Jackson_T und @modexpblog, baut aber auf der Arbeit vieler anderer auf:

  • @FoxHex0ne für das Katalogisieren vieler Funktionsprototypen und Typdefinitionen in einem maschinenlesbaren Format.
  • @PetrBenes, NTInternals.net team und MSDN für zusätzliche Prototypen und Typdefinitionen.
  • @Cn33liz für die anfängliche Dumpert POC-Implementierung.

Verwandte Artikel und Projekte

  • @modexpblog: Umgehung von User-Mode-Hooks und direkter Aufruf von Systemaufrufen für Red Teams
  • @hodg87: Malware-Abwehr bei Verwendung direkter Systemaufrufe
  • @Cn33liz: Kombination direkter Systemaufrufe und sRDI zur Umgehung von AV/EDR (Code)
  • @0x00dtm: Userland-API-Überwachung und Erkennung von Code-Injektion
  • @0x00dtm: Besiegen von Userland-Hooks (mit Bitdefender) (Code)
  • @mrgretzky: Besiegen von Antivirus-Echtzeitschutz von innen heraus
  • @SpecialHoang: Umgehung des EDR-Speicherschutzes, Einführung in Hooking (Code)
  • @xpn and @domchell: Silencing Cylance: Eine Fallstudie zu modernen EDRs
  • @mrjefftang: Universelles Unhooking: Blendung von Sicherheitssoftware ()

Verweise auf SysWhispers

  • @JFaust_: Process Injection Teil 1, Teil 2 und das Alaris-Loader-Projekt (Code)
  • @0xPat: Malware-Entwicklung Teil 2
  • @brsn76945860: Implementieren von Syscalls im CobaltStrike Artifact Kit
  • @Cn33liz and @_DaWouw: Direkte Syscalls in Beacon Object Files (Code)

Lizenz

Dieses Projekt ist unter der Apache License 2.0 lizenziert.

Tool herunterladen
Code
  • @spotheplanet: Vollständiges DLL-Unhooking mit C++
  • @hasherezade: Floki Bot und der heimliche Dropper
  • @hodg87: Neueste Trickbot-Variante hat neue Tricks auf Lager