000nico/tango-packer
GitHub: 000nico/tango-packer
一款开源的 Windows x64 PE 加壳器,通过 ChaCha20 加密、Freestanding C stub 注入与 VEH 按需解密实现可执行文件的运行时混淆与反分析保护。
Stars: 1 | Forks: 0
```
_____
__ /______ ______________ ______
_ __/ __ `/_ __ \_ __ `/ __ \
/ /_ / /_/ /_ / / / /_/ // /_/ /
\__/ \__,_/ /_/ /_/_\__, / \____/
/____/
```
# Tango Packer
**Tango Packer** 是一款高性能的 Windows PE(Portable Executable)加壳器和保护器,专为运行时可执行文件混淆、payload 加密和反分析研究而设计。它通过加密可执行代码段、注入无依赖的 C runtime stub,并在运行时无缝恢复原始执行流程,来处理 64 位 PE 二进制文件(x86_64)。
## 技术架构概述
Tango Packer 的架构分为两个在不同执行层级上运行的解耦组件:
```
┌────────────────────────────────────────────────────────────────────────┐
│ 1. Packing Phase (Rust) │
│ │
│ [ Target PE Binary ] ──► PE Parser ──► ChaCha20 Encryption Engine │
│ │ │
│ [ Output Executable ] ◄── PE Header Restructurer ◄─┴─ Stub Injector │
└────────────────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────────┐
│ 2. Runtime Stub Unpacking (C) │
│ │
│ [ Process Entry Point ] ──► PEB Module Walk & API Hash Resolution │
│ │ │
│ [ Original Entry Point (OEP) ] ◄── ChaCha20 Decrypt & Memory Protect │
└────────────────────────────────────────────────────────────────────────┘
```
### 1. 加壳引擎 (`Rust`)
该加壳引擎使用安全的 Rust 编写,作为一个离线二进制转换工具运行:
* **PE 格式解析器**:自定义二进制解析器,旨在解码 `IMAGE_DOS_HEADER`、`IMAGE_NT_HEADERS64` 和 `IMAGE_SECTION_HEADER` 结构,以定位可执行段(`IMAGE_SCN_MEM_EXECUTE`)。
* **ChaCha20 加密引擎**:实现 **ChaCha20** 对称流密码(256 位密钥,96 位 nonce),用于加密 `.text` 和指定的可执行段。ChaCha20 确保了高吞吐量的流加密,破坏了静态字节签名并扰乱了静态反汇编。
* **PE 头重构**:
* 将新的 PE 段头(`.stub` / `.tango`)附加到目标段表中。
* 将段特征调整为 `IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_CNT_CODE`。
* 重新计算 `SizeOfImage`、段对齐(`SectionAlignment`、`FileAlignment`),并更新 `AddressOfEntryPoint` 使其直接指向注入的 stub shellcode。
* **模式补丁**:在最终的 PE 序列化之前,将运行时变量(例如,原始入口点 (OEP) 相对地址和 ChaCha20 加密密钥/nonce)动态注入到 stub 二进制文件内预定义的签名标记中。
### 2. 运行时 Stub (`Freestanding C`)
该 stub 是一个注入到宿主可执行文件中的、极简的且位置无关的 runtime 执行单元:
* **Freestanding 编译**:使用纯 C 编程,没有标准库绑定(`-nostdlib`、`-nodefaultlibs`、`-ffreestanding`)。它不会留下任何导入表项(IAT),完全在宿主进程分配的内存中执行。
* **通过 PEB 遍历进行动态 API 解析**:
* 通过遍历进程环境块(`PEB -> PPEB_LDR_DATA -> InMemoryOrderModuleList`)来定位 `kernel32.dll` 和 `ntdll.dll` 的基地址。
* 使用 **DJB2 / ROR13 API 名称哈希**动态解析 Windows Native API(`VirtualProtect`、`VirtualAlloc`、`AddVectoredExceptionHandler`、`NtFlushInstructionCache`),从而消除二进制文件中的静态 API 字符串。
## 核心技术特性与规避技术
### ChaCha20 Payload 加密
* 在加壳过程中,可执行代码段(例如 `.text`)使用 **ChaCha20** 256 位流密码进行加密。
* 在运行时,stub 初始化 ChaCha20 状态矩阵,展开 256 位密钥和 nonce,并在执行 payload 之前对目标虚拟内存区域执行就地流解密。
### 向量化异常处理 (VEH) 与按需页面解密
* **页面保护操纵**:加密的代码段最初可以被设置为不可执行的内存权限(`PAGE_NOACCESS` 或 `PAGE_READONLY`)。
* **VEH 访问错误拦截**:通过 `AddVectoredExceptionHandler` 注册自定义的向量化异常处理程序。当触发 `EXCEPTION_ACCESS_VIOLATION`(当执行跳转到加密页面时),VEH 会拦截异常,使用 ChaCha20 动态解密目标页面,将页面权限提升为 `PAGE_EXECUTE_READ`,并恢复正常指令执行。
### 反调试与环境完整性检查
### (TO-DO) 自定义指令虚拟机 (VM)
* 关键的初始化和执行控制逻辑被嵌入在自定义的指令 VM 架构中。
* 用自定义 bytecode 替换原生的 x86_64 指令,该 bytecode 由 stub 动态解释,以防止直接的静态反编译和自动化的逆向工程工具(例如 Ghidra、Hex-Rays)。
## 执行流程管道
```
1. [Disk] Host Binary Loading
└─► OS Loader reads PE headers, maps sections, jumps to new Entry Point (Stub).
2. [Memory] Stub Initialization
├─► Read PEB to locate Loaded Modules (kernel32.dll / ntdll.dll).
├─► Parse Export Address Table (EAT) & Resolve APIs via Hash Matching.
└─► Execute Anti-Debug & Anti-Analysis Routines.
3. [Memory] Unpacking & Decryption
├─► Modify memory page protections via VirtualProtect (PAGE_READWRITE).
├─► Execute ChaCha20 stream decryption across target executable sections.
└─► Restore execution permissions (PAGE_EXECUTE_READ / PAGE_EXECUTE_READWRITE).
4. [Memory] Execution Handover
└─► Indirect jump to Original Entry Point (OEP) to resume normal binary execution.
```
## 构建与编译
### 前置条件
* **Rust 工具链**:`cargo`、`rustc`(Nightly/Stable 2021 版本)
* **MinGW-w64 交叉编译器**:`x86_64-w64-mingw32-gcc`(用于生成独立的 C stub)
* **PowerShell**(Windows)或 **Bash**(Linux/macOS)
### 1. 编译 Freestanding Stub Shellcode
将纯 C stub 二进制文件构建为精简的机器 shellcode:
```
# Windows PowerShell
cd src/core/stub_src
.\build_shellcode.ps1
```
```
# Linux / macOS Bash
cd src/core/stub_src
chmod +x build_shellcode.sh
./build_shellcode.sh
```
### 2. 构建 Rust 加壳器
构建主要的加壳器 CLI 应用程序:
```
# 返回项目根目录
cd ../../../
cargo build --release
```
编译后的二进制文件将位于 `target/release/packer.exe`。
## 用法语法
要加壳目标 64 位 Windows PE 可执行文件:
```
packer.exe
```
输出:
* 在当前工作目录中生成 `output.exe`。
* 输出的可执行文件包含加密的 payload、修改后的入口点以及嵌入的 C 解密 stub。
## 研究与教育免责声明
本项目严格仅用于**教育、逆向工程和安全研究目的**。它作为一个实验性框架,旨在帮助理解二进制结构、PE 头操纵、底层 Windows 内存管理以及反分析机制。作者对任何滥用或未经授权的应用不承担任何责任。
标签:AI合规, DAST, PE打包器, Rust, 二进制混淆, 云资产清单, 可视化界面, 应用安全, 恶意软件分析, 网络流量审计, 逆向工程, 通知系统