﻿# FileBot 5.2.3 许可证机制还原与一键激活工作台

<p align="center">
  <img src="https://img.shields.io/badge/Release-v1.0.0-09090b?style=for-the-badge&logo=github" alt="Release" />
  <img src="https://img.shields.io/badge/License-MIT-09090b?style=for-the-badge" alt="License" />
  <img src="https://img.shields.io/badge/Build-Passing-09090b?style=for-the-badge" alt="Build" />
  <img src="https://img.shields.io/badge/Platform-Windows%20%7C%20Linux%20%7C%20macOS-09090b?style=for-the-badge" alt="Platform" />
  <img src="https://img.shields.io/badge/Website-filebot.int0.cc-09090b?style=for-the-badge" alt="Website" />
</p>

<p align="center">
  <b>简体中文</b> | <a href="README_EN.md">English</a> | <a href="https://filebot.int0.cc">🌐 项目官网</a>
</p>

> 🌐 **项目官网**：[https://filebot.int0.cc](https://filebot.int0.cc)  
> 📦 **开源仓库**：[https://filebot.int0.cc](https://filebot.int0.cc)  
> 💎 **正版购买**：[FileBot 官方网站 (https://www.filebot.net)](https://www.filebot.net) ｜ [购买通道 (https://www.filebot.net/purchase.html)](https://www.filebot.net/purchase.html)

一个开源、可审计的 **FileBot 5.2.3 (x64) 许可证机制还原与一键激活工程**（纯离线，本地校验链完整复刻）。

本项目针对 **FileBot 5.2.3 (r10990)**（Java 11 字节码，Windows MSI 部署）进行了深度逆向工程分析，完整厘清了其"PGP 清文签名许可证 + 内嵌公钥 + 在线订单校验 + 库级 SHA-256 反篡改白名单"四层防御体系，并给出三条可审计的工程化路径：Python 工具链、Java 工具链、以及打包好的 **C# 一键激活 exe**（复用 FileBot 自带 JRE 与 BouncyCastle，零额外依赖，双击即激活）。

> **声明**：本项目仅供计算机逆向工程、密码学分析与软件安全机制的学习、研究与学术交流。请勿用于商业及未授权用途，生产及商业环境请支持并购买 [FileBot 官方正版授权](https://www.filebot.net/purchase.html)。

---

## 核心特性

- **四层体系深度解构**：license 文件格式（PGP 清文签名）、签名验证（`License.getProperties` → `PGP.verifyClearSignMessage`，BouncyCastle）、在线激活（`POST https://license.filebot.net/verify/{Order}`）、反篡改（`LicenseModel$1` 对 `bcpg.jar` / `bcprov.jar` / `jna` 等的**整个 jar 文件 SHA-256 白名单**）。
- **官方公钥提取与解析**：从 `net/filebot/License.class` 字节码中提取 1195 字节 PGP 公钥环，解析出官方主钥 `CA128D0824CE20D9`（RSA-2048）与签名子钥 `2D0F9E803711F86F`。
- **自签名 license 生成器**：用自建 RSA-2048 主钥对属性文本做 SHA-512 规范文本清文签名，哈希处理与 FileBot 验证端**逐字节对齐**（经 FileBot 自带 `PGP` 类实测）。
- **方法级字节码补丁器**：不依赖第三方库、不触发库级 SHA-256 自检，仅替换 `License.class` 的 `getPublicKey()` 数组并可选把 `verifyLicense()` 置空（旁路在线订单校验）。`filebot.jar` 自身不在反篡改白名单内。
- **一键激活 exe**：参考主流 keygen 工具风格的 C# WinForms 单文件工具（`FileBotActivate.exe`），自动完成"备份 jar → 生成密钥 → 签名 license → patch jar → 写入 `%APPDATA%\FileBot\license.txt`"，全程复用 FileBot 自带 JRE 与 BouncyCastle，**无需安装 Java/Python**。
- **100% 实机验证**：三条链路生成的 license 均被真实 `filebot.exe` 接受，`filebot -script fn:sysinfo` 显示 `License: FileBot License Pxxxxxxxxx`。

---

## 快速开始

### 1. 一键激活（GUI，推荐）

运行 `tools/FileBotActivate.exe` 或从 [Releases](https://filebot.int0.cc/releases) 下载：
1. 程序自动探测 FileBot 安装目录（`A:\filebot`、`%LOCALAPPDATA%\Programs\FileBot`、`C:\Program Files\FileBot` 等，也可手动浏览）。
2. 输入期望的用户名（默认 `Pro User`）与邮箱（可点"随机邮箱"）。
3. 勾选"旁路在线订单校验（离线激活，推荐）"。
4. 点击 **"一键激活"**：自动备份 `filebot.jar` → 生成密钥对 → 签名 license → patch jar → 写入 `%APPDATA%\FileBot\license.txt`。
5. 重启 FileBot 生效。

命令行（无窗口）模式：

```powershell
tools\FileBotActivate.exe --cli --dir "C:\Program Files\FileBot" --name "Pro User"
```

> 💡 补丁前会自动把原 `filebot.jar` 备份为 `filebot.jar.bak`；`verifyLicense()` 置空后不再向 `license.filebot.net` 发请求，纯离线。

### 2. Python 工具链（可审计，需 Python 3 + JDK/JRE + FileBot 自带 bcpg）

```bash
# 0. 编译 Java 工具（FileBotKeygen / FileBotPatch 等）
python src/filebot_keygen.py build-java

# 1. 提取官方内嵌公钥（验证逆向结论）
python src/filebot_keygen.py extract-key A:\filebot\jar\filebot.jar -o pubkey.bin

# 2. 生成自定义 PGP 密钥对
python src/filebot_keygen.py keygen -out .keys

# 3. 生成 license 属性文本 + 签名，得到 license.psm
python src/filebot_keygen.py gen-props -out license.props --name "Pro User"
python src/filebot_keygen.py sign .keys\secring.bin license.props -out license.psm

# 4. 复刻 FileBot 逻辑校验（可选）
python src/filebot_keygen.py verify .keys\pubkey.bin license.psm

# 5. 替换公钥并重打包 jar（--bypass-online 旁路在线校验）
python src/filebot_keygen.py patch-jar A:\filebot\jar\filebot.jar .keys\pubkey.bin -o filebot-patched.jar --bypass-online

# 6. 导入 license
filebot --license license.psm
```

### 3. 纯 Java 工具链（无 Python，直接 javac 编译）

```bash
javac --release 11 -cp "A:\filebot\jar" FileBotKeygen.java FileBotPatch.java
java -cp ".;A:\filebot\jar" FileBotKeygen keygen -out .keys
java -cp ".;A:\filebot\jar" FileBotKeygen sign .keys\secring.bin license.props -out license.psm
java -cp "." FileBotPatch A:\filebot\jar\filebot.jar .keys\pubkey.bin filebot-patched.jar --bypass-online
```

### 4. 测试与验证

```bash
python -m unittest tests.test_keygen -v
powershell -ExecutionPolicy Bypass -File build.ps1
```

---

## 逆向核心原理摘要

### 1. License 文件格式（PGP 清文签名属性文件）

`filebot --license` 接受的许可证是一个 **OpenPGP 清文签名（cleartext signed message，RFC 4880 §7.1）**，签名包裹一段 `Key: Value` 属性文本：

```
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Product: FileBot
Name: Alice
Email: alice@example.com
Order: P123456789
Issue-Date: 2018-06-01
Valid-Until: 
-----BEGIN PGP SIGNATURE-----
...
-----END PGP SIGNATURE-----
```

字段：`Product`、`Name`、`Email`、`Order`（形如 `P123456789`）、`Issue-Date`、`Valid-Until`（可选，缺省为终身）。

### 2. 校验链（`License` 类）

```
License(text)
  └─ getProperties(text)
       └─ PGP.verifyClearSignMessage(text, getPublicKey())
            ├─ normalize：LINEBREAK(\R) 分行 → \s+ 折叠为单空格 → \p{C} 删除 → \r\n 重连
            ├─ ArmoredInputStream 读出 cleartext（正文），哈希输入 = cleartext 去掉末尾 \r\n
            ├─ 用内嵌 PGP 公钥环（主钥）验证 RSA-SHA512 签名
            └─ 解析属性
  ├─ checkExpirationDate()     Valid-Until 过期则抛异常
  └─ verifyLicense(on)         在线 POST https://license.filebot.net/verify/{Order}
                               （响应 JSON status==200 才通过；成功缓存一个月）
```

### 3. 反篡改自检（`LicenseModel$1`）

`PGPSignedMessage.check()` 先对 `org.bouncycastle.openpgp.PGPSignature` / `org.bouncycastle.crypto.Signer` 所在 **jar 文件整体**计算 SHA-256 并与硬编码值比对：

- `bcpg.jar`     → `e7c474f471d59f399b7837dfb13db96d488d7a22abd50e6c00191b48d9daa0dc`
- `bcprov.jar`   → `ec10f70d236ea88c978dbb88ae2b1a298b6049398287eb76b574b79c69315173`

**因此不能 patch `bcpg.jar` / `bcprov.jar`（会触发 `IncompatibleClassChangeError`）**，但 `filebot.jar` 自身不在白名单内 —— 本项目只 patch `net/filebot/License.class`，可在恶意检测下安全运行。

### 4. 激活路径（本项目的做法）

1. `keygen`：生成 RSA-2048 主钥（签名用途），输出 `pubkey.bin`（公钥环）/ `secring.bin`。
2. `sign`：对属性文本做 SHA-512 清文签名（规范化细节与验证端逐字节对齐）。
3. `patch-jar`：把 `License.class#getPublicKey()` 返回数组替换为自定义公钥环（等价于"换锁、配自己钥匙"）；`--bypass-online` 把 `verifyLicense(boolean)` 方法体替换为 `return`（`0xB1`），使激活完全离线。
4. 将 `license.psm` 写入 `%APPDATA%\FileBot\license.txt`。

更多推导细节见 [`docs/activation-mechanism.md`](docs/activation-mechanism.md)、[`docs/algorithm.md`](docs/algorithm.md) 与 [`docs/reverse-engineering.md`](docs/reverse-engineering.md)。

---

## 常见问题 (FAQ)

### Q: 运行激活后如何恢复到官方原始状态？
程序在执行字节码补丁前，会自动将 FileBot 安装目录下的 `jar/filebot.jar` 备份为 `filebot.jar.bak`。恢复时只需将 `filebot.jar.bak` 重命名覆盖回 `filebot.jar`，并删除 `%APPDATA%/FileBot/license.txt` 即可。

### Q: 为什么杀毒软件可能会弹出提示或误报？
由于本项目涉及修改已安装程序的 Java 字节码（Patch 操作）以及包含 "Keygen/Activator" 关键字，部分启发式杀毒引擎可能会判定为风险工具。本项目完全开源可审计，所有源代码均在 GitHub 公开。

### Q: 旁路在线订单校验（Bypass Online Verify）的作用是什么？
FileBot 默认在启动时会向 `license.filebot.net` 发送 Order 校验请求。开启旁路功能会将 `License.class` 的 `verifyLicense()` 方法直接替换为 `return` 指令（`0xB1`），使软件在无网络或离线环境下也能正常永久运行。

---

## 项目结构

```
filebot-keygen/
├── web/                         # 项目官方网站 (Vite + React + TailwindCSS)
├── src/
│   ├── filebot_keygen.py        # 统一 CLI（build-java/extract-key/keygen/sign/verify/check/gen-props/patch-jar）
│   ├── classfile.py             # 极简 JVM class 解析器 + 方法体替换（纯标准库）
│   ├── extract_pubkey.py        # 提取 License.class 内嵌公钥
│   ├── patch_jar.py             # jar patch（公钥替换 + verifyLicense 旁路）
│   ├── FileBotKeygen.java       # PGP 密钥对生成 / 清文签名 / 验证（bcpg）
│   ├── FileBotPatch.java        # jar patch 的纯 JDK 实现（C# exe 内嵌）
│   ├── FileBotActivator.cs      # 一键激活 GUI + CLI（C# / WinForms）
│   ├── TestVerify.java          # 用 FileBot 自带 PGP 类验证签名的兼容性测试器
│   └── PGPInspector.java        # 公钥环解析工具
├── tools/
│   ├── FileBotActivate.exe      # 编译就绪的一键激活工具（双击即用）
│   └── filebot_pubkey.bin       # 从 FileBot 提取的官方公钥环（逆向对照物）
├── tests/
│   ├── test_keygen.py           # 单元测试（无官方 jar 时自动跳过依赖项）
│   └── data/demo/               # 演示密钥对与 props 模板（仅供测试）
├── docs/
│   ├── activation-mechanism.md  # license 体系与激活机制深度报告
│   ├── algorithm.md             # 签名格式 / 哈希对齐 / 字节码补丁规范
│   └── reverse-engineering.md   # 逆向过程全记录
├── build.ps1                    # 一键编译 Java 工具 + C# 激活器 + 临时副本 E2E 自检
├── LICENSE                      # MIT 开源许可证
└── README.md                    # 项目中文文档
```

---

## 免责声明（Disclaimer）

1. **仅供学习与学术研究 (Educational & Research Purpose Only)**：本项目仅用于计算机软件逆向工程、密码学分析与软件安全机制的学习、交流与学术探讨。
2. **禁止商业与未授权用途 (Non-Commercial & Authorized Use Only)**：严禁将本项目任何内容用于商业牟利、二次转售、批量分发或未经著作权方授权的环境。
3. **支持正版软件 (Support Genuine Software)**：请前往 [FileBot 官网 (https://www.filebot.net)](https://www.filebot.net) 购买官方正版授权。
4. **无担保与责任自负 (As-Is & Limitation of Liability)**：本项目按"现状 (AS IS)"提供，不提供任何形式的明示或暗示担保。
5. **版权与合规声明 (Copyright Notice & Compliance)**：FileBot 及其商标、版权归原作者 Reinhard Pointner 所有。若有权利方认为本项目侵权，请通过 GitHub Issue 联系，将及时处理。

---

## 许可证 (License)

本项目采用 [MIT License](LICENSE) 开源协议。
