[英]Replace static symbols in MacOS Mach-O binary with external symbols
我有以下场景:
.dylib
形式的较新版本的 MoltenVK(以及较新版本的 SPIRV 编译器、libVulkan 等,如果需要,也是 dylib 形式)。以及这次进入 MacOS 联动之旅的根本原因:
是否可以强制二进制文件使用动态加载的.dylib
定义的符号版本而不是二进制文件本身定义的版本? 我想修补我拥有的每个.dylib
可用的所有符号,因为如果我只修补一些符号而不修补其他符号,它可能会中断(大概 MoltenVK 仅在框架中每个符号的代码来自相同版本时才有效) MoltenVK)。
注意:我无法重新编译游戏的主要 Mach-O 二进制文件,因为我没有源代码。 如果可能的话,我愿意绕过我本地系统上的安全保护措施来做到这一点; 无论如何,我接受在运行 Beta(非生产)操作系统时做危险事情的风险。
我更希望答案和评论集中在所问问题的技术解决方案上,但如果需要进一步说明理由,我会尝试尽快隔离此问题,以便为游戏开发人员提供尽可能多的时间来修复它macOS 10.15 的最终版本。 如果我保持沉默,问题有可能不会被发现; 然后人们将升级到最终的 macOS 10.15 并注意到游戏无法运行。 这对任何人来说都不好玩,因为那样我们要么留在 Mojave,等待游戏开发者更新他们的游戏,要么可能几周或几个月不玩游戏。
静态链接意味着库被有效地烘焙到最终的可执行二进制文件中。 因此,没有简单的技术方法可以挂钩调用并将它们重定向到其他地方(例如DYLD_INTERPOSE
或DYLD_INSERT_LIBRARIES
允许外部 dylib)。
修补二进制文件需要遍历游戏进行的每个 MoltenVK 调用,并进行相当繁琐的后期处理。 通过后处理,我的意思是:
dlopen
和dlsym
串联编写 dyld 调用。 您仍然需要二进制文件中已经使用的dlopen
和dlsym
符号(它们是 libSystem aka C std lib 的一部分,但您仍然需要专用的 dyld 操作码才能实际使用它们)。 最终,您需要将程序集操作码放在二进制中的某个位置以使一切正常。 这将是相当困难的。lldb
调试器,准备要手动调用的dlsym
地址并为每次调用动态修补二进制文件(您可能需要在__TEXT
段中拥有写权限才能做到这一点,但这是最简单的部分)。 如果您知道自己在做什么,这可能是最可行的方法。 主要的缺点是它是不稳定的,如果你破坏了一些东西,你会从头开始。LC_LOAD_DYLIB
命令被引用的二进制和dyld的操作码LC_DYLD_INFO_ONLY
,这将是超级难无论如何,你最好的朋友是Hopper
反汇编器和MachOView
来检查二进制文件。
x86(和/或 x86-64)汇编的基本知识是必须遵循的。 我认为使用原始源代码可能是一种更可行的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.