klezVirus/SysWhispers3
GitHub: klezVirus/SysWhispers3
用于生成直接系统调用代码的安全工具,帮助绕过AV/EDR的用户模式钩子检测。
Stars: 1594 | Forks: 201
# SysWhispers3
SysWhispers 通过生成头文件/ASM 文件来辅助规避检测,植入程序可利用这些文件进行直接系统调用。
## 官方 Discord 频道
欢迎来 Discord 交流!
[](https://discord.gg/f6w6dwZq)
### 为什么我不向 SysWhispers2 提交 PR?
SysWhispers3 之所以作为一个独立版本存在,原因有很多,但最重要的是:
* SysWhispers3 是 [Inceptor][1] 实际使用的“分支”,并实现了一些与该工具原始版本无关的工具类。
* SysWhispers2 正朝着支持 NASM 编译(用于 gcc/mingw)的方向发展,而此版本是专门为支持 MSVC 设计和测试的(因为 [Inceptor][1] 在不久的将来仍将是一个仅限 Windows 的框架)。
* SysWhispers3 包含部分实现的功能(例如 egg-hunting),将这些功能包含在工具的原始版本中是不明智的。
## 与 SysWhispers2 的区别
用法与 [SysWhispers2](https://github.com/jthuraisamy/SysWhispers2) 非常相似,但有以下例外:
* 它还支持 x86/WoW64
* 它支持使用 EGG 替换系统调用指令(以便动态替换)
* 它支持在 x86/x64 模式下直接跳转到系统调用(在 WOW64 中这几乎是标准做法)
* 它支持直接跳转到随机系统调用(借鉴了 [@ElephantSeal's idea](https://twitter.com/ElephantSe4l/status/1488464546746540042))
关于这些功能的更好解释在博文 [SysWhispers is dead, long live SysWhispers!][2] 中有更详细的概述。
## 简介
安全产品(如 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
# Jumping/Jumping Randomized 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
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 中,转到 *Project* → *Build Customizations...* 并启用 MASM。
3. 在 *Solution Explorer* 中,将 .h 和 .c/.asm 文件分别作为头文件和源文件添加到项目中。
4. 转到 ASM 文件的属性,将 *Item Type* 设置为 *Microsoft Macro Assembler*。
## 在 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][1] 中。
- 不支持来自图形子系统(`win32k.sys`)的系统调用。
- 已在 Visual Studio 2019/2022 和 Windows 10 SDK 上测试。
- 不保证支持 NASM。
- 不保证支持 GCC 和 MinGW。
## 故障排除
#### 来自 SysWhispers2
- 类型重定义错误:如果 `syscalls.h` 中的 typedef 已经被定义,项目可能无法编译。
- 确保仅包含所需的函数(即 `--preset all` 很少是必要的)。
- 如果 typedef 已在另一个使用的头文件中定义,则可以将其从 `syscalls.h` 中删除。
#### 新增
- 使用 `--verbose`,可以在代码生成期间启用故障排除输出。
- 使用 `--debug`,该工具将在系统调用存根中插入软件断点,以便在 WinDbg 中轻松调试。
- 如果在编译期间遇到 `error A2084:constant value too large`,请重新生成存根。
## 致谢
#### SysWhispers2
由 [@Jackson_T](https://twitter.com/Jackson_T) 和 [@modexpblog](https://twitter.com/modexpblog) 开发,
但建立在许多其他人的工作基础之上:
- [@FoxHex0ne](https://twitter.com/FoxHex0ne),以机器可读格式编目了许多函数原型和 typedef。
- [@PetrBenes](https://twitter.com/PetrBenes)、[NTInternals.net team](https://undocumented.ntinternals.net/) 和 [MSDN](https://docs.microsoft.com/en-us/windows/),提供了额外的原型和 typedef。
- [@Cn33liz](https://twitter.com/Cneelis),用于最初的 [Dumpert](https://github.com/outflanknl/Dumpert) POC 实现。
#### SysWhispers2 (x86/WOW64)
- [@rooster](https://github.com/mai1zhi2),创建了兼容 x86/WOW64 的分支示例。
#### 其他
- [@ElephantSe4l](https://mobile.twitter.com/elephantse4l),提出了随机跳转到系统调用的想法。
- [@S4ntiagoP](https://twitter.com/s4ntiago_p),在 [nanodump](https://github.com/helpsystems/nanodump) 上的出色工作,给了我很多启发。
## 许可证
与原项目一样,本项目也采用 Apache License 2.0 许可。
标签:0day挖掘, C/C++, Conpot, Gophish, Hpfeeds, UML, Windows安全, 中高交互蜜罐, 事务性I/O, 云资产清单, 免杀技术, 内核安全, 安全意识培训, 安全测试, 快速连接, 恶意软件开发, 技术指纹识别, 攻击性安全, 暴力破解检测, 汇编语言, 私有化部署, 系统调用, 红队演练, 逆向工具, 逆向工程, 邮件伪造, 钓鱼攻击, 钓鱼模拟, 防御规避