xAL6/zero-loader
GitHub: xAL6/zero-loader
一个高度混淆的多态 x64 shellcode 加载器,通过间接系统调用、堆栈欺骗、无补丁 AMSI/ETW 绕过和幻影 DLL 镂空等技术实现 Windows 环境下的隐蔽执行。
Stars: 10 | Forks: 3
# zero-loader
**多态 x64 shellcode 加载器**
零 CRT。零静态特征。调用堆栈中零痕迹。
    *每次构建都会生成唯一的二进制文件 —— 跨编译无任何匹配。*
    *每次构建都会生成唯一的二进制文件 —— 跨编译无任何匹配。*
## 概述 大多数加载器被标记是因为它们分发相同的二进制文件。**zero-loader** 在每次构建时重新生成所有加密材料 —— 密钥、nonce、字符串编码、PE 元数据。没有两次编译共享相同的哈希值。
## 特性 | | | |:--|:--| | **间接系统调用 (Indirect Syscalls)** | 从 ntdll 提取 SSN + Hook 桩回退。64 个 `syscall;ret` 指令片段 (gadgets) 池化,每次调用通过 RDTSC 随机选择 | | **无补丁 AMSI/ETW** | VEH + 通过 `NtContinue` 设置硬件断点 (DR0/DR1) —— 零字节修改,通过完整性检查 | | **幻影 DLL 镂空 (Phantom DLL Hollowing)** | 自动扫描 System32 寻找合适的 DLL → 复制到临时目录 → NTFS 事务 → SEC_IMAGE → 回滚。EDR 看到的是合法的 DLL 支持的内存 | | **模块覆盖 (Module Stomping)** | 覆盖已签名 DLL 的 `.text` 节。内存属性归属于 Microsoft 二进制文件 | | **调用堆栈欺骗** | ntdll 中的 `call rbx` 指令片段 + 线程池跳板。所有栈帧解析为合法模块 | | **反分析** | PEB 调试器标志, NtGlobalFlag, CPU 数量, RDTSC 时间差 | | **IAT 伪装** | 优化器无法消除的死代码良性导入 | | **执行后清理** | 移除 VEH,通过 `NtContinue` 清除 DR0/DR1/DR7,在 shellcode 执行前擦除密钥/URL/nonces | | | | |:--|:--| | **Chaskey-12 CTR** | ARX 分组密码 —— 纯 ALU 运算,无 S-boxes,无查找表,无 RC4 特征 | | **LZNT1 压缩** | 加密前压缩,运行时通过 ntdll 解压 | | **多态字符串** | 对 25+ 个字符串进行 4 字节旋转 XOR,每次构建重新生成密钥 | | **PE 变异** | TimeDateStamp, Rich header, 节填充, 校验和 —— 构建后随机化 | | **HTTPS 分阶段加载** | 动态 WinINet + `InternetCrackUrlA` + 自签名证书绕过 | | **W^X 内存** | 默认 `PAGE_EXECUTE_READ`。`RWX_SHELLCODE` 标志用于基于 Go 的植入物 |
## 快速开始 ``` # 1 加密和压缩 shellcode python Encrypt.py payload.bin --url https://
构建标志
编辑 `Common.h`: | 标志 | 默认值 | 用途 | |:-----|:--------|:--------| | `DEBUG` | 关闭 | 输出日志到 `debug.log`,跳过反分析 | | `RWX_SHELLCODE` | 关闭 | `PAGE_EXECUTE_READWRITE` 用于 Go/Sliver |
环境要求
- Windows 10/11 x64 - Visual Studio 2022+ (MSVC + ml64) - Python 3.x
## 架构 ### 执行链 ``` Main() │ ├─ IatCamouflage pad IAT with benign imports ├─ AntiAnalysis PEB · NtGlobalFlag · RDTSC ├─ InitializeNtSyscalls SSN extraction + 64 gadget pool ├─ InitializeWinApis PEB walk → kernel32 → JOAAT resolve ├─ PatchlessAmsiEtw DR0 = EtwEventWrite │ DR1 = AmsiScanBuffer ├─ BruteForceDecryption recover Chaskey key ├─ DownloadPayload HTTPS GET → encrypted blob ├─ ChaskeyCtrDecrypt in-place decryption ├─ DecompressPayload LZNT1 via RtlDecompressBuffer │ ├─ ┌ PhantomDllHollow ─────── NTFS txn → SEC_IMAGE → rollback ├─ │ ModuleStomp ──────────── overwrite signed DLL .text ├─ └ NtAllocateVirtualMemory private RW → RX (last resort) │ ├─ CleanupEvasion wipe VEH · DR regs · keys · URLs ├─ FindCallGadget FF D3 (call rbx) in ntdll ├─ SetSpoofTarget configure ASM trampoline ├─ TpAllocWork / TpPostWork thread pool execution └─ NtDelayExecution keep-alive via indirect syscall ``` ### 调用堆栈 ``` RIP shellcode ← phantom/stomped DLL .text (signed) ↓ call rbx gadget ← ntdll ↓ TppWorkpExecute ← ntdll ↓ TppWorkerThread ← ntdll ↓ RtlUserThreadStart ← ntdll ``` 每个栈帧都解析为合法模块。 ### 加密流水线 ``` Build time Runtime ────────── ─────── shellcode.bin HTTPS download │ │ LZNT1 compress Chaskey-CTR decrypt │ │ Chaskey-CTR encrypt ─→ data.enc ─→ LZNT1 decompress │ │ key protection brute-force recovery (XOR + offset) │ Payload.h (randomized keys, nonce, strings) ```
## 项目结构 ``` main.c orchestrates the execution chain Syscalls.h/.c indirect syscall engine · SSN + gadget pool AsmStub.asm x64 MASM · RunSyscall · SpoofCallback WinApi.c PEB walking · JOAAT hashing · CRT stubs Evasion.c patchless AMSI/ETW · anti-analysis · cleanup Stomper.c phantom hollowing (auto DLL scan) · module stomping · gadgets Crypt.c Chaskey-12 CTR · LZNT1 · key recovery Staging.c HTTPS staging · cert bypass Common.h defines · hashes · typedefs · macros Structs.h undocumented NT structures Payload.h auto-generated (never edit) Encrypt.py encryption + compression + obfuscation Mutate.py post-build PE metadata randomizer build.bat ml64 → cl → Mutate.py ```
标签:AMSI 绕过, AV 逃逸, C/ASM, Chrome扩展, DLL 空心化, DNS 反向解析, DNS 解析, DOM解析, EDR 规避, ETW 补丁绕过, NTFS 事务, RFI远程文件包含, Shellcode 加载器, Windows 安全, 二进制利用, 免杀技术, 内存欺骗, 内核回调绕过, 反射注入, 反调试, 多态代码, 客户端加密, 无 CRT 依赖, 暴力破解检测, 模块覆盖, 硬件断点, 网络安全, 调用栈欺骗, 逆向工具, 间接系统调用, 隐私保护