sp00nznet/macrecomp

GitHub: sp00nznet/macrecomp

macrecomp 是一套经典 68k Macintosh 应用的静态重编译工具包,通过提取资源、反汇编、代码提升和基于 SDL2 的 Toolbox 抽象层,将老 Mac 程序转换为可在现代平台运行的原生 C 代码。

Stars: 1 | Forks: 0

# 🖥️ macrecomp **为您的静态重编译项目提供即插即用的经典 Macintosh 支持。** ``` 68k CODE resources Your recompiled C from a 1980s Mac app (one function per 68k sub) │ │ │ extract · disassemble · lift │ calls Toolbox traps ▼ ▼ ┌──────────────────────────────────────────────────────┐ │ macrecomp │ │ m68k CPU state · A5 world · resource mgr · QuickDraw │ │ Event/Menu/Window/Dialog Mgr · Sound Mgr │ └──────────────────────────────────────────────────────┘ │ ▼ SDL2 window + audio ``` *将 System 6/7 的 Toolbox 切割为可链接的 C 库 —— 这样您就不必对 QuickDraw 进行两次逆向工程。*
## 这是什么? 静态重编译(Static recompilation)会提取旧程序的机器码,并将其转换为如今仍可运行的 原生 C 代码。对于主机游戏而言,最困难的部分是*硬件* (这正是 [snesrecomp](https://github.com/sp00nznet/snesrecomp) 所提供的内容)。对于 **经典 Macintosh** 应用程序而言,最困难的部分是 **Toolbox** —— 每个 Mac 应用程序在处理图形、窗口、菜单、事件和声音时都会调用的约 1000 个 ROM/System 陷阱。 每个 68k Mac 应用程序都通过 QuickDraw 进行绘制,不断轮询 `GetNextEvent`,并通过 Sound Manager 播放声音。那么,为什么还要为每一次重编译重新实现这些功能呢? **macrecomp** 将提取出的 68k Mac 应用程序所需的组件打包在一起 —— 一个小型的 m68k CPU 状态模型、A5 world + segment/jump-table 加载器、resource-fork 管理器,以及一个不断扩展、将 Toolbox 陷阱映射到 **SDL2** 的 HAL —— 作为一个可链接的库,外加帮助您实现目标的工具集。这与 N64Recomp 和 snesrecomp 采用的“将平台切割成库,让每个游戏链接它们”的方法相同,只不过它是针对 Mac 的。 它是 x86/DOS [pcrecomp](../tools) 工具包的同胞项目,主要针对 68k + Toolbox, 而不是 8086 + DOS 中断。 ## 流水线 ``` App (HFS resource fork: CODE 0..N + PICT/snd/ASND/MENU…) │ ① extract tools/extract_resources.py (dc42/HFS → CODE + assets + inventory.json) ▼ CODE segments + asset catalog │ ② disassemble tools/disasm_code.py (capstone M68K) │ ③ classify tools/scan_traps.py (enumerate A-line Toolbox traps ← the scope gate) ▼ function table + trap set │ ④ lift tools/lift68k.py (68k → C against the macrecomp runtime) ▼ C source ──⑤ HAL──▶ QuickDraw→SDL2, traps→runtime ──⑥ build──▶ native app ``` 步骤 ①–③ 成本很低,并且能在您正式投入*之前*告知一款游戏的实际开销:从 ③ 得到的**陷阱集(trap set)**正是您必须实现的确切 Toolbox 表面。 ## 状态 🚧 **v0 —— 工具优先。** 提取工具已完备;运行时 HAL 会随每个游戏逐步扩展。 | 组件 | 功能描述 | 状态 | |-----------|--------------|-------| | `extract_resources.py` | DiskCopy 4.2 / raw HFS → CODE segments, asset catalog, `inventory.json` | ✅ 可用 | | `disasm_code.py` | capstone-M68K 反汇编,附带 traps + A5 jump-table 调用注释 | ✅ 可用 | | `scan_traps.py` | 枚举 A-line (`$Axxx`) Toolbox 陷阱;解析 CODE 0 跳转表 | ✅ 可用(已在 Finder 上验证) | | `traps.json` | 上述两个工具所需的 1177 个陷阱 word↔name 映射(源自《Inside Macintosh》) | ✅ | | `pict2png.py` | 解码 1-bit QuickDraw PICT (v1) 资源 → PNG (BitsRect/PackBitsRect) | ✅ | | `unprotect.py` | 静态解包自解密/受保护的 CODE | ✅ **完全解决**(跳转表 + segment bodies,字节精确) | | `ghidra/EmuDecrypt.java` | 在 Ghidra 的 p-code 模拟器中运行独立的解密例程(破解未知密码的 oracle) | ✅ | | `lift68k.py` | 机械化的 68k → C lifter(基于函数;branches→goto;traps→HAL) | ✅ **98–100% 指令覆盖率** | | 运行时 `m68k.{h,c}`: CPU 状态 + big-endian memory + 忠实还原的 CCR flags + 函数表/dispatch | 执行基础底座 | ✅ | | 运行时 `quickdraw.c` + `platform_sdl.c`: 1-bit framebuffer + pen/rect/line/oval/text/CopyBits → SDL2 window | 视频 HAL | ✅ 核心(已自测) | | 运行时 `toolbox.c`: A-trap dispatch, Resource Mgr (serves the app's resources), QuickDraw incl. **CopyBits + DrawPicture**, Window/Menu/Dialog/File stubs, Memory Mgr heap | OS HAL | 🟢 ~95 traps; 可启动真实游戏 | | 声音 (ASND) · 完整的 Menu/Dialog 交互 | | ⬜ | 首个客户:[**shufflepuck-cafe**](https://github.com/sp00nznet/shufflepuck-cafe) (Broderbund, 1988) — 6 个 CODE segments,约 52 KB 的 68k 代码,黑白 QuickDraw。 ## 在您的项目中使用 macrecomp 将其添加为 submodule(游戏仓库正是通过这种方式引用它的): ``` git submodule add https://github.com/sp00nznet/macrecomp.git ext/macrecomp ``` ``` # 在你的游戏的 CMakeLists.txt 中: add_subdirectory(ext/macrecomp) target_link_libraries(my_recomp PRIVATE macrecomp SDL2::SDL2main) ``` 提取游戏资源以开始挖掘: ``` python ext/macrecomp/tools/extract_resources.py "MyGame.dc42" -o work/ # → work/code/CODE_0.bin … CODE_N.bin, work/inventory.json, work/assets/… ``` ## 仓库结构 ``` macrecomp/ tools/ extract / disasm / scan-traps / lift (the dig kit, Python) runtime/ the linkable C library — m68k state, A5 world, Toolbox HAL → SDL2 include/ public headers (macrecomp/*.h) docs/ ARCHITECTURE.md and trap-mapping notes examples/ minimal harnesses ``` ## 致谢与参考来源 - **[macresources](https://github.com/tashtego/macresources) + [machfs](https://github.com/tashtego/machfs)** 作者 Elliot Nunn —— 纯 Python 编写的 HFS + resource-fork 解析。提取器正是建立在这些项目之上。 - **[capstone](https://www.capstone-engine.org/)** —— M68K 反汇编。 - *Inside Macintosh* (Apple, 1985–) 以及开源的 **[Executor](https://github.com/autc04/executor)** 洁净室 Toolbox —— 为陷阱 HAL 提供参考语义。此处未使用或分发任何 Apple ROM 或代码。 - 方法借鉴自 **[N64Recomp](https://github.com/N64Recomp/N64Recomp)** 和 **[snesrecomp](https://github.com/sp00nznet/snesrecomp)**。 ## 许可证 MIT —— 详见 [LICENSE](LICENSE)。该工具包为原创作品。它**不**包含任何 Apple ROM、System 软件或受版权保护的游戏数据 —— 您需要为正在重编译的任何内容自带副本。
标签:68k架构, Bash脚本, Mac OS System 6/7, SDL2, 云资产清单, 客户端加密, 工具链, 经典游戏/应用移植, 逆向工具, 逆向工程, 静态重编译