IPA-Patch/KiouEngineBridge
GitHub: IPA-Patch/KiouEngineBridge
该项目是一个 iOS tweak,通过在 KIOU 将棋应用内暴露 CSA v1.2 TCP 服务器,使局域网内的 CSA 客户端能直接与 KIOU 的实时棋盘对弈。
Stars: 0 | Forks: 0
Kiou Engine Bridge
将 KIOU 变为 CSA 对局服务器。此 tweak
在 TCP :4081 端口上使用标准 CSA 服务器协议进行通信,因此任何 CSA
客户端都可以通过局域网连接,并与 KIOU 的实时棋盘对弈 —— 无需额外的
代理,也无需宿主端的包装器。
Kiou Engine Bridge 是一个由两部分组成的系统中的应用端半部分:tweak
在 KIOU 内部运行,并在 `0.0.0.0:4081` 上暴露一个 CSA TCP 服务器;
局域网上的 CSA 客户端接入后,通过标准的
`LOGIN` / `Game_Summary` / `AGREE` / `START` 握手,然后
通过提交 CSA 格式的走法
(`+7776FU`) 并接收与游戏内端相同的通知,参与到实时的 KIOU 对局中。
当客户端执行其走法时,tweak 会解析它并将其反馈
给 KIOU 自己的 `TryMakeMove` / `OnPlayerMoveAsync` 路径,因此
设备上的对局会像你亲自走棋一样准确推进。
没有代理服务器,没有云端,没有第三方服务 —— 手机上仅有一个约 140 KB 的 dylib,与局域网设备之间仅有一个 TCP socket 连接。有关完整的通信协议约定,请参阅 `docs/csa_protocol.md`。
KEB 在 TCP 链路上暴露了标准的 CSA v1.2 接口:
**KEB → 客户端**
| 数据行 | 备注 |
|---|---|
| `LOGIN:
OK`, `LOGOUT:completed` | 会话控制 |
| `BEGIN Game_Summary ... END Game_Summary` | 完整的对局前导,包含 `KIOU_*` 扩展行 |
| `START:` | 在 `AGREE` 之后 |
| `,T` | 每步走法通知,包含两种先后手 |
| `#RESIGN` / `#SENNICHITE` / `#JISHOGI` / `#CHUDAN` + `#WIN` / `#LOSE` / `#DRAW` | 对局结束 |
**客户端 → KEB**
| 数据行 | 备注 |
|---|---|
| `LOGIN ` | 无条件接受 |
| `LOGOUT` | 终止会话 |
| `AGREE []` / `REJECT []` | 推进 / 拒绝赛前握手 |
| `` | 客户端的走法;注入到 KIOU 中 |
| `%TORYO` | 驱动 `GameOrchestrator.RequestSurrender` |
| `%KACHI` / `%CHUDAN` | 客户端知晓;KIOU 未收到信号 |
完整的映射关系(每个 CSA 字段、KIOU 暴露的内容、我们丢弃的内容)位于 `docs/csa_compatibility.md` 中。网络层面的状态机和示例会话位于 `docs/csa_protocol.md` 中。
## CSA 协议 v1.2 兼容性
KEB 的目标是 [CSA TCP/IP 服务器协议
v1.2.1](http://www2.computer-shogi.org/protocol/tcp_ip_server_121.html)。
下表简要概述了覆盖情况;有关逐字段的详细信息,请参阅
`docs/csa_compatibility.md`。
| 领域 | 状态 | 备注 |
|---|---|---|
| 会话 (`LOGIN` / `LOGOUT` / 保活 `\n`) | ✅ | 无条件接受凭据。 |
| `BEGIN Game_Summary` 协商 | ✅ | 处理了 `AGREE` / `REJECT`;请参阅下文的偏差说明。 |
| `BEGIN Time` 块 | ⚠️ 部分支持 | 写入了 `Total_Time`, `Byoyomi`, `Increment`。省略了 `Delay`, `Least_Time_Per_Move`, `Time_Roundup`(KIOU 未暴露它们)。 |
| 初始局面 `BEGIN Position` | ✅ | 以 CSA 格式呈现完整的 9×9 棋盘 + 持驹,源自 KIOU 的实时 SFEN。 |
| 每回合走法交换带有 `,T` | ✅ | 通知了双方先后手。在没有权威计时器的模式(VsAI / LocalPvP)中省略了 `T`。 |
| `%TORYO`(投降) | ✅ | 调用 `GameOrchestrator.RequestSurrender`。 |
| `%KACHI`(入玉胜) | ⚠️ 部分支持 | KEB 知晓并发送 `#JISHOGI`;KIOU 端未收到信号(尚无公开的声明 API)。 |
| `%CHUDAN`(中止) | ⚠️ 部分支持 | KEB 发送 `#CHUDAN`;未通知 KIOU。 |
| `#WIN` / `#LOSE` / `#DRAW` 结果交付 | ✅ | |
| `#RESIGN` / `#SENNICHITE` 原因标记 | ✅ | |
| `#TIME_UP` / `#ILLEGAL_MOVE` 原因标记 | ⛔ | 发出的是 `#RESIGN` —— KIOU 未暴露结束原因细节。 |
| 让子棋中的 `To_Move` | ⚠️ | 源自 KIOU_Sfen 的轮到走子方;旧版本被硬编码为 `+`。 |
| 多客户端分发 | ⛔ | 一次仅限一个客户端;新连接会抢占前一个会话。 |
**与规范的重大偏差。** KIOU 的 CPU 在对局开始时会立即走棋,早于客户端回复 `AGREE`。因此,KEB 会紧跟 `Game_Summary` 立即发出 `START:` 并跳过 `AGREE_WAIT` 障碍 —— 客户端会在其 `AGREE` 被确认之前收到 `START:`,而 Floodgate 级别的客户端会默认接受此设定。
### KIOU_* 扩展
KEB 在 `Game_Summary` 中插入了带有供应商前缀的行,用于提供 CSA 中没有等价物的数据。严格的 CSA 解析器必须忽略未知的键。
| 键 | 示例值 | 描述 |
|---|---|---|
| `KIOU_Mode` | `VsAI` | 对局模式:`VsAI`, `LocalPvP`, `OnlinePvP`, `RecordReplay`, `Spectate`。 |
| `KIOU_StartPosition` | `Standard` | 初始局面类型(例如 `HandicapLance`, `TsumeShogi`)。 |
| `KIOU_Sfen` | `lnsgk…` | 起始局面的完整 SFEN;用于为非标准开局设置棋盘。 |
| `KIOU_Rank+` / `KIOU_Rank-` | `六段` | 玩家段位(在线对局)。 |
| `KIOU_Rate+` / `KIOU_Rate-` | `1832` | 玩家 Rating;为零时省略。 |
| `KIOU_UserId+` / `KIOU_UserId-` | `550e8400-e29b-41d4-a716-446655440000` | 玩家用户 ID(UUID 格式);为空时省略。 |
| `KIOU_StartedAt` | `2026-06-16T09:30:03Z` | 对局开始时的 ISO 8601 UTC 挂钟时间。 |
## 安装
### 越狱设备 (rootless)
`make package install` 会通过 SSH 传输并安装 `.deb`。
设备上需要安装 `openssh-server`(通过 Sileo/Zebra 安装)。
```
make package
make package install THEOS_DEVICE_IP=
```
dylib 位于 `/var/jb/Library/MobileSubstrate/DynamicLibraries/KiouEngineBridge.dylib`
并在下次启动时由 ElleKit 加载。注销或重新启动 KIOU,然后
将你的 CSA 客户端指向 `tcp://:4081`。
### 未越狱 dylib (TrollStore)
TrollStore 仅在特定的 iOS 版本上受支持。在继续之前请检查
[支持的版本表](https://ios.cfw.guide/installing-trollstore/)。
```
make JAILED=1
# -> packages/jailed/KiouEngineBridge.dylib
```
将其暂存到解密后的 KIOU `.app/Frameworks/` 中,添加一个 `LC_LOAD_DYLIB`,
然后通过 TrollStore 安装。
### 修补版 IPA (Sideload)
适用于无法使用 TrollStore 的设备。使用
[Sideloadly](https://sideloadly.io/) 或 [AltStore](https://altstore.io/) 安装修补过的 IPA。
需要 **已解密** 的 KIOU IPA(例如通过 [palera1n](https://palera.in/) +
Filza 获取,或通过 [TrollDecrypt](https://github.com/donato-fiore/TrollDecrypt))。
App Store 下载的版本带有 FairPlay 加密,无法直接进行修补。
```
make BINPATCH=1
# -> packages/binpatch/KiouEngineBridge.dylib
```
然后构建修补后的 IPA:
```
shared/tools/build_patched_ipa.sh \
--recipe kiouenginebridge \
--framework UnityFramework \
--dylib packages/binpatch/KiouEngineBridge.dylib \
--input Kiou-1.0.1.ipa
# -> Kiou-1.0.1-patched.ipa
```
与运行时的 hook 引擎(Substrate, Dobby, frida-gum)不同,静态
二进制修补永远不会在运行时写入 `__TEXT`,并且能够躲过 iOS 18
代码签名监视器 (CSM) —— binpatch 变种支持 iOS 15.0 – 18.x。
所有三种构建变种均提供了完整的 CSA 协议接口 —— Game_Summary,
每步走法通知,投降 / 和棋处理。有关完整的构建矩阵,请参阅
`docs/plans/kiou_engine_bridge_binpatch.md` § 2。
## 兼容性
| | |
|---|---|
| **KIOU 应用版本** | `1.0.1` (`CFBundleVersion` 11) |
| **KIOU 最低 iOS 版本** | 10.0(应用包中的 `MinimumOSVersion`) |
| **KiouEngineBridge 最低 iOS 版本** | 15.0 |
| **测试环境** | 15.0 – 26, arm64 |
| **分发方式** | 越狱的 `.deb`,TrollStore 注入的未越狱 `.dylib`,修补的 IPA (Sideloadly / AltStore) |
| **引擎通信** | 通过纯 TCP (`:4081`) 的 CSA 服务器协议 v1.2 |
所有的 hook 站点都通过 RVA 固定到了这个确切的 KIOU 构建版本上。在 KIOU 更新后,
RVA 会发生偏移。
## 环境要求
- [Theos](https://theos.dev/) 并安装了标准的 iOS 工具链
(已设置 `$THEOS`)。Kiou Engine Bridge 是纯 Objective-C —— 没有 Orion,
也没有 Swift 运行时。
- iOS 15.0–26, arm64。
- 对于未越狱路径:一份已解密的 KIOU `.ipa` 副本。
### 开发者 hooks
```
make hooks
```
将 `scripts/` 注册为 git hooks 路径,以便在每次提交之前触发 `scripts/pre-commit`。当提交涉及
`recipes/*.py` 或
`shared/tools/` 时,该 hook 会运行 `tools.verify_sites`,将每一行 `_SITES` 与 `assets/dump.cs.index.json` 进行交叉比对。如果 dump 索引
不存在(未提交到 repo 中),该 hook 会退出并返回 0 并打印提醒 ——
这是一个仅限本地的关卡,不是 CI 的要求。
## 日志去向
dylib 会将其自身的诊断日志写入 KIOU 沙盒中:
```
/tmp/kiouenginebridge.log
```
— 在越狱设备上对应于 `/var/mobile/Containers/Data/Application//tmp/kiouenginebridge.log`
。通过 SSH 使用 tail 命令查看它,可以实时观看对局和
CSA 握手的解析过程:
```
ssh root@ 'tail -F /var/mobile/Containers/Data/Application/*/tmp/kiouenginebridge.log'
```
每场对局都会产生交织着走子注入结果的 `[MMODE]` 生命周期日志行、`[CSA]` 连接
事件,以及 `[CSA-ENG]` 引擎状态转换。
## 许可证
在 [MIT 许可证](LICENSE) 下发布 —— 有关
完整文本,请参见 `LICENSE` 文件。标签:CSA协议, CVE监控, IL2CPP, iOS越狱插件, TCP服务端, 人机对弈, 游戏Mod