
SysWhispers on Steroids - AV/EDR-Umgehung durch direkte Systemaufrufe.
SysWhispers hilft bei der Umgehung, indem es Header/ASM-Dateien generiert, die Implants verwenden können, um direkte Systemaufrufe zu tätigen.
Komm auf Discord vorbei!
Die Gründe, warum SysWhispers3 eine eigenständige Version ist, sind vielfältig, aber die wichtigsten sind:
Die Verwendung ist ziemlich ähnlich zu SysWhispers2, mit den folgenden Ausnahmen:
Eine bessere Erklärung dieser Funktionen ist im Blogbeitrag SysWhispers is dead, long live SysWhispers! dargelegt.
Sicherheitsprodukte wie AVs und EDRs platzieren normalerweise Hooks in User-Mode-API-Funktionen, um den Programmablauf zu analysieren und potenziell bösartige Aktivitäten zu erkennen.
SysWhispers2 ist ein Tool, das Header/ASM-Paare für jeden Systemaufruf im Kernkernel-Image
(ntoskrnl.exe) generiert, die dann direkt aus C/C++-Code integriert und aufgerufen werden können, wodurch User-Land-Hooks umgangen werden.
Das Tool erzeugt jedoch einige Muster, die in Signaturen enthalten sein können, oder ein Verhalten, das zur Laufzeit erkannt werden kann.
SysWhispers3 baut auf SysWhispers2 auf und integriert einige hilfreiche Funktionen, um diese Erkennungsformen zu umgehen.
C:\> git clone https://github.com/klezVirus/SysWhispers3.git
C:\> cd SysWhispers3
C:\> python .\syswhispers.py --help
Die Hilfe zeigt alle verfügbaren Befehle und Funktionen des Tools:
C:\>python syswhispers.py -h
usage: syswhispers.py [-h] [-p PRESET] [-a {x86,x64}] [-m {embedded,egg_hunter,jumper,jumper_randomized}] [-f FUNCTIONS] -o OUT_FILE [--int2eh] [--wow64] [-v] [-d]
SysWhispers3 - SysWhispers on steroids
optional arguments:
-h, --help show this help message and exit
-p PRESET, --preset PRESET
Preset ("all", "common")
-a {x86,x64}, --arch {x86,x64}
Architecture
-c {msvc,mingw,all}, --compiler {msvc,mingw,all}
Compiler
-m {embedded,egg_hunter,jumper,jumper_randomized}, --method {embedded,egg_hunter,jumper,jumper_randomized}
Syscall recovery method
-f FUNCTIONS, --functions FUNCTIONS
Comma-separated functions
-o OUT_FILE, --out-file OUT_FILE
Output basename (w/o extension)
--int2eh Use the old `int 2eh` instruction in place of `syscall`
--wow64 Use Wow64 to run x86 on x64 (only usable with x86 architecture)
-v, --verbose Enable debug output
-d, --debug Enable syscall debug (insert software breakpoint)
# 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
# Normal SysWhispers, 32-bits mode
py .\syswhispers.py --preset all -o syscalls_all -m jumper --arch x86
# Normal SysWhispers, using WOW64 in 32-bits mode (only specific functions)
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem --arch x86 --wow64
# Egg-Hunting SysWhispers, to bypass the "mark of the sycall" (common function)
py .\syswhispers.py --preset common -o syscalls_common -m egg_hunter
# Jumping/Jumping Randomized SysWhispers, to bypass dynamic RIP validation (all functions) using MinGW as the compiler
py .\syswhispers.py --preset all -o syscalls_all -m jumper -c mingw
PS C:\Projects\SysWhispers2> py .\syswhispers.py --preset common --out-file temp\syscalls_common -v
. ,--.
,-. . . ,-. . , , |-. o ,-. ,-. ,-. ,-. ,-. __/
`-. | | `-. |/|/ | | | `-. | | |-' | `-. . \
`-' `-| `-' ' ' ' ' ' `-' |-' `-' ' `-' '''
/| | @Jackson_T
`-' ' @modexpblog, 2021
Edits by @klezVirus, 2022
SysWhispers3: Why call the kernel when you can whisper?
Common functions selected.
Complete! Files written to:
temp\syscalls_common.h
temp\syscalls_common.c
temp\syscalls_common_.asm
Press a key to continue...
Makefile für 64 Bit:
Makefile.msvc
OPTIONS = -Zp8 -c -nologo -Gy -Os -O1 -GR- -EHa -Oi -GS-
LIBS = libvcruntime.lib libcmt.lib ucrt.lib kernel32.lib
program:
ML64 /c syscalls-asm.x64.asm /link /NODEFAULTLIB /RELEASE /MACHINE:X64
cl.exe $(OPTIONS) syscalls.c program.c
link.exe /OUT:program.x64.exe -nologo $(LIBS) /MACHINE:X64 -subsystem:console -nodefaultlib syscalls-asm.x64.obj syscalls.obj program.obj
Makefile für 32 Bit:
Makefile.msvc
OPTIONS = -Zp8 -c -nologo -Gy -Os -O1 -GR- -EHa -Oi -GS-
LIBS = libvcruntime.lib libcmt.lib ucrt.lib kernel32.lib
program:
ML /c syscalls-asm.x86.asm /link /NODEFAULTLIB /RELEASE /MACHINE:X86
cl.exe $(OPTIONS) syscalls.c program.c
link.exe /OUT:program.x86.exe -nologo $(LIBS) /MACHINE:X86 -subsystem:console -nodefaultlib syscalls-asm.x86.obj syscalls.obj program.obj
Kompilieren mit nmake:
nmake -f Makefile.msvc
Makefile für sowohl 64 als auch 32 Bit:
Makefile.mingw
CC_x64 := x86_64-w64-mingw32-gcc
CC_x86 := i686-w64-mingw32-gcc
OPTIONS := -masm=intel -Wall
program:
$(CC_x64) syscalls.c program.c -o program.x64.exe $(OPTIONS)
$(CC_x86) syscalls.c program.c -o program.x86.exe $(OPTIONS)
Kompilieren mit make:
make -f Makefile.mingw
win32k.sys) werden nicht unterstützt.typedef in syscalls.h bereits definiert wurden.
--preset all ist selten notwendig).typedef bereits in einem anderen verwendeten Header definiert ist, kann es aus syscalls.h entfernt werden.--verbose kann während der Codegenerierung eine Fehlerbehebungsausgabe aktiviert werden.--debug fügt das Tool einen Software-Breakpoint in den Syscall-Stub ein, um das Debuggen in WinDbg zu erleichtern.error A2084:constant value too large erhalten, generieren Sie die Stubs neu.Entwickelt von @Jackson_T und @modexpblog, baut aber auf der Arbeit vieler anderer auf:
Wie das Original ist auch dieses Projekt unter der Apache License 2.0 lizenziert.