
SysWhispers on Steroids - AV/EDR 회피를 위한 직접 시스템 호출.
SysWhispers는 직접 시스템 호출을 수행할 수 있는 헤더/ASM 파일을 생성하여 회피에 도움을 줍니다.
Discord에서 함께하세요!
SysWhispers3가 독립형 버전이 된 이유는 많지만, 가장 중요한 이유는 다음과 같습니다:
사용법은 SysWhispers2와 매우 유사하며, 다음과 같은 예외가 있습니다:
이러한 기능에 대한 더 자세한 설명은 블로그 게시물 SysWhispers is dead, long live SysWhispers!에 잘 설명되어 있습니다.
AV 및 EDR과 같은 보안 제품은 일반적으로 사용자 모드 API 함수에 후크를 배치하여 프로그램 실행 흐름을 분석하고 잠재적인 악성 활동을 감지합니다.
SysWhispers2는 코어 커널 이미지(ntoskrnl.exe)의 모든 시스템 호출에 대해 헤더/ASM 쌍을 생성하도록 설계된 도구로, 이를 C/C++ 코드에서 직접 통합 및 호출하여 사용자 영역 후크를 우회할 수 있습니다.
그러나 이 도구는 서명에 포함될 수 있는 일부 패턴이나 런타임에 탐지될 수 있는 동작을 생성합니다.
SysWhispers3는 SysWhispers2를 기반으로 구축되었으며, 이러한 탐지 형태를 우회하는 데 도움이 되는 몇 가지 유용한 기능을 통합합니다.
C:\> git clone https://github.com/klezVirus/SysWhispers3.git
C:\> cd SysWhispers3
C:\> python .\syswhispers.py --help
도움말은 도구의 사용 가능한 모든 명령과 기능을 보여줍니다:
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...
64비트용 Makefile:
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
32비트용 Makefile:
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
nmake로 컴파일:
nmake -f Makefile.msvc
64비트 및 32비트 모두를 위한 Makefile:
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)
make로 컴파일:
make -f Makefile.mingw
win32k.sys)의 시스템 호출은 지원되지 않습니다.syscalls.h의 typedef가 이미 정의된 경우 프로젝트가 컴파일되지 않을 수 있습니다.
--preset all은 거의 필요하지 않습니다).syscalls.h에서 제거할 수 있습니다.--verbose를 사용하면 코드 생성 중 문제 해결 출력을 활성화할 수 있습니다.--debug를 사용하면 도구가 syscall 스텁에 소프트웨어 중단점을 삽입하여 WinDbg에서 디버깅을 용이하게 합니다.error A2084:constant value too large 오류가 발생하면 스텁을 다시 생성하십시오.개발자: @Jackson_T 및 @modexpblog, 하지만 다른 많은 사람들의 작업을 기반으로 합니다:
원본과 마찬가지로 이 프로젝트는 Apache License 2.0에 따라 라이선스가 부여됩니다.