gauweiler/tt-homebrew
GitHub: gauweiler/tt-homebrew
tt-homebrew 是一个用 C 语言为 TipToi 点读笔编写自定义游戏的工具,使用户能扩展设备功能并进行深度定制。
Stars: 11 | Forks: 2
# tt-homebrew
tt-homebrew 是一个用 C 语言为 TipToi 编写游戏的便捷工具,可完全访问 TipToi 的所有功能。
## 免责声明
tt-homebrew 与 Ravensburger 没有任何关联。使用该工具可能会导致您的笔变砖,请自行承担风险。在我的所有测试中从未发生过,但您可能会调用覆盖闪存的函数,导致无法再次启动。
## 入门指南
安装 `nodejs` 和 `gcc-arm-none-eabi`,或直接使用 `nix-shell`。
然后运行 `npm i` 安装依赖。
通过 `node build.js -h` 获取语法帮助。
使用 `node build.js -i gme/Wimmelbuch.gme -o "/run/media/$(whoami)/tiptoi/Wimmelbuch.gme" -n dump_ram -p -b 0` 可以编译您的第一个示例,该示例会在您尝试启动第一个游戏时,将 TipToi 的内存转储到其存储中。您可以通过将笔连接到电脑并在 "dump" 文件夹中找到该文件。
## 发展路线图
如果您想参与或只是保持更新,请加入 [tt-homebrew Discord](https://discord.gg/bsRAuBnX3j)
- [x] 支持 2N 和 3L
- [x] 麦克风 / CREATE 支持
- [x] 自动注入二进制文件
- [ ] 创建一个主模板,使脚本工作
- [ ] 无需 tttool 创建文件(即将推出,请查看 gmelib)
- [ ] 列出文件和目录
- [x] Uart
- [ ] WiFi 支持
- [ ] 添加无法通过 sys_api 访问的固件偏移量函数
## 知识
- 在 2N 和 3L 上,system_api 似乎是兼容的,但 ``fpAkOidPara`` 不同。
- 主二进制文件处理 gme 内部脚本的执行。如果主二进制表的偏移量为 0,则笔使用固件内部的主二进制文件。
- 在 4E 上从非映射内存读取(0x80 9000 < 崩溃 < 0x82 9000)
| 处理器 | 1 | 2N | 3L 及之后版本 (在 4E 上测试,其他固件不同)
| ------------- | ------------- | ------------- | ------------- |
| 启动 ROM | 待定 | 0x0000 0000 | 0x0000 0000? |
| Bios.bin | 待定 | 0x0800 0000 | 0x0080 0000 |
| Prog.bin | 待定 | 0x0800 9000 | 0x0082 9000 |
| Prog.bin 入口 | 待定 | 0x0800 9100 | 0x0085 ed01 末尾的 1 表示 thumb 模式 / 仅适用于 4E / 在 5E 和 6E 上不同 |
| GME bins | 待定 | 0x0813 2000 | 0x0093 0000 |
| GME 游戏状态 | 待定 | 0x0814 1000 | 0x0094 0000 |
| 分配相关内容 | 待定 | 0x? | 0x0095 0000 |
| 返回游戏 | 待定 | | 0x0082 c3c5? 看起来有误 |
| 返回主界面 | 待定 | | |
| malloc | 待定 | 0x08142000 | |
| malloc 长度 | 待定 | 0x00098000 | |
sysparam 在 0x00805E50
fpAkOidPara 在 0x00950780
filehandle 在 0x00958640
## Ghidra 小指南
想要反编译 gme 文件中的二进制文件?这是我的步骤:
- 使用 `tttool binaries` 获取二进制文件。
- 使用 `tttool export` 查看按下游戏按钮时启动了哪个游戏。
- 对于 2N 使用 `2_Game`,对于 3L (3L, 4E, 5E, 6E) 使用 `6_Game` 加上 yaml 中的数字。
- 将此文件拖放到 Ghidra 中,并选择 `v5t little endian` 作为语言。
- 点击 `Options` 并输入表格中的 `GME bins` 地址作为基地址。
- 打开文件并转到开头,按 `d`。这将反汇编第一条指令。这将是一个跳转到主函数的指令。
- 用 `f` 声明主函数并将其重命名为 `main`。
- 转到 文件 -> 解析 C 源代码 并导入 `lib/api.h`。
- 现在将主函数的第一个参数声明为此结构体。
- 点击 RAM 符号并为游戏状态添加一个内存区域。将该区域设为可读写,二进制文件设为可读可执行。
- 然后运行自动分析。
- 如果一切正确,您现在应该拥有一个包含 API 名称、正确偏移量且没有红色地址的项目。
## 注意
二进制文件在 3L 上只能为 65kb (0xffff),在 2N 上为 61kb (0xf000)。
待办:检查是否可以更大,因为 gme 文件具有 32 位大小。
标签:ARM架构, GCC编译器, GNU通用公共许可证, MITM代理, Node.js, TipToi, UART, 二进制发布, 二进制编译, 云资产清单, 固件, 客户端加密, 嵌入式系统, 开源工具, 教育玩具, 游戏开发, 硬件编程, 自动注入, 自定义软件, 设备开发, 逆向工程, 麦克风