agiacalone/cecs-378-lab-malware-pokemon

GitHub: agiacalone/cecs-378-lab-malware-pokemon

加州州立大学长滩分校计算机安全课程的实验项目,通过修改宝可梦黄版ROM来教授二进制分析、逆向工程和漏洞研究的核心技能。

Stars: 0 | Forks: 0

# CECS 378 实验:Gotta Hack 'Em All ## 作业描述 我们正在学习恶意软件分析和逆向工程的课程内容,还有什么比 ROM hacking 更能锻炼这些技能呢? 2026 年是宝可梦(Pokémon)诞生 30 周年。该系列于 1996 年 2 月 27 日在日本首次推出,并从此经久不衰。1998 年,*Pokémon Yellow Version: Special Pikachu Edition* 将这股热潮带到了西方。它也是以紧凑的 Game Boy ROM 形式发行的,其结构已被透彻理解、详尽记录,并且挖掘起来确实很有趣。这使其成为我们练习的理想目标。 你的任务:修改游戏的二进制文件。你需要使用十六进制编辑器破解 ROM,手动(或借助模拟器的帮助)定位数据结构,进行针对性的修改,并生成一个补丁文件。这正是现实世界中进行二进制分析和软件漏洞研究时使用的工作流程。“恶意软件分析师”和“ROM hacker”之间的区别主要只在于意图和软件许可协议。 ![伊布明天早上会感受到这一切...](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/a160a6a544174555.png) ## 背景:为什么这与恶意软件分析相关 ROM hacking 锻炼的核心技能与恶意软件逆向工程相同: | ROM Hacking 任务 | 恶意软件分析类比 | |---|---| | 通过十六进制偏移量定位精灵数据 | 在二进制文件中查找 shellcode 或 payload | | 解码 Game Boy 图块格式 (2bpp) | 解析自定义/混淆的数据编码 | | 在已知偏移量处修补字节 | 二进制修补 / 热修补漏洞 | | 生成 IPS 差异文件 | 编写最小化的概念验证漏洞利用补丁 | | 追踪分块内存 (MBC1) | 理解分段/位置无关代码 | | 通过自定义字符集表查找文本 | 逆向工程协议编码 | 你正在进行真正的二进制分析。只是 ROM 比起实时系统来说,是一个更宽容的目标。 ![伊布大约 30 秒后就会感受到这一切...](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/c264364099174557.png) ## 工具 你需要准备: | 工具 | 用途 | 平台 | |---|---|---| | [BGB](https://bgb.bircd.org/) 或 [Emulicious](https://emulicious.net/) | Game Boy 模拟器,内置调试器、VRAM 查看器和内存编辑器 | Windows/Linux(BGB 通过 Wine 运行良好) | | [Tile Layer Pro](https://www.romhacking.net/utilities/108/) 或 [YY-CHR](https://www.romhacking.net/utilities/119/) | 图块/精灵查看器和编辑器 | Windows/Linux 通过 Wine | | 任意十六进制编辑器 (`xxd`, `hexedit`, `ImHex` 等) | 直接的二进制检查和编辑 | 全平台 | | [flips](https://github.com/Alcaro/Flips) | IPS/BPS 补丁创建 —— CLI 原生,跨平台,推荐使用。Linux 用户:也可在 [Flathub](https://flathub.org/en/apps/com.github.Alcaro.Flips) 上获取 | 全平台 | | [Lunar IPS](https://www.romhacking.net/utilities/240/) | 备选的基于 GUI 的 IPS 补丁工具 | Windows(Linux 上通过 Wine) | ### 使用 `flips` 创建和应用补丁 `flips` 是一个轻量级的 CLI 工具,用于创建和应用 IPS(以及 BPS)补丁文件。基本用法: ``` # 从修改后的 ROM 创建 patch flips --create Pokemon_Yellow_original.gb Pokemon_Yellow_modified.gb patch.ips # 应用 patch 以验证其正确往返 flips --apply patch.ips Pokemon_Yellow_original.gb output.gb ``` 创建补丁后,你可以使用 [ROMhacking.net 的在线 ROM 补丁工具](https://www.romhacking.net/patch/) 进行最后的健全性检查。在浏览器中将你的 `.ips` 应用到原始文件上,确认结果与你修改后的 ROM 相符。这是提交前的一个很好的步骤,但浏览器工具*仅用于验证*;你的主要工作流程应通过 `flips` 进行,以便你了解自己实际生成了什么。 本仓库中包含了一份 ROM 的副本。**请使用这份副本**,因为 IPS 补丁与特定的二进制文件绑定,不同的 dump 版本会导致补丁损坏。在开始之前,请验证你的工作副本未被意外修改: ``` # Linux (如果缺少 crc32:sudo dnf install crc32) md5sum "Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (CGB+SGB Enhanced).gb" sha1sum "Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (CGB+SGB Enhanced).gb" crc32 "Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (CGB+SGB Enhanced).gb" # Mac md5 "Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (CGB+SGB Enhanced).gb" shasum -a 1 "Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (CGB+SGB Enhanced).gb" crc32 "Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (CGB+SGB Enhanced).gb" ``` 预期哈希值: | 算法 | 值 | |---|---| | CRC32 | `7d527d62` | | MD5 | `d9290db87b1f0a23b89f99ee4469e34b` | | SHA1 | `cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1` | 如果你的哈希值不匹配,说明你有不同的 dump 版本。请回退到本仓库包含的 ROM,然后再继续。 ## 必做任务 你必须完成 **任务 1**。任务 2 是可选的额外加分项。 ![准备迎接冒险吧!](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/b6287b6b20174559.png) ### 任务 1:用你选择的宝可梦替换皮卡丘 你的主要任务是用另一种宝可梦替换皮卡丘:由你选择,可以是任何世代。这不仅仅是替换精灵图;皮卡丘的身份信息分布在 ROM 的多个数据结构中,你需要一致地更新所有这些结构。把它想象成一场移植手术:你不仅仅是在改变脸,你是在更改整个病人记录。 [pret/pokeyellow disassembly](https://github.com/pret/pokeyellow) 是你最好的朋友。下面列出的每个表都在该仓库中进行了标记和文档说明。请使用它。 #### 必要的更改 **Sprites** (可见的部分): - 正面和背面战斗精灵(注意:这些是使用 Game Boy 宝可梦游戏特有的基于增量的自定义压缩方案进行压缩的。请参阅 pret 仓库中的解压工具) - 地图行走精灵 - 队伍/状态屏幕图标 **名称和文本**: - 宝可梦名称字符串。游戏使用 **自定义字符编码**(而非 ASCII);查找并解码该表是你这里的第一个子任务。请参阅 [Generation I character encoding reference](https://bulbapedia.bulbagarden.net/wiki/Character_encoding_(Generation_I)) - 图鉴条目文本 - 至少一个你选择的自定义文本字符串(NPC 对话、城镇名称、大木博士的介绍、你对手的默认名称。任何能让游戏感觉属于你,并且能将其与其他人的 ROM 区分开来的内容) **数据表** (机制上重要的部分): - 基础属性:HP、攻击、防御、速度、特殊。这些存储在一个平面表中,*不是*从精灵派生的;你必须手动更新它们 - 属性 - 捕获率和基础经验值收益 - 升级学习表(通过升级学会的招式) - TM/HM 兼容性标志 #### 可选 / 进阶 皮卡丘在黄版中有几个硬编码的特殊行为,没有其他宝可梦拥有:地图跟随机制、情绪/快乐度系统、冲浪小游戏精灵以及独特的叫声处理。你*不需要*处理这些,因为它们是深不见底的兔子洞。但是,如果你想记录完全替换这些行为需要什么,那将是为你报告增色的绝佳补充。 #### 注意事项 - 你可以使用任何世代的宝可梦,但请注意,后期世代的精灵需要转换为 Game Boy 的 2bpp 格式和每图块 2 色的调色板限制。第一代精灵是阻力最小的路径。 - 如果你需要起点,[pokesprite repository](https://github.com/msikma/pokesprite) 包含了每只宝可梦的干净精灵资源。 - 对于精灵解压/重新压缩,在重新发明轮子之前,请先查看 pret 反汇编中捆绑的工具。 - 如果你替换的宝可梦精灵大小差异很大,你可能需要调整 ROM 中的大小元数据。如果是这样,请仔细记录这一点。 ### 任务 2 (可选):通过物品漏洞执行任意代码 Pokémon Yellow 包含电子游戏史上最著名的漏洞之一:**物品下溢 / 8F 漏洞**(以及它的表亲,红/蓝版中的 MissingNo)。通过一系列特定的游戏内操作,玩家可以破坏 RAM 中的物品列表,并使游戏将任意内存作为代码执行。 对于此任务:**记录该漏洞**。你不需要编写新代码。额外加分分为两部分: **A 部分 — 技术文档(10% 额外加分)** 彻底记录漏洞机制。“彻底”意味着以下所有内容: 1. 触发漏洞所需的确切游戏内操作顺序 2. 涉及的具体 RAM 地址。通过地址识别它们,并描述每个地址通常保存什么 3. 游戏*本应*检查但未检查的内容;即缺失的边界检查在哪里,以及正确的边界检查应该是什么样子 4. 随着漏洞执行,内存中发生情况的逐步描述:写入了什么,写在哪里,以及按什么顺序 5. 为什么损坏的内存随后被 CPU 视为可执行代码 **B 部分 — 漏洞分析(5% 额外加分)** 绘制与现实世界软件漏洞类的明确平行关系。命名该类别,解释 Game Boy 漏洞如何在机械原理上映射到它,并引用至少一个具有相同根本原因的现实世界 CVE 或已记录的漏洞利用。你可以选择任何你能辩护的 CVE。如果你不知道从哪里开始,`CVE-2008-4250 (MS08-067)` 是一个值得研究的、记录详尽的示例。模糊的类比(“它有点像缓冲区溢出”)将不会获得学分。分析必须是具体且基于技术的。 ## 有用的参考资料 - [ROMhacking.net Documents](https://www.romhacking.net/documents/) — 从这里开始 - [Bulbapedia — Pokémon Yellow Version](https://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_Yellow_Version) — 全面的游戏参考;有助于理解机制、版本差异以及你正在修改的内容的整体结构 - [Pokémon Yellow Disassembly (pret/pokeyellow)](https://github.com/pret/pokeyellow) — 完全逆向工程的源代码;对于理解你在十六进制编辑器中看到的内容非常宝贵 - [Game Boy CPU Manual](http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf) — Sharp LR35902 指令集 - [Game Boy 2bpp Tile Format](https://www.huderlem.com/demos/gameboy2bpp.html) — 交互式图块格式解释器 - [Pan Docs](https://gbdev.io/pandocs/) — 全面的 Game Boy 硬件参考 - [Pokémon Red/Yellow Text Table](https://bulbapedia.bulbagarden.net/wiki/Character_encoding_(Generation_I)) — 字符编码参考 - [RetroAchievements — Pokémon Yellow](https://retroachievements.org/game/723) — 社区为 Pokémon Yellow 构建的成就集;每个成就都是通过监视特定的 RAM 地址来实现的,这使得这成为了他人已经识别和记录的有趣内存位置的惊人实用地图 ## 提交物 提交一个包含以下内容的 GitHub 仓库: 1. **你修改后的 ROM** (`Pokemon_Yellow_[YourName].gb`) — 必须能在 Game Boy 模拟器中运行,并显示所有必要的更改且功能正常 2. **一个 IPS 补丁文件** (`patch.ips`) — 当应用于本仓库中包含的未修改的 Pokémon Yellow ROM 时,必须产生与你提交的 ROM 逐字节相同的结果。使用 `flips` 或 Lunar IPS 创建。 3. **至少三张截图**,显示: - 你替换后的宝可梦的战斗精灵在战斗中 - 你替换后的宝可梦的地图精灵跟随着你 - 至少一个你的自定义文本字符串在游戏中可见 在每张截图中包含你的桌面 —— 不仅仅是裁剪后的游戏窗口。 4. **一份报告** (`writeup.md`),至少包含: - 你选择了哪只宝可梦作为替代以及原因 - 你更改的每个字节的十六进制偏移量,格式为 `0xOFFSET: 0xOLD -> 0xNEW`,按类别(精灵、名称、数据表)组织 - 对 2bpp 图块格式的解释以及你如何解码/编码你的精灵 - 对第一代字符编码的解释以及你如何定位和修改文本字符串 - 一个记录你更新的每个数据字段(基础属性、属性、学习表等)及其更改前后值的表格 - 对此练习与恶意软件分析有何关系的反思。具体说明哪些技术映射到哪些现实世界的技能。我会知道你是在以此凑字数。 - *(如果尝试了)* 你对物品漏洞 / ACE 漏洞的描述 ### 格式要求 - 报告**必须**使用 [Markdown](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax) 格式 - 截图为 `*.png`、`*.jpg` 或 `*.gif` 格式,作为单独的文件,而不是嵌入在文档中 - 提交的文件不得压缩 - 所有重要的十六进制编辑必须在你的报告中进行注释 ## 学术诚信 1. **不要应用他人的补丁。** 对你的 IPS 文件与原始 ROM 进行 `diff` 比对将立即揭示发生了什么变化以及如何变化的。如果你应用了别人的工作,我会知道。 2. **做你自己的工作。** 是的,pret 反汇编是存在的。是的,许多人以前 hack 过这个游戏。阅读文档是研究;将他人的十六进制编辑作为自己的提交是剽窃。 3. **来向我寻求帮助。** 真诚地。有些事情我不能直接告诉你,但有很多是我能告诉你的。办公时间正是为此而设的。 4. **玩得开心。** 这本该既困难又令人愉快。最优秀的分析师之所以能到达那里,是因为他们充满好奇心。保持好奇。 ![他不生气,只是失望](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/02b9cc6691174602.png) ## 关于本作业 本作业是 CSU Long Beach 的 CECS 378:计算机安全原理导论课程的一部分。这里练习的技能:二进制检查偏移算术、数据结构识别、补丁创建和漏洞文档,可直接迁移到恶意软件分析、漏洞研究和软件安全审计中。 ![世界各地的宝可梦都在等你!](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/221548ade1174606.png)
标签:DAST, Game Boy, ROM Hacking, Shellcode定位, 二进制修补, 二进制分析, 云安全运维, 云资产清单, 内存银行切换, 十六进制编辑, 安全原理, 安全实验, 宝可梦, 快速连接, 恶意软件分析, 教育项目, 数据结构定位, 汇编语言, 游戏修改, 系统运维工具, 编码解码, 网络安全课程, 补丁制作, 逆向工程