MaukWM/daywater
GitHub: MaukWM/daywater
daywater 是一个自托管的 GameCube 游戏逆向工程平台,通过整合 Ghidra、Dolphin 模拟器与 LLM 驱动的 AI Agent,简化游戏代码分析与 Gecko 作弊码生成流程。
Stars: 6 | Forks: 0
daywater
GameCube 逆向工程,化繁为简
一个自托管平台,通过连接 Ghidra、Dolphin 和 LLM 来逆向工程 GameCube 游戏,理解其代码库并生成 Gecko 代码。 它运行在单个 Docker 容器中,因此无需手动安装任何工具。将其部署在服务器上,你就可以随时随地进行逆向工程 (RE)! ## 快速开始 (Docker) ``` # 拉取并运行 pre-built image docker run -d --name daywater \ --init --shm-size=2g --cap-add=SYS_PTRACE \ -p 7860:7860 -p 7575:7575 \ -v daywater-sessions:/app/sessions \ -v daywater-cache:/app/cache \ -v daywater-logs:/app/logs \ ghcr.io/maukwm/daywater:latest ``` 或者克隆并从源代码构建: ``` git clone https://github.com/MaukWM/daywater.git cd daywater docker compose up --build -d ``` 打开 `http://localhost:7860`。首次启动时,设置向导将引导你完成以下操作: 1. **API 密钥 + 模型** — 配置你的 LLM 后端(默认:`openai/gpt-5.5`)(注意:目前仅支持 OpenAI,即将支持更多平台) 2. **Ghidra 初始化** — 预热 JVM 并验证分析引擎 设置完成后:上传 ISO,上传 savestate,创建任务,运行 agent。 - **Web UI:** `http://localhost:7860` - **Inspect AI 查看器:** `http://localhost:7575` — 详细的 agent 跟踪记录 **系统要求:** Docker,8 GB+ RAM(推荐 16 GB),`--shm-size=2g`(在 compose 中设置)。 ## 3 种任务类型 Daywater 拥有一个包含三种目标类型的**统一任务系统**: - **查找代码补丁** — 编写 Gecko 作弊码(移除 HUD、noclip 等) - **查找 RAM 地址** — 定位内存地址(生命值、位置、弹药) - **静态研究** — 探索并记录游戏内部结构 每个任务都可以独立配置**功能**(静态 RE、Gecko 注入、RAM poke、输入注入、帧捕获、像素差异比对)、评估方法、预算以及输入变异提示。系统为常见工作流提供了预设。 ### Agent 工具 | 工具 | 功能 | |------|-------------| | `decompile` | 为任意函数生成类 C 伪代码 | | `find_string` | 对二进制字符串字面量进行正则表达式搜索 | | `find_writers` | 使用 GDB watchpoints 查找写入特定地址的内容 | | `read_memory` | 读取实时游戏 RAM | | `make_c2_hook` | 汇编 PowerPC 并注入 C2 Gecko hook | | `apply_gecko_code` | 将 Gecko 代码热重载到运行中的游戏 | | `press_button` / `set_stick` | 完整的控制器输入 — 按钮、D-pad、摇杆 | | `capture_screenshot` | 从 Dolphin 获取当前帧 | | `scan_memory` | 差异内存扫描 — 查找两个时刻之间发生变化的内容 | | `rename_function` | 持久化标注函数 — 名称可在不同任务间保留 | ### 核心功能 - **ISO 概览** — 上传 ISO,提取所有可执行文件,运行 Ghidra 自动分析并实时流式传输进度 - **光盘内容浏览器** — 以树状视图展示完整的 ISO 文件系统,包含文件大小和分析徽章 - **知识库** — 发现、函数重命名、笔记和研究文档在不同任务间持久存在 - **按任务追踪知识** — 删除任务时,其相关的发现/重命名/文档也会被清理 - **控制器映射** — 描述每个 GC 输入的作用,让 agent 了解控制方式 - **Savestate 管理** — 上传多个 savestate,渲染截图,追踪每个 savestate 的发现 - **遮罩画笔** — 为像素差异比对评估绘制 HUD 区域(专门用于禁用 HUD 的任务) ## 架构 ``` src/ api/ # FastAPI backend, SSE events, routes agent/ # Inspect AI task, prompts, tools, scorers, job spec system core/ dolphin/ # Dolphin runner, frame capture, memory tools, Gecko injection ghidra/ # PyGhidra analysis, ISO parsing, binary cache knowledge/ # Findings, research docs, gecko code storage ``` agent 通过 [Inspect AI](https://inspect.ai) 运行。Ghidra 通过 [PyGhidra](https://github.com/NationalSecurityAgency/ghidra/tree/master/Ghidra/Features/PyGhidra) 进程内运行(无子进程)。Dolphin 通过 `dolphin-emu-nogui` 无头模式运行。 ## 本地开发 ### Nix flake ``` nix develop # shell with Dolphin, Ghidra, Python 3.13, uv uv sync ``` ### 手动 安装 Dolphin、Python 3.13+、uv 和 [Ghidra 12.0.4+](https://github.com/NationalSecurityAgency/ghidra/releases/tag/Ghidra_12.0.4_build),然后: ``` uv sync export DAYWATER_GHIDRA_HOME=/path/to/ghidra ``` ### Savestates Savestate 必须使用 **[Dolphin 2603a](https://dolphin-emu.org/download/release/2603a/)**(容器和 nix flake 中的构建版本)创建。据我所知,它们无法在不同的 Dolphin 版本之间通用。 1. 在 Dolphin GUI 中启动游戏 2. 玩到游戏内的某个场景 3. 保存状态 (Shift+F1) 4. 通过 Web UI 上传 在 Wayland 上,使用 gamescope 包装 Dolphin:`gamescope -w 800 -h 600 -- dolphin-emu /path/to/game.iso` ## 开发命令 ``` uv run pre-commit run --all-files uv run pytest ``` ## Docker 注意事项 - 在 compose 中设置 `init: true` 用于清理僵尸进程(Dolphin 子进程) - `cap_add: SYS_PTRACE` 用于内存调试工具 - 必须设置 `shm_size: 2g`(Dolphin MemArena 超过了默认的 64 MB `/dev/shm`) - Ghidra SLEIGH 规范已在镜像中预编译,包括 GameCubeLoader 的 Gekko/Broadway 语言 - 入口脚本会在全新部署时自动修复 bind-mount 权限 ## AI 开发声明 是的,本项目的创建大量使用了 AI。感谢 claude 找出了如何在 Docker 容器中运行 ghidra 和 dolphin 的方法。特别感谢其在所有前端工作中的贡献。 ## 许可证 [AGPL-3.0](LICENSE)标签:Docker, Ghidra, LLM, Unmanaged PE, 云资产清单, 人工智能, 安全防御评估, 游戏修改, 用户模式Hook绕过, 自动化分析, 请求拦截, 跨站脚本, 逆向工具, 逆向工程