MuneneGeo/ZWC-decoder
GitHub: MuneneGeo/ZWC-decoder
一款纯 Python 实现的零宽字符隐写解码器,用于在 CTF 挑战中自动检测并解码隐藏在文本文件中的秘密信息。
Stars: 0 | Forks: 0
# ZWC 解码器 🔍
一个用于检测和解码**零宽字符 (ZWC) 隐写术**的 Python 工具 —— 常用于 CTF(夺旗赛)挑战中。
## 演示

## 什么是 ZWC 隐写术?
零宽字符是真实的 Unicode 字符,在任何文本编辑器、浏览器或终端中渲染时都是**完全不可见的**。攻击者和 CTF 出题者利用它们在看似正常的文本中隐藏秘密信息。
主要使用的三个字符:
| 名称 | Unicode | UTF-8 字节 | 作用 |
|---|---|---|---|
| 零宽空格 (ZWSP) | U+200B | `E2 80 8B` | 编码 bit `0` 或 `1` |
| 零宽非连接符 (ZWNJ) | U+200C | `E2 80 8C` | 编码 bit `0` 或 `1` |
| 零宽连接符 (ZWJ) | U+200D | `E2 80 8D` | 字符之间的分隔符 |
**示例:**文本 `hello` 可能实际上包含 200 个隐藏着秘密 flag 的不可见字符 —— 而你光凭肉眼是绝对看不出来的。
## 功能
- 自动检测任何文件中的所有零宽字符
- 尝试**所有可能的编码组合**,省去你猜测的麻烦
- 处理 7 位和 8 位 ASCII 编码
- 处理带分隔符或不带分隔符的文件
- 检测:U+200B、U+200C、U+200D、U+2060、U+FEFF
- 显示可见(诱饵)文本与隐藏字符的数量对比
- 当多种策略成功时,允许你选择正确的结果
- 可选择将结果保存到文件中
- 彩色终端输出,方便阅读
## 环境要求
- Python 3.6 或更高版本
- 无需外部库 —— 仅使用 Python 标准库
## 安装
```
# Clone 仓库
git clone https://github.com/MuneneGeo/ZWC-decoder.git
# 进入文件夹
cd ZWC-decoder
# 设为可执行文件 (Linux/Mac)
chmod +x zwc_decoder.py
```
## 用法
```
python3 zwc_decoder.py
```
系统会提示你输入文件路径:
```
[?] Enter file path: /home/kali/ctf/suspicious_file.txt
```
该工具随后会:
1. 分析文件并报告找到的所有隐藏字符
2. 自动尝试所有解码策略
3. 显示所有可读的解码结果
4. 提示你识别出 flag
5. 可选择将结果保存到 `zwc_results.txt`
## 示例输出
```
[+] Loaded: not_fl4g.txt
── FILE ANALYSIS ─────────────────────────
Total characters : 231
Visible text : 24 chars → 'r00t{naah_not_the_flag}'
Hidden chars : 207
Breakdown:
ZWSP U+200B (Zero-Width Space) : 106
ZWNJ U+200C (Zero-Width Non-Joiner) : 75
ZWJ U+200D (Zero-Width Joiner) : 26
[+] Hidden characters detected! Starting decode...
── TRYING ALL DECODE STRATEGIES ──────────
[+] Strategy 3 : 0=U+200C, 1=U+200B, sep=U+200D, bits=7
Result: r00t{H1dd3n_1n_Pl41n_S1ght}
🚩 FLAG: r00t{H1dd3n_1n_Pl41n_S1ght}
```
## 工作原理
### 第一步 —— 检测
扫描文件中的每个字符,寻找零宽 Unicode 码点。
### 第二步 —— 分析
报告找到的各种字符数量,以及可见(诱饵)文本的内容。
### 第三步 —— 解码
尝试以下所有组合:
- 哪个字符代表 `0`,哪个字符代表 `1`
- 哪个字符充当分隔符(或没有分隔符)
- 编码是 7 位还是 8 位 ASCII
### 第四步 —— 呈现
显示所有可读的解码结果,并让你挑选出 flag。
## 在 Kali Linux 上的 CTF 工作流
```
# 1. 如果文件位于受密码保护的 zip 中,请先破解它
zip2john challenge.zip > hash.txt
john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
unzip -P challenge.zip
# 2. 运行 decoder
python3 zwc_decoder.py
# 3. 提示时输入提取的文件路径
# 4. 从结果中获取你的 flag
```
## 手动检测 ZWC(供学习参考)
```
# 方法 1 — hexdump(寻找 e2 80 8b / 8c / 8d 字节)
hexdump -C file.txt | grep "e2 80"
# 方法 2 — cat -v(将隐藏字符显示为符号)
cat -v file.txt
# 方法 3 — Python 单行命令
python3 -c "
text = open('file.txt', encoding='utf-8').read()
for i, ch in enumerate(text):
if ord(ch) in (0x200B, 0x200C, 0x200D):
print(f'pos {i}: U+{ord(ch):04X}')
"
```
## 支持的编码方案
| 方案 | 是否支持 |
|---|---|
| ZWSP=0, ZWNJ=1, ZWJ 分隔符 | ✅ |
| ZWSP=1, ZWNJ=0, ZWJ 分隔符 | ✅ |
| 无分隔符,7 位数据块 | ✅ |
| 无分隔符,8 位数据块 | ✅ |
| Word Joiner (U+2060) 作为分隔符 | ✅ |
| BOM (U+FEFF) 作为分隔符 | ✅ |
## 许可证
MIT 许可证 —— 可免费使用、修改和分发。
## 作者
CTF 玩家
[GITHUB] https://github.com/MuneneGeo
专为 CTF 隐写术挑战而开发。
如果它帮助你拿到了 flag —— 请给个 ⭐
标签:DNS 反向解析, Python, 无后门, 解码器, 逆向工具, 隐写术