Hacker News 中文摘要

RSS订阅

逆向工程SGI O2的PROM -- Reverse Engineering the Prom for the SGI O2

文章摘要

作者通过开发ip32prom-decompiler工具,成功逆向分析了SGI O2工作站的PROM固件,将其反编译为可重新组装的源代码,解决了20年来无法修改固件以升级CPU的问题。该工具能生成易于理解和修改的汇编代码,为硬件升级扫清了障碍。

文章总结

逆向工程SGI O2的PROM固件

背景

SGI O2是一款搭载MIPS CPU的Unix工作站,支持两种CPU家族: - 顺序执行的R5000/RM7000系列(180-350 MHz) - 乱序执行的R10000/R12000系列(150-400 MHz)

2000年代初,Nekochan社区成员曾成功将300 MHz RM5200和350 MHz RM7000A CPU升级至600 MHz RM7000C型号。然而,由于无法修改PROM固件,升级至900 MHz RM7900的计划一直受阻。

问题核心

RM7900采用与早期RM7000兼容的304针BGA封装,但需要特定的IP32 PROM固件支持。随着SGI公司的消亡,获取原始PROM源代码的希望彻底破灭。

解决方案

作者通过逆向工程开发了ip32prom-decompiler工具,能够: 1. 将PROM固件反编译为可重新组装的汇编文件 2. 通过外部注解文件(如labels.json、comments.json)提升代码可读性 3. 支持生成与原固件完全一致的二进制映像

逆向工程过程

  1. 结构解析

    • 发现固件包含5个SHDR(段头)结构
    • 每个段头包含魔数"SHDR"、段长度、名称/版本字符串等信息
    • 识别出sloader、env、post1、firmware、version五个功能段
  2. 代码识别

    • 使用Capstone反汇编器进行指令分析
    • 通过广度优先搜索追踪跳转目标
    • 发现MIPS跳转指令的地址计算特性(高4位取自PC寄存器)
  3. 可视化分析

    • 开发XPM格式可视化工具
    • 不同颜色标记代码、数据、字符串、未识别区域
    • 识别出死代码(编译器优化残留)和虚拟子段(RAM执行代码)
  4. 关键突破

    • 发现firmware段采用自定义ELF变体格式
    • 解析出.text、.rodata、.data三个子段
    • 破解校验和算法(简单的二进制补码求和)

技术细节

  • 地址空间:固件在kseg0(0x81000000)和kseg1(0xbfc00000)区域执行
  • 特殊处理:post1段包含需要复制到RAM(0xa0004000)执行的代码
  • 校验机制:SHDR校验和与段校验和采用相同算法

成果与展望

目前反编译生成的汇编文件已能完美重组原始固件。通过添加函数标签、变量命名和注释,固件的硬件初始化流程已具备可读性。这项工作为SGI O2的CPU升级扫清了关键障碍,未来有望实现RM7900处理器的支持。

完整固件结构

PROM结构图 (红色:代码,蓝色:头/校验和,绿色:ASCII数据,黄色:访问内存,黑色:0x00000000,白色:0xffffffff,灰色:未知区域)

评论总结

总结评论内容:

  1. 关于SGI设备的使用现状
  • 观点:SGI设备缺乏创新的自制软件
  • 引用:"Is there any actual cool homebrew occuring on these platforms?"(这些平台上有真正有趣的自制软件吗?)
  • 引用:"I have never seen any interesting new software or usage of these machines other than the stock 'cool' demo programs"(除了那些自带的"酷炫"演示程序外,我从未见过这些机器上有任何有趣的新软件或用途)
  1. 关于逆向工程工具的建议
  • 观点:推荐使用Ghidra进行反汇编
  • 引用:"try Ghidra's decompiler. It produces very sloppy C code, but still reads faster than assembly most of the time"(试试Ghidra的反编译器。它生成的C代码很粗糙,但大多数时候比汇编代码更容易阅读)
  • 引用:"have you tried Ghidra?"(你试过Ghidra吗?)
  1. 关于IBM大型机微码的逆向工程
  • 观点:期待对IBM大型机微码进行全面逆向工程
  • 引用:"I for one is awaiting for the world to completely decompile and or reverse engineering the IBM mainframe microcodes"(我期待着全世界能完全反编译或逆向工程IBM大型机的微码)
  • 引用:"because Mainframes without the microcode is sent to the junkyard"(因为没有微码的大型机就会被送去垃圾场)
  1. 关于SGI的后续发展
  • 观点:指出SGI的继承者是HPE
  • 引用:"The successor to SGI, after several acquisitions and bankruptcies, is Hewlett Packard Enterprise"(经过多次收购和破产后,SGI的继承者是惠普企业)
  • 引用:"There's a forum for abandoned HP products"(有一个关于被HP放弃产品的论坛)