十年逆向工程重现1998年UO服务器源码
「开发者历经十年,利用LLM技术完成对1998年《网络创世纪》演示版服务器的完整逆向工程,并开源5,000个函数。」
近日,一位独立开发者宣布完成了对1998年《Ultima Online》(网络创世纪)演示版服务器(UoDemo.exe)的完整逆向工程,并将全部成果以开源形式发布在GitHub上。该项目历时十年,最终借助大语言模型(LLM)的进展才得以完成,共反汇编并翻译了约5,000个函数,从MSVC x86二进制代码转换为可移植的C99代码。
《Ultima Online》是1997年由Origin Systems Inc.开发的MMORPG,也是最早取得商业成功的MMORPG之一。1998年10月发布的资料片《Ultima Online: The Second Age》附带了一个独立的演示版,其中不仅包含了客户端,还打包了完整的服务器代码和数据的Windows移植版。演示版服务器代码提取自1998年6月2日的生产环境,仅削减了部分功能并将可玩地图缩小至Ocllo岛,但其余部分与当年实际运行的服务器代码完全一致。
此前,虽然已有多个UO服务器模拟器复用了该演示版的某些部分,但从未有人完成过完整的逆向工程。开发者表示,这项工作的核心难点在于正确还原C++类层次结构。通过分析,他确定了关键类继承关系:CEntity(0x10)→ CResourceEntity(0x1C)→ CItem(0x50)→ CContainer(0x5C)→ CMobile(0x37C)→ CPlayer(0x458),并通过虚函数表(vtable)定位了IsPlayer、IsMobile、IsNPC等关键方法。一旦这些布局被确认,大部分二进制代码的翻译就变得直接了。
在方法论上,开发者使用了radare2进行反汇编,并从UO客户端1.25.37的实验性Linux移植版中推导出符号名称。每个函数都手工翻译为C99,保持与二进制相同的控制流、结构体布局和分支。验证方式是将C构建重新反汇编并与原始二进制逐指令对比,只有完全匹配才标记为完成。对于重复的内联模式,仅在辅助函数能展开为相同代码时才使用。
值得注意的是,开发者在项目说明中特别提到,近期LLM技术的发展是最终完成这项看似无尽任务的关键。LLM在理解反汇编代码、推断变量含义以及生成可读的C代码方面提供了显著帮助,使得原本需要大量人工分析和猜测的工作得以加速。这展示了LLM在逆向工程和遗留代码分析领域的实用价值——不仅限于自然语言处理,也能辅助理解二进制级别的程序逻辑。
从技术角度看,该项目不仅是对一款经典游戏服务器代码的考古,更是一次对1998年C++编译器生成代码的深度剖析。UoDemo.exe使用Microsoft Visual C++ 5.0(Visual Studio 97)编译,针对C++98之前的方言。通过逆向工程,开发者得以观察早期C++编译器如何实现虚函数、异常处理和对象布局,这为研究C++ ABI演进提供了珍贵的第一手资料。
目前,完整的逆向工程代码已托管在GitHub仓库中,包括所有5,000个函数的C99源码、反汇编脚本以及构建说明。开发者表示,虽然结果已接近完美复刻1998年的服务器,但仍在持续修复演示版中发现的原始bug,并在源码中做了标记。对于游戏历史研究者、MMORPG技术爱好者以及逆向工程从业者而言,这份开源成果提供了难得的参考案例。
来源:Heooo AI工具导航