
SysWhispers 增强版 - 通过直接系统调用绕过 AV/EDR。
SysWhispers 通过生成头文件/ASM 文件帮助规避检测,使植入程序能够直接进行系统调用。
快来 Discord 一起玩吧!
SysWhispers3 作为独立版本的原因有很多,但最重要的包括:
用法与 SysWhispers2 非常相似,但有以下例外:
这些功能的更好解释见博客文章 SysWhispers is dead, long live SysWhispers!
安全产品(如防病毒软件和 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
optional arguments:
-h, --help 显示此帮助信息并退出
-p PRESET, --preset PRESET
预设 ("all" 或 "common")
-a {x86,x64}, --arch {x86,x64}
架构
-c {msvc,mingw,all}, --compiler {msvc,mingw,all}
编译器
-m {embedded,egg_hunter,jumper,jumper_randomized}, --method {embedded,egg_hunter,jumper,jumper_randomized}
系统调用恢复方法
-f FUNCTIONS, --functions FUNCTIONS
逗号分隔的函数列表
-o OUT_FILE, --out-file OUT_FILE
输出基文件名(不含扩展名)
--int2eh 使用旧的 `int 2eh` 指令代替 `syscall`
--wow64 使用 Wow64 在 x64 上运行 x86(仅适用于 x86 架构)
-v, --verbose 启用调试输出
-d, --debug 启用系统调用调试(插入软件断点)
# 导出所有函数,兼容所有支持的 Windows 版本(参见 example-output/)。
py .\syswhispers.py --preset all -o syscalls_all
# 仅导出常用函数(参见下方列表)。
py .\syswhispers.py --preset common -o syscalls_common
# 导出 NtProtectVirtualMemory 和 NtWriteVirtualMemory,兼容所有版本。
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem
# 普通 SysWhispers,32 位模式
py .\syswhispers.py --preset all -o syscalls_all -m jumper --arch x86
# 普通 SysWhispers,在 32 位模式下使用 WOW64(仅特定函数)
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem --arch x86 --wow64
# 蛋猎手 SysWhispers,绕过“系统调用标记”(常用函数)
py .\syswhispers.py --preset common -o syscalls_common -m egg_hunter
# 跳转/随机跳转 SysWhispers,绕过动态 RIP 验证(所有函数),使用 MinGW 编译器
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
由 @klezVirus 编辑, 2022
SysWhispers3: 何必调用内核,悄悄说就好?
已选择常用函数。
完成!文件写入:
temp\syscalls_common.h
temp\syscalls_common.c
temp\syscalls_common_.asm
按任意键继续...
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 时,工具将在系统调用存根中插入一个软件断点,以便在 WinDbg 中调试。error A2084:constant value too large,请重新生成存根。由 @Jackson_T 和 @modexpblog 开发,但建立在许多其他人的工作之上:
与原始项目一样,本项目也采用 Apache License 2.0 许可。