chipx86/retro-tinkertoys
GitHub: chipx86/retro-tinkertoys
基于 Ghidra 的 NES 复古游戏反汇编工具集,提供带注释的汇编导出、PPU 图块可视化和自定义 NES 数据类型,辅助 ROM 逆向分析工作。
Stars: 1 | Forks: 0
# Retro Tinkertoys:复古反汇编工具
这是我最初开发的一组脚本,旨在辅助我的
[Faxanadu for NES 反汇编工作](https://github.com/chipx86/faxanadu)。
此代码库版权归 © 2005 Christian Hammond 所有,并采用
MIT 许可证授权。
如果您使用了这些工具,我很乐意收到您的反馈,如果您公开了基于此制作的内容,希望能附上链接 :)
# 概述
目前,它包含以下用于
[Ghidra](https://github.com/nationalsecurityagency/ghidra) 的 Python 2.7 脚本:
**Ghidra Data 脚本:**
* `data_add_ref_with_offset.py`:为选区中具有指定 bank 和偏移量的每个值添加引用。
* `data_search_replace_reffed_labels.py`:对选区中引用的任何标签名称执行文本搜索/替换。
* `data_update_types.py`:更新数据值的类型而不丢失注释或引用。
**Ghidra NES 脚本:**
* `nes_export.py`:为 NES 6502 代码导出带有注释的汇编文件和带有超链接的 HTML 反汇编文件。
* `nes_visualize_ppu_tile.py`:选择 16 字节的 NES PPU 图块数据并在注释中生成可视化图形。
# Ghidra 支持
## 安装说明
如果您要使用这些工具,您需要同时安装 Ghidra 脚本和自定义数据类型。
安装 Ghidra 脚本:
1. 点击 **Window** -> **Script Manager**。
2. 点击工具栏中的 **Manage Script Directories**(从右数第 3 个)。
3. 点击添加(绿色加号)工具栏按钮。
4. 选择此代码库中的 `ghidra/scripts/` 目录。
5. 在 Script Manager 中,启用 **Script Manager** -> **Retro Tinkertoys** 中的脚本。
安装自定义 Ghidra 数据类型:
1. 在 **Data Type Manager** 下,点击向下箭头并选择 **Open File Archive**。
2. 选择此代码库中的 `ghidra/data_types/Retro Tinkertoys.gdt` 文件。
## 脚本参考
### data_add_ref_with_offset.py
**菜单项:** Tools → Data - Add Reference with Offset
此脚本接收一个由一个或多个数据值组成的选区,这些数据值分别用作指向另一个地址的偏移量。它会提示输入该基地址,将每个偏移量加上基地址并将其转换为引用。
这有助于注释文档并生成有用的反汇编代码。
### data_search_replace_reffed_labels.py
**菜单项:** Tools → Data - Search/Replace Reffed Labels
对选区中任何引用的名称执行文本搜索/替换。
这将选取一个代码范围,询问要搜索的文本以及要替换的文本,然后相应地更新在该选区中找到的任何引用的名称。
该文本可以以区分大小写或不区分大小写的形式进行匹配。
可以执行试运行,显示将要执行的重命名操作,这有助于测试搜索/替换的结果,而无需承担任何被修改的风险。
所有操作都在一个事务中进行,因此很容易撤消。
### data_update_types.py
**菜单项:** Tools → Data - Update Types
这有助于更新数据值的类型而不丢失注释或引用。
通常,在 Ghidra 中更新数据类型时,任何现有的注释或引用都会丢失。此更改会小心地保存此状态,更新数据类型,然后再恢复它们。
### nes_export.py
**菜单项:** Tools → NES - Export Disassembly
此脚本接收 NES ROM 反汇编后的 bank,并将其转换为以下目录中的文件:
* `asm/`:兼容
[ca65](https://cc65.github.io/doc/ca65.html) 的汇编源文件。
* `html/`:可浏览的、带有注释和超链接的、经过美化的 HTML 源码反汇编文件,可用于查看包含所有注释和引用的 NES 源代码。
* `mesen/`:一个 Mesen 标签文件,可直接导入到
[Mesen](https://www.mesen.ca/) 模拟器中。
此功能旨在与提供的自定义 Ghidra 数据类型
(`ghidra/data_types/Retro Tinkertoys.gdt`)配合使用。
### nes_visualize_ppu_tile.py
**菜单项:** Tools → NES - Visualize PPU Tiles
此脚本接收包含一个或多个 PPU 图块(每个 16 字节)数组的选择区域,将它们转换为 ASCII 可视化图形。这些图形将作为注释插入到图块数据上方。
这有助于记录 ROM 中的图块。
## 数据类型参考
捆绑的数据类型(`ghidra/data_types/Retro Tinkertoys.gdt`)可在反汇编游戏时使用,以帮助构建不同平台的数据结构并定义对数据的相对引用。
导出器使用这些相对引用来正确生成汇编文件,这些文件可以利用相对引用而不是绝对引用,从而帮助使代码变得可重定位。
以下为可用类型:
### NES 数据类型
#### NESPPUTile8
定义 8 字节的 PPU 图块数据。
#### NESPPUTile16
定义 16 字节的 PPU 图块数据。
这可以与 `nes_visualize_ppu_tile.py` 脚本配合使用以创建可视化图形。
### References 数据类型
#### bank_offset_16
定义相对于 bank 起始位置的 16 位地址。
#### pointer_l
定义指针地址的低字节。
这对于一组映射表非常有用,其中一个表跟踪地址的高字节,另一个表跟踪低字节。
#### pointer_u
定义指针地址的高字节。
这对于一组映射表非常有用,其中一个表跟踪地址的高字节,另一个表跟踪低字节。
#### pointer-1
定义紧邻指针引用地址之前的地址。
也就是说,如果数据值为 `0x8011`,并且该地址处有一个标签,则生成的文件将引用 `LABEL-1`,即有效的 `0x8010`。
#### pointer_l-1
定义紧邻指针引用地址之前的地址的低字节。
#### pointer_u-1
定义紧邻指针引用地址之前的地址的高字节。
标签:6502处理器, CTF工具, Ghidra插件, HTML导出, NES, PPU可视化, Python, ROM Hacking, Wayback Machine, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码注解, 反汇编, 复古游戏, 多模态安全, 快速连接, 数据类型管理, 无后门, 汇编语言, 游戏ROM分析, 游戏安全, 漏洞搜索, 红白机, 脚本工具集, 芯片级分析, 逆向工程, 静态分析