NullGate:实现间接系统调用与内存扫描绕过的新方式
项目介绍
NullGate 是一个开源项目,旨在为使用 Windows 内核 API 提供一种舒适且现代的方法。它采用了间接系统调用(indirect syscalls)的方式,结合了 FreshyCalls 方法的一个变体,以动态获取系统调用号。此外,该项目还引入了一种尚未公开提及的技术,可以绕过 Windows Defender 的内存扫描机制。NullGate 还实现了一个经典的 PoC 进程注入器。
项目技术分析
NullGate 的核心是利用 NTAPI 函数进行间接系统调用。它通过 FreshyCalls 方法动态获取系统调用号,同时引入了一种新的技术来绕过 Windows Defender 的内存扫描。这种方法的核心在于使用 NtAllocateVirtualMemory
函数时,不是直接分配可执行内存,而是先将其设置为 PAGE_NOACCESS
,然后在创建挂起的线程后,再写入有效载荷并修改权限,从而绕过内存扫描。
项目的主要功能示例如下:
nullgate::syscalls syscalls;
typedef NTSTATUS NTAPI NtAllocateVirtualMemory(
_In_ HANDLE ProcessHandle,
_Inout_ _At_(*BaseAddress, _Readable_bytes_(*RegionSize) _Writable_bytes_(*RegionSize)
_Post_readable_byte_size_(*RegionSize)) PVOID *BaseAddress,
_In_ ULONG_PTR ZeroBits, _Inout_ PSIZE_T RegionSize,
_In_ ULONG AllocationType, _In_ ULONG PageProtection);
auto status = syscalls.SCall<NtAllocateVirtualMemory>(
ng::obfuscation::fnv1Const("NtAllocateVirtualMemory"), processHandle,
&buf, 0, ®ionSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
项目技术应用场景
NullGate 的应用场景主要针对需要绕过传统内存扫描技术的高级安全需求,比如在渗透测试、安全研究以及开发需要绕过 Windows Defender 的恶意软件时。它提供了一个更加安全且高效的方式来执行系统调用,避免了直接调用可能引发的检测和拦截。
项目特点
- 间接系统调用:通过间接调用 NTAPI 函数,减少了直接调用可能引起的检测。
- 动态获取系统调用号:利用 FreshyCalls 方法的一个变体,动态获取系统调用号,增加了调用的灵活性。
- 内存扫描绕过:引入了一种新的技术,通过修改内存页面属性和时间上的操作,有效绕过 Windows Defender 的内存扫描。
- 内置类型安全:提供了类型安全的接口,用户只需要提供 NT 函数的定义即可调用。
- 代码混淆和加密:通过 FNV-1a 哈希算法对函数名称进行混淆,并提供了 XOR 加密和解密功能,以及 Base64 编码和解码功能。
- 易于集成:支持 CMake FetchContent,方便集成到其他项目中。
结论
NullGate 提供了一种新的方法和视角来看待系统调用和内存扫描绕过的问题。它的设计和实现不仅展示了高级编程技巧,而且为安全领域的研究和实践提供了一个强大的工具。无论你是安全研究员、渗透测试人员还是恶意软件分析师,NullGate 都可能成为你工具箱中的一个宝贵工具。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考