Project Status: ⛔ Abandoned (已搁置) Note: This project is a proof-of-concept for protocol-level automation.
这是一个旨在通过协议流(非模拟点击)自动清理《棕色尘埃2》(Brown Dust 2) 日常任务的工具。由于逆向工程的黑盒性质及维护成本,目前已停止开发。
为了安全起见,本项目中的敏感密钥已被替换:
- Game Fixed Key: 代码中已替换为
gamefixedkey。 - Access Token: 示例代码中已替换为占位符。
开发者留言: 如果您有兴趣继续开发此项目,或者需要原始的加密密钥和技术支持,请留言联系我。 Contact: If you wish to continue development, please leave a message for the original encryption key and assistance.
游戏客户端更新频繁,每次更新后通常需要修改 backend/config.py 中的以下字段:
APP_VERSION(应用版本)BUNDLE_VERSION(资源包版本)UNITY_VERSION(Unity 引擎版本)
请务必保持这些配置与当前游戏客户端一致,否则请求可能会被服务器拒绝。
- 核心语言: Python
- 抓包工具: Fiddler
- 逆向工具: dnSpy (用于分析 C# 客户端逻辑)
- 通信方式: Python 网络库直接发包
游戏通信采用了多层封装,具体的加解密流程如下:
graph LR
A[Protobuf Object] -->|Serialize| B[Bytes]
B -->|Base64 Encode| C[Base64 String]
C -->|AES Encrypt| D[AES Bytes]
D -->|Base64 Encode| E[Final Payload]
逻辑公式:Protobuf -> Base64 -> AES -> Base64
graph LR
A[JSON 'data' field] -->|Base64 Decode| B[AES Bytes]
B -->|AES Decrypt| C[Base64 String]
C -->|Base64 Decode| D[Protobuf Bytes]
D -->|Parse| E[Protobuf Object]
逻辑公式:(JSON中的data) -> Base64 -> AES -> Base64 -> Protobuf Bytes
- 初始登录:使用客户端写死的 固定密钥 (Static Key) 进行加密发送登录请求。
- 获取动态密钥:登录成功后,服务器返回加密数据。使用固定密钥解密后,从中提取本次会话的 动态密钥 (Dynamic UserKey)。
- 后续通信:所有后续的业务请求(收菜、抽卡等)均使用该 动态密钥 进行加解密。
- 登录流程 (Login Module)
- 每日免费一抽 (Free Gacha)
- 一键收菜 (Daily Collection):
- 派遣 (Dispatch)
- 20人本/狩猎 (Total War / Hunting)
- 食堂 (Cafeteria)
- 邮件领取 (Mail Module)
- 通行证/任务领取 (Mission Module)
- 狩猎扫荡 (Hunt Module)
- 黄金竞技场 (Golden Arena)
- 鱼篓/钓鱼 (Fishing)
本项目包含敏感的个人账号信息,请务必小心处理。
在 backend/ 目录下,提供了两个示例文件:
config.example.pylogin_module.example.py
使用步骤:
- 将
config.example.py重命名为config.py。 - 将
login_module.example.py重命名为login_module.py。 - 填入敏感信息:
你需要填入抓包获取的 CACHED_ACCESS_TOKEN。
# ⚠️ 敏感信息:请替换为你抓包获取的 Access Token
CACHED_ACCESS_TOKEN = "YOUR_ACCESS_TOKEN_HERE"你需要填入你的角色库存 ID (char_inven_index),用于派遣重置功能。
# ⚠️ 敏感信息:请替换为你自己的角色库存ID
DISPATCH_GROUPS_TO_RESET = [
{"char_inven_index": 123456789, "dispatch_ids": [...]},
...
]
⚠️ 安全警告:config.py和login_module.py包含你的账号凭证,绝对不要将其提交到公开的代码仓库中!建议将这两个文件加入.gitignore。
项目主要分为两个部分,请注意依赖冲突:
整个工具的后端核心逻辑,包含所有业务模块。
main.py: 程序的入口点。负责初始化日志、登录、以及按顺序调用各个业务模块(收菜、抽卡等)。api_client.py: 封装了底层的 HTTP 请求逻辑。处理请求头、加密/解密、Loki 日志上报以及错误处理。config.py: 集中配置文件。包含 API URL、版本号、文件路径以及游戏内的配置 ID(如派遣 ID、通行证 ID)。login_module.py: 处理登录流程。包含FIXED_KEY和CACHED_ACCESS_TOKEN,负责获取动态UserKey。
cafeteria_module.py: 食堂模块。负责领取食堂的累计奖励。dispatch_module.py: 派遣模块。负责领取派遣奖励,并重新派遣失败或完成的任务。gacha_module.py: 抽卡模块。负责每日免费单抽,并维护卡池 ID 的映射关系 (gacha_mapping.json)。hunt_module.py: 狩猎模块。负责执行狩猎场的扫荡任务(如铁矿、木材、金币本等)。mail_module.py: 邮件模块。负责读取邮箱列表并一键领取所有附件。map_module.py: 地图模块。负责进入地图包 (Pack) 并加载相关数据(如怪物信息、路径点等),为其他模块提供前置状态。mission_module.py: 任务模块。负责领取通行证 (Battle Pass) 奖励、活动任务奖励以及周常任务。total_war_module.py: 20人本模块。负责领取总力战 (Total War) 的累计奖励。
protos.proto: Protobuf 定义文件,描述了游戏通信的数据结构。protos_pb2.py/protos_pb2_grpc.py: 由protoc编译生成的 Python 代码。decrypt_*.py: 一系列独立的解密脚本,用于调试特定类型的请求或响应数据。debug_*.py: 调试脚本,用于测试二进制数据或特定功能。
统一的万能解密工具集,用于调试和解密抓包数据。
⚠️ 注意:backend和de目录下的 Python 依赖可能会产生冲突。建议为这两个目录分别创建独立的虚拟环境,或分开安装依赖。