我有一个在 32 位 EXE 和几个 DLL 上运行的旧游戏。我想将其转换为64位,以便分配更多的内存空间。是否可以在没有源代码的情况下将其转换为64位?这需要多少工作?
如果游戏可执行文件未加密,则可以将其反编译为汇编代码。有些工具如 IDA 甚至有反编译成 C 的插件。
但是,即使你成功做到了这一点,如果没有大量的手动修复,所述代码也无法编译(机器反编译仍然远非完美)。
下一个障碍是庞大的规模——对于典型的 AAA 游戏来说,五十万到一千万行之间是合理的估计。对于较旧的游戏,如果你最终的代码少于一万行,那你就很幸运了。
此外,您仍然需要更改代码中的所有指针算术和所有游戏数据结构以使用 64 位值,这意味着还要编辑直接反序列化到内存结构中的所有资源文件。
做不到吗?如果您具备逆向工程所需的知识并且有大量空闲时间,则可能不会。
这将是一项艰巨的任务,并且无法保证它能够正常工作。
除了使用常用工具将二进制文件反编译为 C 或 C++ 之外,看来您真正需要的是 代码提升。 McSema、anvill/remill 等工具可以帮助将机器代码转换为 LLVM-IR。 这是一个带有视觉效果的示例。
从技术上讲,如果做得好并且没有问题,您可以将其反馈给 LLVM 来为所需目标发出代码。然而,将其链接到二进制文件可能仍然是一项复杂的任务。
现在,这听起来比最终可能更容易,因为在过去 - 没有二元性或 32 位和 64 位 - 很多软件在编写时都没有考虑到只有在尝试移植代码时才会变得明显的问题。这些问题可能存在于您手头的任何旧 32 位代码中,并且可能需要您手动调整。
PS:其他需要查找的术语是重新编译和静态重新编译。 PPS:这个问题和后续问题可能更适合RE.SE