繁体   English   中英

用外部符号替换 MacOS Mach-O 二进制文件中的静态符号

[英]Replace static symbols in MacOS Mach-O binary with external symbols

我有以下场景:

  • 一种专有的 MacOS 游戏,将图形框架MoltenVK静态链接到其主要的 Mach-O x86-64 二进制文件。
  • 链接的 MoltenVK 版本很旧。
  • 我有一个.dylib形式的较新版本的 MoltenVK(以及较新版本的 SPIRV 编译器、libVulkan 等,如果需要,也是 dylib 形式)。
  • 旧版和新版 MoltenVK 是 ABI 兼容的,这意味着从旧版到新版 MoltenVK,导出的符号名称和函数签名应该相同。

以及这次进入 MacOS 联动之旅的根本原因:

  • 该游戏无法在我的 macOS 版本(10.15 Catalina Beta 3)上正常运行。 由于崩溃回溯,我已将问题隔离到 MoltenVK。
  • 我想测试更新 MoltenVK 是否可以解决问题,既可以作为临时解决方法,也可以帮助开发人员隔离问题。

是否可以强制二进制文件使用动态加载的.dylib定义的符号版本而不是二进制文件本身定义的版本? 我想修补我拥有的每个.dylib可用的所有符号,因为如果我只修补一些符号而不修补其他符号,它可能会中断(大概 MoltenVK 仅在框架中每个符号的代码来自相同版本时才有效) MoltenVK)。

注意:我无法重新编译游戏的主要 Mach-O 二进制文件,因为我没有源代码。 如果可能的话,我愿意绕过我本地系统上的安全保护措施来做到这一点; 无论如何,我接受在运行 Beta(非生产)操作系统时做危险事情的风险。

我更希望答案和评论集中在所问问题的技术解决方案上,但如果需要进一步说明理由,我会尝试尽快隔离此问题,以便为游戏开发人员提供尽可能多的时间来修复它macOS 10.15 的最终版本。 如果我保持沉默,问题有可能不会被发现; 然后人们将升级到最终的 macOS 10.15 并注意到游戏无法运行。 这对任何人来说都不好玩,因为那样我们要么留在 Mojave,等待游戏开发者更新他们的游戏,要么可能几周或几个月不玩游戏。

静态链接意味着库被有效地烘焙到最终的可执行二进制文件中。 因此,没有简单的技术方法可以挂钩调用并将它们重定向到其他地方(例如DYLD_INTERPOSEDYLD_INSERT_LIBRARIES允许外部 dylib)。

修补二进制文件需要遍历游戏进行的每个 MoltenVK 调用,并进行相当繁琐的后期处理。 通过后处理,我的意思是:

  1. 使用dlopendlsym串联编写 dyld 调用。 您仍然需要二进制文件中已经使用的dlopendlsym符号(它们是 libSystem aka C std lib 的一部分,但您仍然需要专用的 dyld 操作码才能实际使用它们)。 最终,您需要将程序集操作码放在二进制中的某个位置以使一切正常。 这将是相当困难的
  2. 启动lldb调试器,准备要手动调用的dlsym地址并为每次调用动态修补二进制文件(您可能需要在__TEXT段中拥有写权限才能做到这一点,但这是最简单的部分)。 如果您知道自己在做什么,这可能是最可行的方法 主要的缺点是它是不稳定的,如果你破坏了一些东西,你会从头开始。
  3. 添加LC_LOAD_DYLIB命令被引用的二进制和dyld的操作码LC_DYLD_INFO_ONLY ,这将是超级难

无论如何,你最好的朋友是Hopper反汇编器和MachOView来检查二进制文件。

x86(和/或 x86-64)汇编的基本知识是必须遵循的。 我认为使用原始源代码可能是一种更可行的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM