klezVirus/SysWhispers3

GitHub: klezVirus/SysWhispers3

用于生成直接系统调用代码的安全工具,帮助绕过AV/EDR的用户模式钩子检测。

Stars: 1594 | Forks: 201

# SysWhispers3 SysWhispers 通过生成头文件/ASM 文件来辅助规避检测,植入程序可利用这些文件进行直接系统调用。 ## 官方 Discord 频道 欢迎来 Discord 交流! [![Inceptor Server](https://discordapp.com/api/guilds/1155753953108164628/widget.png?style=banner3)](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, 云资产清单, 免杀技术, 内核安全, 安全意识培训, 安全测试, 快速连接, 恶意软件开发, 技术指纹识别, 攻击性安全, 暴力破解检测, 汇编语言, 私有化部署, 系统调用, 红队演练, 逆向工具, 逆向工程, 邮件伪造, 钓鱼攻击, 钓鱼模拟, 防御规避