c0rner/ghidra_whitestar_loader
GitHub: c0rner/ghidra_whitestar_loader
一个 Ghidra 扩展插件,用于加载 Sega/Stern Whitestar 弹珠机游戏 ROM 并自动构建包含内存映射、I/O 寄存器标签和中断向量的完整分析环境。
Stars: 0 | Forks: 0
# Whitestar Loader — 用于 Sega/Stern Whitestar 的 Ghidra ROM Loader
一个 [Ghidra](https://ghidra-sre.org/) 扩展,用于加载 Sega/Stern Whitestar 游戏 ROM
并构建一个完整、可导航的内存映射——包括 banked ROM overlays、I/O 寄存器
标签和中断向量 stub。
## 概述
Whitestar 弹珠机(从 Baywatch 到 Stern 时代)使用 **Motorola MC6809E** CPU
以 2 MHz 频率运行,具有 64 KB 寻址空间。游戏 ROM 使用 SE128 格式:最多支持
32 × 16 KiB banked pages 以及一个固定的 32 KiB 系统 ROM。ROM 分为三种大小:
128 KiB、256 KiB 和 512 KiB。
ROM 镜像的最后 32 KiB 始终映射到 `0x8000–0xFFFF`。其余页面
通过向 `0x3200` 处的 `WS_BANK_SELECT` 寄存器写入 bank 编号
(位 D0–D4),被 bank-switched 到 `0x4000–0x7FFF` 的 16 KiB 窗口中。
## 内存映射
加载器会创建以下 Ghidra 内存块:
| Block | 地址范围 | 大小 | 权限 | Volatile | 描述 |
|---|---|---|---|---|---|
| `RAM` | `0x0000–0x1DFF` | 7.5 KiB | R/W | No | 电池后备 SRAM |
| `RAM_PROT` | `0x1E00–0x1FFF` | 512 B | R/W | No | 投币门写保护 SRAM |
| `IO` | `0x2000–0x3FFF` | 8 KiB | R/W | **Yes** | I/O 寄存器空间 |
| `ROM_BANK_XX` | `0x4000–0x7FFF` | 每个 16 KiB | R/X | No | Banked ROM overlays(每页一个) |
| `ROM_SYSTEM` | `0x8000–0xFFFF` | 32 KiB | R/X | No | 固定系统 ROM(文件的最后 32 KiB) |
### Block 说明
**`RAM_PROT`** 读取始终成功;只有在运行时设置了投币门内存保护标志时,写入
才会被硬件阻止。Ghidra 将其建模为普通的 R/W 块。
**`IO`** 被标记为 volatile,以便 Ghidra 的反编译器和分析器将所有寄存器
读取视为具有副作用。
**`ROM_SYSTEM`** 是只读/可执行的。对 ROM 区域(`0x4000–0xFFFF`)的写入
会被硬件静默丢弃。
### Banked ROM 页面编号
`WS_BANK_SELECT` 寄存器值直接映射到 ROM 文件中的一个 16 KiB 页面
(`bank_value × 16 KiB`)。Overlay 块被命名为 `ROM_BANK_XX`,其中 `XX` 是
bank-select 的十六进制值。
| ROM 大小 | 总页面数 | Banked overlays |
|---|---|---|
| 128 KiB | 8 | `ROM_BANK_00` – `ROM_BANK_05` (6 页) |
| 256 KiB | 16 | `ROM_BANK_00` – `ROM_BANK_0D` (14 页) |
| 512 KiB | 32 | `ROM_BANK_00` – `ROM_BANK_1D` (30 页) |
## 应用的标签
### I/O 寄存器 (`0x2000–0x3FFF`)
所有有文档记录的硬件寄存器都使用 `ByteDataType` 进行标记:
| 地址 | 名称 | 方向 | 描述 |
|---|---|---|---|
| `0x2000` | `WS_SOL_HIGH_CURRENT_A` | R/W | 大电流螺线管 bank A |
| `0x2001` | `WS_SOL_HIGH_CURRENT_B` | R/W | 大电流螺线管 bank B |
| `0x2002` | `WS_SOL_LOW_CURRENT` | R/W | 小电流螺线管输出 |
| `0x2003` | `WS_FLASH_LAMPS` | R/W | 闪光灯驱动 |
| `0x2006` | `WS_AUX_OUT` | W | 辅助数据锁存(J2 连接器) |
| `0x2007` | `WS_AUX_IN` | R | 辅助数据输入(J3 连接器) |
| `0x2008` | `WS_LAMP_COL_STROBE` | R/W | 灯矩阵列选通,低字节 |
| `0x2009` | `WS_LAMP_COL_HIGH` | R/W | 灯矩阵列选通,高字节 |
| `0x200A` | `WS_LAMP_ROW` | R/W | 灯矩阵行驱动数据 |
| `0x200B` | `WS_GI_AUX` | W | GI 继电器控制和辅助选通线 |
| `0x3000` | `WS_DEDICATED_SWITCH` | R | 拨片和维修按钮输入(低电平有效) |
| `0x3100` | `WS_DIP_SWITCH` | R | SW300 DIP 开关 — 国家/地区(低电平有效) |
| `0x3200` | `WS_BANK_SELECT` | W | ROM bank 选择 (D0–D4) + 诊断 LED (D7) |
| `0x3300` | `WS_SW_COL_STROBE` | W | 开关矩阵列选择 |
| `0x3400` | `WS_SW_ROW_INPUT` | R | 开关矩阵行返回 |
| `0x3406` | `WS_GI_LAMP_0` | R/W | GI 灯 bank 0 |
| `0x3407` | `WS_GI_LAMP_1` | R/W | GI 灯 bank 1 |
| `0x3500` | `WS_DMD_IE` | R | 声音/DMD 板数据输入锁存 (PLIN) |
| `0x3600` | `WS_DMD_DATA` | W | DMD 命令数据锁存 |
| `0x3601` | `WS_DMD_RESET` | W | DMD 板复位选通 |
| `0x3700` | `WS_DMD_STATUS` | R | DMD 和声音板状态字 |
| `0x3800` | `WS_SOUND_CMD` | W | 声音板命令端口 |
| `0x3801` | `WS_SOUND_CMD_UNK` | W | 次要声音板写入(空操作) |
### 中断向量 (`0xFFF0–0xFFFE`)
每个 6809 向量槽都被定义为 `Pointer16` 类型并进行了标记
(`VEC_RESET`、`VEC_NMI`、`VEC_SWI`、`VEC_IRQ`、`VEC_FIRQ`、`VEC_SWI2`、`VEC_SWI3`、
`VEC_RESERVED`)。如果向量指向已映射的内存块,加载器会在每个向量的
目标地址创建一个 Ghidra 函数 stub(`_ISR`)。
`VEC_RESET` 的目标也会被注册为程序的**入口点**。
## 加载器选项
| 选项 | 默认值 | 描述 |
|---|---|---|
| **创建 banked ROM overlays** | ✅ 开启 | 为每个 banked page 创建一个 `ROM_BANK_XX` overlay |
禁用 overlays 可以仅对固定系统 ROM 进行快速分析。
## ROM 有效性
加载器接受大小精确为 128 KiB、256 KiB 或 512 KiB 的文件。加载完成后,
Ghidra 消息日志会报告 ROM 的大小和页面布局。
## 环境要求
| 需求 | 版本 |
|---|---|
| [Ghidra](https://ghidra-sre.org/) | **12.0.4** |
| Java | 21 (随 Ghidra 捆绑) |
## 构建
使用 Ghidra 捆绑的 Gradle wrapper。
**1. 编译并打包:**
```
env GHIDRA_INSTALL_DIR=~/ghidra_12.0.4_PUBLIC \
~/ghidra_12.0.4_PUBLIC/support/gradle/gradlew build
# → dist/ghidra_12.0.4_PUBLIC__ghidra_whitestar_loader.zip
```
**2. 在 Ghidra 中安装:**
在 Ghidra 的项目管理器中:*File → Install Extensions* → 从 `dist/` 中选择 zip 文件。
出现提示时重启 Ghidra。
## 用法
1. 打开 Ghidra 并创建或打开一个项目。
2. 将 Whitestar ROM 文件(`.bin`、`.rom` 或任何扩展名)拖到项目窗口中,
或使用 *File → Import File*。
3. Ghidra 将通过文件大小检查自动检测 Whitestar 格式,并建议使用
**Whitestar ROM Loader** 和 `6809:BE:16:default`(Motorola 6809,大端序)。
4. 根据需要调整导入选项,然后点击 **OK**。
5. 在 CodeBrowser 中打开导入的程序,并运行 **Auto Analyze** 以反汇编
系统 ROM。每个 banked overlay(`ROM_BANK_XX`)都可以单独进行分析。
标签:Ghidra插件, JS文件枚举, Motorola 6809, ROM加载器, 云资产清单, 后台面板检测, 域名枚举, 嵌入式系统, 游戏逆向, 逆向工程