
SysWhispers on Steroids - Evasión de AV/EDR mediante llamadas directas al sistema.
SysWhispers ayuda con la evasión generando archivos de cabecera/ASM que los implantes pueden usar para realizar llamadas directas al sistema.
¡Ven a pasar el rato en Discord!
Las razones para que SysWhispers3 sea una versión independiente son muchas, pero las más importantes son:
El uso es bastante similar a , con las siguientes excepciones:
Una mejor explicación de estas características está mejor descrita en la publicación del blog SysWhispers is dead, long live SysWhispers!
Los productos de seguridad, como los AV y EDR, suelen colocar hooks en las funciones de API en modo usuario para analizar el flujo de ejecución de un programa, con el fin de detectar actividades potencialmente maliciosas.
SysWhispers2 es una herramienta diseñada para generar pares de cabecera/ASM para cualquier llamada al sistema en la imagen del núcleo del kernel (ntoskrnl.exe), que luego pueden integrarse y llamarse directamente desde código C/C++, evadiendo los hooks en modo usuario.
La herramienta, sin embargo, genera algunos patrones que pueden ser incluidos en firmas, o comportamientos que pueden ser detectados en tiempo de ejecución.
SysWhispers3 está construido sobre SysWhispers2, e integra algunas características útiles para evadir estas formas de detección.
C:\> git clone https://github.com/klezVirus/SysWhispers3.git
C:\> cd SysWhispers3
C:\> python .\syswhispers.py --help
La ayuda muestra todos los comandos y características disponibles de la herramienta:
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 para 64 bits:
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 para 32 bits:
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
Compilar con nmake:
nmake -f Makefile.msvc
Makefile para 64 y 32 bits:
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)
Compilar con make:
make -f Makefile.mingw
win32k.sys).syscalls.h ya han sido definidos.
--preset all rara vez es necesario).syscalls.h.--verbose, es posible habilitar la salida de solución de problemas durante la generación de código.--debug, la herramienta insertará un punto de interrupción de software en el stub de syscall, para facilitar la depuración en WinDbg.error A2084:constant value too large durante la compilación, regenere los stubs.Desarrollado por @Jackson_T y @modexpblog, pero se basa en el trabajo de muchos otros:
Al igual que el original, este proyecto también está licenciado bajo la Licencia Apache 2.0.