kylewlacy/GhidraNes
GitHub: kylewlacy/GhidraNes
GhidraNes 是一个 Ghidra 扩展,专门用于反汇编和分析 NES 游戏 ROM,简化了在 Ghidra 中导入和处理 NES ROM 的复杂流程。
Stars: 81 | Forks: 18
# GhidraNes NES 逆向分析工具
一个支持反汇编和分析NES ROM的Ghidra扩展。

## 功能特性
- 支持导入iNES格式的NES ROM。支持以下映射器:
- 16K/32K固定PRG ROM
- [NROM](https://www.nesdev.org/wiki/NROM) (映射器0)
- [CNROM](https://www.nesdev.org/wiki/CNROM) (映射器3, 185)
- [CPROM](https://www.nesdev.org/wiki/CPROM) (映射器13)
- 杂项映射器 [87](https://www.nesdev.org/wiki/INES_Mapper_087)
- 16K可切换PRG ROM
- [MMC1/SxROM](https://www.nesdev.org/wiki/MMC1) (映射器1)
- [UxROM](https://www.nesdev.org/wiki/UxROM) (映射器2)
- [MMC4/FxROM](https://www.nesdev.org/wiki/MMC4) (映射器10)
- [Bandai FCG板](https://www.nesdev.org/wiki/Bandai_FCG_board) (映射器16, 153, 157, 159)
- [UNROM 512](https://www.nesdev.org/wiki/UNROM_512) (映射器30)
- [Sunsoft 3](https://www.nesdev.org/wiki/INES_Mapper_067)/[Sunsoft 4](https://www.nesdev.org/wiki/INES_Mapper_068) (映射器67, 68)
- [Konami VRC3](https://www.nesdev.org/wiki/VRC3) (映射器73)
- 杂项映射器 [71](https://www.nesdev.org/wiki/INES_Mapper_071), [72](https://www.nesdev.org/wiki/INES_Mapper_072)
- 32K可切换PRG ROM
- [AxROM](https://www.nesdev.org/wiki/AxROM) (映射器7)
- [BNROM/NINA](https://www.nesdev.org/wiki/INES_Mapper_034) (映射器34)
- [GxROM](https://www.nesdev.org/wiki/GxROM) (映射器66)
- [NINA003/006](https://www.nesdev.org/wiki/NINA-003-006) (映射器79, 146)
- 杂项映射器 [11](https://www.nesdev.org/wiki/Color_Dreams), [38](https://www.nesdev.org/wiki/INES_Mapper_038), [140](https://www.nesdev.org/wiki/INES_Mapper_140)
- 8K可切换PRG ROM
- [MMC3/TxROM](https://www.nesdev.org/wiki/MMC3)/[TxSROM](https://www.nesdev.org/wiki/INES_Mapper_118)/[TQROM](https://www.nesdev.org/wiki/INES_Mapper_119) (映射器4, 118, 119)
- [Namco 129/163](https://www.nesdev.org/wiki/INES_Mapper_019) (映射器19)
- [Konami VRC2/4](https://www.nesdev.org/wiki/VRC2_and_VRC4) (映射器21, 22, 23, 25)
- [RAMBO-1](https://www.nesdev.org/wiki/RAMBO-1) (映射器64, 158)
- [Sunsoft FME-7/5A/5B](https://www.nesdev.org/wiki/Sunsoft_FME-7) (映射器69)
- [Konami VRC7](https://www.nesdev.org/wiki/VRC7) (映射器85)
- [DxROM](https://www.nesdev.org/wiki/DxROM) (映射器 [206](https://www.nesdev.org/wiki/INES_Mapper_206))
- [Namco 175/340](https://www.nesdev.org/wiki/INES_Mapper_210) (映射器210)
- 杂项映射器 [18](https://www.nesdev.org/wiki/INES_Mapper_018), [65](https://www.nesdev.org/wiki/INES_Mapper_065), [74](https://www.nesdev.org/wiki/INES_Mapper_074), [76](https://www.nesdev.org/wiki/INES_Mapper_076), [88](https://www.nesdev.org/wiki/INES_Mapper_088), [95](https://www.nesdev.org/wiki/INES_Mapper_095), [154](https://www.nesdev.org/wiki/INES_Mapper_154), [191](https://www.nesdev.org/wiki/INES_Mapper_191), [192](https://www.nesdev.org/wiki/INES_Mapper_192), [194](https://www.nesdev.org/wiki/INES_Mapper_194), [195](https://www.nesdev.org/wiki/INES_Mapper_195)
- 在反汇编中添加标签和内存块,使在反汇编的ROM中跳转更加便捷!
## 安装说明
1. 安装兼容版本的Java和Ghidra (Java 21+)。
2. 下载最新的 [GhidraNes发行版](https://github.com/kylewlacy/GhidraNes/releases)。请确保下载的发行版与您的Ghidra版本匹配!
3. 进入“文件” > “安装扩展...”。点击右上角的“+”并选择GhidraNes的Zip文件。点击“确定”安装扩展。
4. 重启Ghidra。
## 使用方法
1. 在Ghidra中,按照“文件” > “新建项目...”下的向导创建一个新项目。
2. 将一个iNES `.nes` ROM文件拖放到项目中。将格式设置为“NES ROM”并点击“确定”。
3. 双击项目中的ROM以打开Ghidra的CodeBrowser。
4. 出现提示时分析文件(或转到“分析” > “自动分析...”)。保持默认设置并点击“分析”。
5. 完成,游戏将被反汇编!在左侧的“符号树” > “函数”下,打开 `reset` 可跳转到复位向量(执行开始的地方),或打开 `vblank` 可跳转到NMI向量(在VBlank期间执行的地方)。
## 注意事项
### 银行切换
GhidraNes将ROM的每个bank映射到它自己的内存块,但没有实现自动处理银行切换的控制流分析。相反,在反汇编中处理银行切换是一个手动过程。以这个函数为例:

这个反汇编函数正在执行银行切换:写入 `DAT_8000` 在本例中将PRG ROM切换到bank 0。可以在Ghidra中通过以下步骤修复此类情况:
1. 右键点击 `JMP` 指令
2. 点击“引用 > 添加/编辑 (R)”
3. 双击目标操作数
4. 对于“到地址”字段,将左侧下拉菜单从“RAM:”更改为相应的内存bank(本例中为“PRG0::”)
5. 点击“更新”
反汇编现在应该显示跳转到正确的bank:

默认情况下,PRG块大小小于32K的ROM会以 `0x8000` 为基地址创建,最后一个bank除外,该bank将位于该bank的“最高”地址(8K块将在 `0xe000`,16K在 `0xc000`)。如果您预先知道每个bank应位于何处,可以在加载时使用“选项...”对话框设置每个bank的地址。如果您稍后确定猜测错误且不想重新导入ROM,可以使用内存映射窗口重新定位bank:
1. 如果尚未打开,请选择菜单 `窗口`>`内存映射`。
2. 选择包含您要更改的bank的行。
3. 选择内存映射窗口标题栏中的蓝色十字图标(“将块移动到另一个地址”)。
4. 将“新起始地址”更改为正确的基地址。“新结束地址”应根据块大小自动更新。
5. 选择“确定”,bank将被更新。
## 开发
### 使用Eclipse开发
1. 安装Java和Ghidra。
2. 安装Eclipse。
3. 安装GhidraDev Eclipse插件。说明可以在您的Ghidra安装目录下的 `Extensions/Eclipse/GhidraDev/GhidraDev_README.html` 中找到。
4. 在Eclipse中,通过“文件” > “从文件系统打开项目...”打开GhidraNes仓库。点击“目录”,然后选择此仓库(包含此 `README.md` 文件和 `GhidraNes` 子目录的 _顶级_ 文件夹)。最后,点击“完成”。
5. 打开“GhidraDev” > “链接Ghidra...”。添加您的Ghidra安装,点击“下一步 >”,然后选择“GhidraNes”作为Java项目。点击“完成”。
6. 转到“运行” > “以...运行” > “Ghidra”以运行带有GhidraNes扩展的Ghidra。
### 从Eclipse构建发行版
**注意:** 确保GhidraNes Eclipse项目是用应支持的 _最早_ 版本的Java设置的。使用更新版本的Java可能导致兼容性问题!
1. 安装Gradle(使用[SDKMAN](https://sdkman.io/),可以通过 `sdk install gradle` 完成)。
2. 在Eclipse中,打开“GhidraDev” > “导出” > “Ghidra模块扩展...”。选择“GhidraNes”作为项目,点击“下一步 >”,然后选择“本地安装目录:”并浏览到您的Gradle安装目录(使用SDKMAN时,路径为 `~/.sdkman/candidates/gradle/$GRADLE_VERSION`)。点击“完成”。
3. 构建的zip文件将保存在 `GhidraNes/dist/` 目录中。有关安装构建的zip的详细信息,请参见“安装说明”部分。
### 使用其他编辑器开发(如VS Code)
1. 安装Java和Ghidra。
2. 在您的编辑器中配置JDK设置。
- 对于VSCode:请遵循官方的[“VS Code中的Java入门”](https://code.visualstudio.com/docs/java/java-tutorial)指南。
3. 将 `GhidraNes/gradle.properties.example` 文件复制为 `GhidraNes/gradle.properties` 并根据需要配置Ghidra的安装目录。
4. 将GhidraNes仓库作为Java项目导入(包含此 `README.md` 文件和 `GhidraNes` 子目录的 _顶级_ 文件夹)。
### 使用Gradle构建发行版
1. 进入内部的 `GhidraNes` 子目录:`cd GhidraNes/GhidraNes`
2. 运行 `gradle buildExtension`
- 如果尚未设置 `gradle.properties` 文件,可以直接将属性传递给Gradle,例如 `gradle buildExtension -PGHIDRA_INSTALL_DIR=/home/user/ghidra_10.2.2_PUBLIC`
3. 构建的zip文件将保存在 `GhidraNes/dist/` 目录中。有关安装构建的zip的详细信息,请参见“安装说明”部分。
## 发布新版本
1. 将 `CHANGELOG.md` 作为新提交更新
2. 为新版本创建一个标签。标签和发布名称应基于[UTC时区](https://www.utctime.net/)的当前日期命名为 `vYYYYMMDD`(例如 `v20250520`)
3. 推送标签。这将触发[“Release” GitHub Actions工作流](https://github.com/kylewlacy/GhidraNes/actions/workflows/release.yml),几分钟后会创建一个包含发布说明和构建资产的新[草稿发布](https://github.com/kylewlacy/GhidraNes/releases)
4. 仔细检查构建资产是否正常,根据需要调整或添加发布说明,然后发布!
标签:Ghidra, Ghidra 插件, iNES 1.0, iNES 格式, JS文件枚举, Mapper 支持, NES, ROM 加载, ROM 反汇编, Wayback Machine, 二进制分析, 云安全运维, 云资产清单, 代码分析, 任天堂娱乐系统, 凭证管理, 反汇编, 域名枚举, 复古游戏, 嵌入式系统, 支持多种 mapper, 游戏分析, 游戏开发, 游戏机模拟, 软件扩展, 逆向工程