umpolungfish/byvalver
GitHub: umpolungfish/byvalver
一款 shellcode 坏字节清除工具,通过语义等价变换在保持功能不变的前提下移除指定的非法字节。
Stars: 62 | Forks: 9
byvalver (·𐑚𐑲𐑝𐑨𐑤𐑝𐑼)
SHELLCODE 坏字节清除工具
概述 • 快速开始 • 交互式 TUI • 定向坏字节消除 • 坏字节配置文件 • 功能特性 • 系统架构 • 系统要求 • 依赖项 • 构建 • 安装 • 使用说明 • 混淆策略 • 去空化策略 • ML 训练 • Agent 集合 • 开发 • 疑难解答 • 许可证
## 目录 - [概述](#overview) - [快速开始](#quick-start) - [安装](#installation) - [基本用法](#basic-usage) - [验证](#verification) - [跨架构支持](#cross-architecture-support) - [批处理](#batch-processing) - [交互式 TUI](#interactive-tui) - [定向坏字节清除](#targeted-bad-byte-banishment) - [坏字节配置文件](#bad-byte-profiles) - [功能特性](#features) - [高级转换引擎](#advanced-transformation-engine) - [性能指标](#performance-metrics) - [混淆层](#obfuscation-layer) - [基于 ML 的策略选择](#ml-powered-strategy-selection) - [输出选项](#output-options) - [验证套件](#verification-suite) - [系统架构](#architecture) - [系统要求](#system-requirements) - [依赖项](#dependencies) - [构建](#building) - [安装](#installation-1) - [使用说明](#usage) - [混淆策略](#obfuscation-strategies) - [去空化策略](#denullification-strategies) - [ML 训练与验证](#ml-training--validation) - [Agent 集合](#agent-menagerie) - [开发](#development) - [文档](#documentation) - [疑难解答](#troubleshooting) - [许可证](#license)
## 概述 `byvalver` 是一个用 `C` 构建的 CLI 工具,用于自动从 x86/x64/ARM/ARM64 shellcode 中消除(或称**“清除”**)`bad-bytes`(坏字节),同时保持完整的功能等价性 **v4.0 新特性:跨架构支持** | 架构 | 成熟度 | 策略数 | 备注 | |---|---|---|---| | **x86** (32位 Intel/AMD) | 稳定版 v4.2 | 150+ | 经过生产测试,覆盖全面 | | **x64** (64位 Intel/AMD) | 稳定版 v4.2 | 150+ | 默认架构,经过生产测试 | | **ARM** (32位) | 实验版 v0.1 | 7 个核心 | 有限测试,仅支持核心指令 | | **ARM64** (AArch64) | 实验版 v0.1 | 基础 | 框架就绪,策略极少 | - 通过 `--arch` 标志自动选择 Capstone 模式 **v4.0.1 错误修复:** - 修复了 ARM SUB 指令编码(修正了操作码 0x2 的 I=1 位) - 修复了直通策略的 ARM64 策略 `can_handle` 逻辑 - 在选择 ARM/ARM64 架构时增加了实验性警告 - 增加了架构不匹配检测启发式方法 - 改进了代码组织(将 includes 移至文件作用域) **v4.2 新特性:增强的 x64 支持** - **x86/x64 策略兼容层**:现有 128+ 种 x86 策略现可用于 x64 shellcode - **5 个全新的 x64 专用策略文件**:MOVABS, SBB, TEST, SSE Memory, LEA Displacement - **扩展寄存器编码**:全面支持 R8-R15,并正确处理 REX 前缀 - **REX 前缀工具集**:`is_64bit_register()`,`is_extended_register()`,`build_rex_prefix()` - 解决了仅 x64 的 shellcode 样本上 100% 的失败率问题 该工具使用 `Capstone` 反汇编框架来分析指令,并应用 175+ 种排序好的转换策略,用等效的替代方案替换包含 `bad-byte` 的代码 通用的 `bad-byte` 清除框架提供 2 种使用模式: 1. **直接指定**:`--bad-bytes` 选项允许指定任意字节进行清除(例如,使用 `--bad-bytes "00,0a,0d"` 处理换行安全的 shellcode) 2. **基于配置文件**:`--profile` 选项使用针对常见漏洞利用场景预配置的坏字节集合(例如,`--profile http-newline`,`--profile sql-injection`,`--profile alphanumeric-only`) 支持 `Windows`,`Linux` 和 `macOS` **核心技术:** - 纯 `C` 实现,确保高效率和底层控制 - `Capstone` 用于精确反汇编 - `NASM` 用于生成解码器存根 - 模块化策略模式,支持可扩展的转换(153+ 个策略实现) - 神经网络集成,用于智能策略选择 - 双相处理:先混淆,然后去空化 ### 坏字节清除操作示例
## 快速开始
几分钟即可上手 `byvalver`:
### 安装
**选项 1:从 GitHub 获取(推荐)**
```
curl -sSL https://raw.githubusercontent.com/umpolungfish/byvalver/main/install.sh | bash
```
**选项 2:从源码构建**
```
git clone https://github.com/umpolungfish/byvalver.git
cd byvalver
make
sudo make install
sudo make install-man # Install man page
```
### 基本用法
**清除空字节(默认):**
```
byvalver input.bin output.bin
```
**使用坏字节配置文件:**
```
# HTTP 上下文(移除 null、换行符、回车符)
byvalver --profile http-newline input.bin output.bin
# SQL injection 上下文
byvalver --profile sql-injection input.bin output.bin
# 纯字母数字 shellcode(限制最严格)
byvalver --profile alphanumeric-only input.bin output.bin
```
**手动指定坏字节:**
```
# 消除 null 字节和换行符
byvalver --bad-bytes "00,0a,0d" input.bin output.bin
```
**高级功能:**
```
# 在 denullification 之前添加混淆层
byvalver --biphasic input.bin output.bin
# 启用 ML 驱动的策略选择
byvalver --ml input.bin output.bin
# 生成带有 decoder stub 的 XOR 编码 shellcode
byvalver --xor-encode DEADBEEF input.bin output.bin
# 以不同格式输出
byvalver --format c input.bin output.c # C array
byvalver --format python input.bin output.py # Python bytes
byvalver --format hexstring input.bin output.hex # Hex string
```
### 验证
务必验证您转换后的 shellcode:
```
# 检查剩余的 bad byte
python3 verify_denulled.py --bad-bytes "00,0a,0d" output.bin
# 验证功能等效性
python3 verify_functionality.py input.bin output.bin
```
### 跨架构支持
`byvalver` 通过 `--arch` 标志支持多种架构:
**x86 (32位 Intel/AMD)** - 全面支持,包含 150+ 种策略
```
byvalver --arch x86 --bad-bytes "00" x86_shellcode.bin output.bin
```
**x64 (64位 Intel/AMD)** - 全面支持(默认)
```
byvalver --arch x64 --bad-bytes "00,0a,0d" x64_shellcode.bin output.bin
```
**ARM (32位)** - 实验性支持,包含基本策略
```
byvalver --arch arm --bad-bytes "00" arm_shellcode.bin output.bin
```
**ARM64 (AArch64)** - 实验性支持,包含基本策略
```
byvalver --arch arm64 --bad-bytes "00,0a" arm64_shellcode.bin output.bin
```
**注意事项:**
- ARM/ARM64 支持侧重于核心指令(MOV、算术指令、加载/存储)
- 对 ARM 使用较简单的坏字节配置文件(例如,仅限空字节)
- 选择 ARM/ARM64 时会显示实验性警告
- 基础的架构不匹配检测会在 shellcode 似乎属于错误架构时发出警告
- 计划在未来的版本中加入自动架构检测
### 批处理
处理整个目录:
```
# 递归处理所有 .bin 文件
byvalver -r --pattern "*.bin" input_dir/ output_dir/
# 将 HTTP profile 应用于目录中的所有 shellcode
byvalver -r --profile http-newline input_dir/ output_dir/
```
## 交互式 TUI
在代表常见和复杂空字节来源的多样化测试语料库上实现了 100% 的空字节清除率。
### 高级转换引擎
170+ 种策略实现,几乎涵盖了所有常见的空字节来源和通用坏字节模式(在 v3.0、v3.6、v3.7、v3.8、v4.0 和 v4.1 中新增了多个策略家族):
- `CALL/POP` 和基于栈的立即数加载
- 带有哈希 API 解析的 `PEB` 遍历
- 使用复杂算法的高级基于哈希的 API 解析
- 用于加载多个 DLL 的多阶段 `PEB` 遍历
- `SALC`、`XCHG` 和基于标志的清零操作
- `LEA` 算术替换
- `Shift` (移位) 和算术值构造
- 多 `PUSH` 字符串构建
- 针对 Windows 结构的基于栈的结构体构造
- 带有高级模式的基于栈的字符串构造
- `SIB` 和位移重写
- 条件跳转位移处理
- 寄存器重映射与链接
- 增强的 `SALC`+`REP STOSB` 缓冲区初始化
- 高级字符串操作转换
- 原子操作编码链
- 基于 `FPU` 栈的立即数编码
- 基于 `XLAT` 表的字节转换
- `LAHF`/`SAHF` 标志保留链
- **v3.6 新增**:`BCD` 算术混淆 (`AAM`/`AAD`)
- **v3.6 新增**:`ENTER`/`LEAVE` 栈帧替代方案
- **v3.6 新增**:用于常量的 `POPCNT`/`LZCNT`/`TZCNT` 位计数
- **v3.6 新增**:`SIMD` `XMM` 寄存器立即数加载
- **v3.6 新增**:`JECXZ`/`JRCXZ` 零测试跳转转换
- **v3.7 新增**:条件跳转操作码坏字节消除(带有坏操作码的 JE/JNE/JG/JL)
- **v3.7 新增**:寄存器到寄存器传输坏字节操作码(MOV/XCHG 替代方案)
- **v3.7 新增**:栈帧指针坏字节消除(PUSH/POP EBP 替代方案)
- **v3.7 新增**:ModR/M 和 SIB 字节坏字节消除(替代寄存器组合)
- **v3.7 新增**:多字节立即数部分坏字节(旋转优化)
- **v3.7 新增**:按位操作立即数坏字节(带有寄存器的 AND/OR/XOR/TEST)
- **v3.7 新增**:单字节操作码替换(INC/DEC/PUSH/POP 替代方案)
- **v3.7 新增**:字符串指令前缀坏字节(REP 前缀到循环的转换)
- **v3.7 新增**:操作数大小前缀坏字节(16 位到 32 位的转换)
- **v3.7 新增**:段寄存器坏字节检测(FS/GS 前缀检测)
- **v3.8 新增**:感知配置文件的 SIB 生成系统(消除了硬编码的 0x20 SIB 字节)
- **v3.8 新增**:针对条件跳转处理和部分寄存器优化的关键修复
- **v3.9 新增**:多态 NOP 插入,带有多种 NOP 等效指令
- **v3.9 新增**:常量展开,用于立即数混淆
- **v3.9 新增**:带有 XCHG 模式的寄存器重命名混淆
- **v3.9 新增**:用于算术操作的栈溢出混淆
- **v3.9 新增**:带有 NOP 插入的指令重排
- **v3.9 新增**:运行时自修改策略(基础实现)
- **v3.9 新增**:重叠指令生成
- **v4.0 新增**:带有 Capstone 动态模式选择的 ARM/ARM64 跨架构支持
- **v4.0 新增**:带有 MVN 转换的 ARM 立即数编码
- **v4.0 新增**:ARM MOV 策略(原始方案,基于 MVN 的空字节规避)
- **v4.0 新增**:ARM 算术策略(ADD 与 SUB 转换)
- **v4.0 新增**:ARM 内存策略(LDR/STR 直通)
- **v4.0 新增**:ARM 分支策略(B/BL 直通)
- **v4.1 新增**:SETcc 标志累积链(条件跳转消除)
- **v4.1 新增**:多态立即数构造(多种编码变体)
- **v4.1 新增**:寄存器依赖链优化(多指令模式)
- **v4.1 新增**:RIP 相对寻址优化(x64 PIC 改进)
- **v4.1 新增**:负位移内存寻址(位移替代方案)
- **v4.1 新增**:多字节 NOP 交错(混淆 NOP 变体)
- **v4.1 新增**:位操作常量构造 (BSWAP, BSF, POPCNT, BMI2)
- **v4.2 新增**:x86/x64 策略兼容层(在 x64 上启用 128+ 种 x86 策略)
- **v4.2 新增**:MOVABS 64 位立即数策略(REX.W MOV 与 XOR/ADD 构造)
- **v4.2 新增**:SBB 立即数零策略(SBB AL/AX/EAX, 0 转换)
- **v4.2 新增**:TEST 大立即数策略(TEST EAX/RAX, imm32 带寄存器操作数)
- **v4.2 新增**:SSE 内存操作策略 (MOVUPS/MOVAPS/MOVDQU/MOVDQA 空字节消除)
- **v4.2 新增**:LEA x64 位移策略(使用 REX 前缀处理大位移)
- **v4.2 新增**:扩展寄存器支持(R815 寄存器编码工具)
- 全面支持 `MOV`,`ADD/SUB`,`XOR`,`LEA`,`CMP`,`PUSH` 等指令
该引擎采用多遍处理(混淆 → 去空化),并为边缘情况提供了健壮的回退机制
**v3.8 关键改进**:针对 http-whitespace 配置文件的多策略修复
- **问题**:硬编码的坏字节导致了 79.1% 的失败率(158 个文件中有 125 个失败)
- **确定的根本原因**:
- 15 个策略文件中存在 45+ 处硬编码的 SIB 字节 0x20 (SPACE)
- 条件跳转核心逻辑使用了未经验证的坏字节跳过偏移量
- 部分寄存器优化直接写入了坏字节
- 5 个高优先级策略文件中存在额外的硬编码坏字节
- **实施的解决方案**:
- 集中化的、感知配置文件的 SIB 生成,带有 3 级回退机制(STANDARD → DISP8 → PUSHPOP)
- 针对条件跳转跳过偏移量的动态 NOP 填充,以避免坏字节
- 使用分解方法的智能字节构造,用于部分寄存器值
- 使用感知配置文件的替代方案系统性替换硬编码字节
- **影响**:**79.1% 失败率 → 35.4% 失败率**(成功率:**20.9% → 64.6%**)
- **修复的文件**:现有 102 个文件处理成功(+69 个文件,3.09 倍提升)
- **策略成功率**:
- Partial Register Optimization (部分寄存器优化):25% → **100%** (12/12 次转换)
- mov_mem_disp_enhanced:0% → **98.5%** (1605/1629 次转换)
- indirect_call_mem:0% → **98.5%** (135/137 次转换)
- indirect_jmp_mem:0% → **98.5%** (134/136 次转换)
- **性能**:通过智能缓存实现零开销,平均大小增加 <2%
### 性能指标
处理 184 个多样化 shellcode 样本的真实世界性能数据:
```
📊 Batch Processing Statistics:
Success Rate: 184/184 █████████████████████████ 100.00%
Files Processed: 184 █████████████████████████ 100.00%
Failed: 0 ░░░░░░░░░░░░░░░░░░░░░░░░░ 00.00%
Skipped: 0 ░░░░░░░░░░░░░░░░░░░░░░░░░ 00.00%
```
```
🧠 ML Strategy Selection Performance:
Processing Speed:
Instructions/sec: 19.5 inst/sec ████████████░░░░░░░░░░░░░
Total Instructions: 20,760
Session Duration: 1,067 seconds
Null-Byte Elimination:
Eliminated: 18,636/20,760 ██████████████████████░░░ 89.77%
Strategies Applied: 20,129
Success Rate: 92.57% ███████████████████████░░ 92.57%
Learning Progress:
Positive Feedback: 18,636 ███████████████████████░░ 92.57%
Negative Feedback: 1,493 █░░░░░░░░░░░░░░░░░░░░░░░░ 07.43%
Total Iterations: 40,889
Avg Confidence: 0.0015 ░░░░░░░░░░░░░░░░░░░░░░░░░ 00.15%
```
```
🏆 Top Performing Denullification Strategies:
Strategy Attempts Success% Confidence
-------- -------- -------- ----------
ret_immediate 134 █████████████░░░░░░░░░░░░ 50.00%
MOVZX/MOVSX Null-Byte banishment 162 █████████████░░░░░░░░░░░░ 50.00%
transform_mov_reg_mem_self 774 █████████████░░░░░░░░░░░░ 50.00%
cmp_mem_reg_null 96 ████████████░░░░░░░░░░░░░ 46.88%
cmp_mem_reg 264 ████████████░░░░░░░░░░░░░ 46.97%
lea_disp_null 3900 ███████████░░░░░░░░░░░░░░ 45.38%
transform_add_mem_reg8 2012 ███████████░░░░░░░░░░░░░░ 43.49%
Push Optimized 4214 ███████░░░░░░░░░░░░░░░░░░ 29.31%
ModRM Byte Null Bypass 82 ██████░░░░░░░░░░░░░░░░░░░ 25.61%
conservative_arithmetic 5172 █████░░░░░░░░░░░░░░░░░░░░ 21.37%
arithmetic_addsub_enhanced 1722 ████░░░░░░░░░░░░░░░░░░░░░ 18.12%
PUSH Immediate Null-Byte banishment 3066 ████░░░░░░░░░░░░░░░░░░░░░ 16.54%
SIB Addressing 9560 ████░░░░░░░░░░░░░░░░░░░░░ 16.03%
generic_mem_null_disp_enhanced 22130 ███░░░░░░░░░░░░░░░░░░░░░░ 15.52%
SALC-based Zero Comparison 1654 ███░░░░░░░░░░░░░░░░░░░░░░ 12.88%
```
```
⚡ Processing Efficiency:
Learning Rate: 1.97 feedback/instruction
Weight Update Avg: 0.042650
Weight Update Max: 0.100000
Total Weight Updates: 1724.68
Strategy Coverage:
Total Strategies: 153+
Strategies Activated: 117 ████████████████████████░ 95.90%
Zero-Attempt: 5 █░░░░░░░░░░░░░░░░░░░░░░░░ 04.10%
```
### 混淆层
`--biphasic` 模式在去空化之前添加了反分析混淆:
- 控制流平坦化
- 调度器模式
- 寄存器重新分配
- 状态混淆
- 无效代码插入
- NOP 滑梯
- 指令替换
- 等效操作
- 栈帧操作
- API 解析隐藏
- 字符串编码
- 常量编码
- 反调试
- 虚拟机检测技术
### 基于 ML 的策略选择
**架构:**
- **独热指令编码** (51 维) 取代了标量指令 ID
- **上下文窗口**,包含 4 条指令的滑动缓冲区(当前 + 前 3 条)
- **固定特征提取**,每条指令具有稳定的 84 维布局
- **稳定的策略注册表**,确保一致的 NN 输出映射
- **全反向传播**贯穿所有层(输入→隐藏→输出)
- 针对 softmax + 交叉熵损失的**正确梯度计算**
- **输出掩码**在 softmax 之前过滤无效策略
- 用于正确权重初始化的 **He/Xavier 初始化**
- 3 层前馈神经网络 (336→512→200)
- 从成功/失败反馈中进行自适应学习
- 跟踪预测、准确率和置信度
- 平稳回退到确定性排序
### 批处理
- 递归目录遍历 (`-r`)
- 自定义文件模式 (`--pattern "*.bin"`)
- 保持或扁平化结构
- 遇错继续或严格模式
- 兼容所有选项(biphasic、PIC、`XOR` 等)
- **增强的输出**:
- 单文件大小转换及比率
- 失败时详细识别坏字节
- 摘要中的成功/失败百分比
- 失败文件列表(内联显示前 10 个)
- 严格的成功定义:带有残留坏字节的文件被标记为失败
**批处理输出示例:**
```
===== BATCH PROCESSING SUMMARY =====
Total files: 8
Successfully processed: 1 (12.5%)
Failed: 7 (87.5%)
Skipped: 0
Total input size: 650 bytes
Total output size: 764 bytes
Average size ratio: 1.18x
Bad bytes: 5 configured
Configured set: 0x00, 0x09, 0x0a, 0x0d, 0x20
FAILED FILES (7):
- shellcode1.bin
- shellcode2.bin
...
```
### 输出选项
- 格式:raw 二进制,`C` 数组,Python bytes,十六进制字符串
- 带有解码器存根的 `XOR` 编码 (`--xor-encode 0xDEADBEEF`)
- 位置无关代码 (`--pic`)
- 自动创建输出目录
### 统计
当使用 `--stats` 标志时,`byvalver` 提供详细的分析数据:
**策略使用统计:**
- 显示应用了哪些转换策略
- 每个策略的成功/失败率
- 应用计数和每个策略的平均输出大小
**文件复杂性分析:**
- 最复杂的文件(按指令数量计)
- 按输入大小划分的最大/最小文件
- 扩展率最大的文件
- 每个文件的坏字节清除统计
**批处理摘要:**
- 成功/失败百分比
- 详细的坏字节配置
- 失败文件列表,带有保存完整列表的选项
**示例输出:**
```
===== BATCH PROCESSING SUMMARY =====
Total files: 162
Successfully processed: 131 (80.9%)
Failed: 31 (19.1%)
Skipped: 0
Total input size: 35772920 bytes
Total output size: 81609 bytes
Average size ratio: 0.00x
Bad bytes: 3 configured
Configured set: 0x00, 0x0a, 0x0d
====================================
FAILED FILES (31):
- ./winwin.bin
- ./stairslide_secure.bin
...
📊 DETAILED STATISTICS
=====================
STRATEGY USAGE STATISTICS:
┌─────────────────────────────────────────┬─────────┬─────────┬──────────────┬────────────────┐
│ Strategy Name │ Success │ Failure │ Applications │ Avg Output Size│
├─────────────────────────────────────────┼─────────┼─────────┼──────────────┼────────────────┤
│ push_immediate_strategy │ 45 │ 3 │ 48 │ 12.34 │
│ mov_reg_mem_self │ 32 │ 1 │ 33 │ 8.21 │
│ ... │ ... │ ... │ ... │ ... │
└─────────────────────────────────────────┴─────────┴─────────┴──────────────┴────────────────┘
FILE COMPLEXITY ANALYSIS:
Most Complex Files (by instruction count):
- ./complex_payload.bin: 1245 instructions, 4096 -> 5201 bytes (1.27x)
Largest Files (by input size):
- ./large_payload.bin: 8192 bytes input, 10485 bytes output (1.28x)
Smallest Files (by input size):
- ./tiny_shellcode.bin: 64 bytes input, 89 bytes output (1.39x)
Largest Expansion (by size ratio):
- ./expanded.bin: 512 -> 1024 bytes (2.00x expansion)
```
### 验证套件
用于验证的 Python 工具:
- `verify_denulled.py`:确保零坏字节(支持 `--bad-bytes` 用于自定义验证)
- `verify_functionality.py`:检查执行模式
- `verify_semantic.py`:验证等价性
## 系统架构
`byvalver` 采用模块化的策略模式设计:
- Pass 1:(可选)用于反分析的混淆
- Pass 2:用于空字节移除的去空化
- 用于策略优化的 ML 层
- 用于可扩展处理的批处理系统
标签:ARM64, C++, DNS 反向解析, Shellcode, TUI, x64, x86, 中高交互蜜罐, 二进制漏洞利用, 代码混淆, 坏字节清理, 客户端加密, 恶意软件开发, 技术调研, 指令集架构, 数据展示, 数据擦除, 文件处理, 汇编编码, 红队, 编码器, 编译器, 网络安全, 解码器, 逆向工具, 隐私保护