SysWhispers 功能强化版 - 通过直接系统调用来躲避 AV/EDR 的检测。

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/klezVirus/SysWhispers3

🚩 这是 SysWhispers3 的公共代码库,如果您想获取最新版本和更新,请考虑通过 https://porchetta.industries/ 支持我们。

SysWhispers3

SysWhispers 通过生成头文件/ASM 文件来帮助逃避检测,这些文件可以用于进行直接系统调用。

🚩 赞助商

如果您想成为该项目的赞助商,并获取 SysWhispers3 的最新更新、最新修复的问题和最新功能,请在 https://porchetta.industries/ 支持我们。

官方 Discord 频道

来 Discord 上聊天吧!

 

ad1a1b7183001820

为什么我没有向 SysWhispers2 提交 PR?

将 SysWhispers3 设计为独立版本的原因很多,但最重要的原因是:

  • SysWhispers3 是 Inceptor 使用的“分支”,实现了一些对于该工具原始版本不相关的 utils 类。
  • SysWhispers2 正在朝着支持 NASM 编译(用于 gcc/mingw)的方向发展,而此版本专门设计和测试以支持 MSVC(因为 Inceptor 在不久的将来将仍然是一个仅限于 Windows 的框架)。
  • SysWhispers3 包含了部分实现的功能(如 egg-hunting),这些功能不应包含在该工具的原始版本中。

 

与SysWhispers2的不同之处

使用方法与SysWhispers2非常相似,但有以下例外:

  • 它还支持x86/WoW64
  • 它支持使用EGG动态替换系统调用指令
  • 它支持在x86/x64模式下直接跳转到系统调用(在WOW64中几乎是标准的)
  • 它支持随机跳转到系统调用(借鉴自@ElephantSeal的想法

这些特性的更好解释在博客文章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)

命令行

标准 SysWhispers,嵌入式系统调用(x64)

# 导出所有支持的 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

仅适用于 SysWhispers3 的示例

# 普通 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

# Egg-Hunting SysWhispers,用于绕过“系统调用标记”(常用函数)
py .\syswhispers.py --preset common -o syscalls_common -m egg_hunter

# 跳转/随机跳转 SysWhispers,使用 MinGW 作为编译器,用于绕过动态 RIP 验证(所有函数)
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...

导入到 Visual Studio

  1. 将生成的 H/C/ASM 文件复制到项目文件夹中。
  2. 在 Visual Studio 中,转到“项目”→“生成自定义”并启用 MASM。
  3. 在“解决方案资源管理器”中,分别将 .h 和 .c/.asm 文件添加到项目中作为头文件和源文件。
  4. 转到 ASM 文件的属性,并将“项类型”设置为“Microsoft 宏汇编器”。

在Visual Studio之外编译

Windows

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

Linux

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

注意事项和限制

  • 此工具未实现Egg-Hunter功能,该功能在Inceptor中实现。
  • 不支持图形子系统(win32k.sys)的系统调用。
  • 在Visual Studio 2019/2022和Windows 10 SDK上测试通过。
  • 不保证对NASM的支持。
  • 不保证对GCC和MinGW的支持。

故障排除

从SysWhispers2迁移

  • 类型重定义错误:如果在syscalls.h中已经定义了typedef,则可能无法编译项目。
    • 确保只包含所需函数(即 --preset all 很少需要)。
    • 如果另一个使用的头文件中已经定义了typedef,则可以将其从syscalls.h中删除。

  • 使用 --verbose 选项,可以在代码生成期间启用故障排除输出。
  • 使用 --debug 选项,工具将在syscall stub中插入一个软件断点,以便在WinDbg中进行调试。
  • 如果在编译过程中出现 error A2084:constant value too large,请重新生成 stubs。
标签:工具分享, 免杀工具