khalid609/Shellcode-Encoder
GitHub: khalid609/Shellcode-Encoder
一个用 C++ 编写的简易 XOR shellcode 编码器,使用滚动密钥对原始字节进行对称编码并生成可嵌入项目的头文件,主要用于安全研究和教学。
Stars: 0 | Forks: 0
# 🔐 XOR Shellcode 编码器
## 📌 概述
一个简单的 C++ 工具,它使用滚动密钥对 shellcode 字节数组进行 XOR 编码,并将编码后的结果输出为可直接使用的 `.h` 头文件。专为研究 shellcode 混淆技术的安全研究人员和学生而设计。
## 🔬 工作原理
```
shellcode[] (raw bytes)
│
▼
XOR(key, shellcode, size) ← rolling key XOR — each byte XOR'd with key[i % keylen]
│
▼
encoded_shellcode.h ← output header with encoded bytes ready to embed
```
每个字节编码后的形式为:
```
encoded[i] = shellcode[i] ^ key[i % key.length()]
```
相同的函数可以对其进行解码 —— XOR 是对称的,因此使用相同的密钥再次运行 `XOR()` 即可恢复原始字节。
## 📁 文件
| 文件 | 描述 |
|---|---|
| `XorEncoder.cpp` | 主编码器 —— 对 shellcode 进行 XOR 操作并写入输出的头文件 |
| `encoded_shellcode.h` | 自动生成的输出,包含编码后的字节数组 |
## ⚙️ 设置
### 前置条件
- Windows 或 Linux
- 任意 C++ 编译器:
- **Windows:** Visual Studio 2022 或通过 MinGW 使用 `g++`
- **Linux:** `g++`
## 🚀 如何使用
### 步骤 1 —— 添加你的 shellcode
打开 `XorEncoder.cpp` 并将占位符 shellcode 替换为你自己的字节:
```
unsigned char shellcode[] = {
0xFC, 0x48, 0x83, ... // paste your raw shellcode bytes here
};
```
### 步骤 2 —— 设置你的 XOR 密钥
```
std::string key = "mysecretkey"; // replace with your own key
```
### 步骤 3 —— 构建
**Visual Studio:**
```
Build → Build Solution (Ctrl+Shift+B)
```
**g++ (Windows/Linux):**
```
g++ XorEncoder.cpp -o XorEncoder
```
### 步骤 4 —— 运行
**Windows:**
```
XorEncoder.exe
```
**Linux:**
```
./XorEncoder
```
### 步骤 5 —— 使用输出
该工具会生成 `encoded_shellcode.h`:
```
unsigned char shellcode[] = { 0xdd, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d };
```
将此文件复制到你的项目中并包含它:
```
#include "encoded_shellcode.h"
```
要在运行时解码,只需在执行前使用相同的密钥再次调用 `XOR()`:
```
XOR(key, shellcode, sizeof(shellcode));
```
## 📊 示例
**输入 shellcode** (NOP sled):
```
0x90, 0x90, 0x90, 0x90
```
**密钥:** `"mysecretkey"`
**编码后的输出:**
```
0x90 ^ 'm' = 0xFD
0x90 ^ 'y' = 0x09
0x90 ^ 's' = 0x03
0x90 ^ 'e' = 0xF5
```
## ⚠️ 限制
| 问题 | 详情 |
|---|---|
| 无密钥验证 | 空密钥会在 `key.length()` 中导致除以零错误 —— 务必设置一个非空密钥 |
| 仅支持 XOR | 单层混淆 —— 结合 AES 以获得更强的保护 |
| 密钥以明文存储 | 密钥在二进制文件中可见 —— 考虑对其进行混淆 |
## 🛡️ 学习内容
| 主题 | 详情 |
|---|---|
| XOR 混淆 | 滚动密钥 XOR 在字节级别是如何工作的 |
| Shellcode 编码 | 编码后的 payload 如何逃避静态签名检测 |
| C++ 文件 I/O | 将格式化的输出写入 `.h` 头文件 |
| 对称编码 | 为什么 XOR 使用相同密钥时是其自身的逆运算 |
## 👤 作者
**Khalid** —— 网络安全学生
GitHub: [@khalid609](https://github.com/khalid609)
## 📄 许可证
仅供教育和授权的安全研究使用。
标签:C++, DNS 反向解析, Gophish, Shellcode编码, 数据擦除, 混淆