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

异特异的

我有以下情况:

  • 专有的MacOS游戏,将图形框架MoltenVK静态链接到其主要的Mach-O x86-64二进制文件中。
  • 链接的MoltenVK版本很旧。
  • 我有一个MoltenVK的更新版本.dylib(带有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串联来编写行业电话您仍然需要二进制中已经使用的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)组装的基本知识我认为使用原始源代码可能是一种更可行的选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何打印mach-o二进制文件从dylibs导入的所有符号?

静态链接的二进制文件中缺少调试符号

VS 编译的二进制文件中的符号

在Docker容器中内置的Golang二进制文件,仍然是Mach-O可执行格式吗?

如何从__TEXT切入到适用于mach-o二进制文件的新段中?

拆分多体系结构的Mach-o二进制文件

从二进制文件的获取小数点符号二进制补码

使用whereis找到符号链接的二进制文件

符号链接会发生什么?原始二进制文件和符号二进制文件的行为不同

编译器会从产品二进制文件中的依赖静态库中剥离不相关的拱形符号吗?

ELF 二进制文件中具有相同名称的不同符号

使用ifstream从C ++文件中读取二进制无符号短整数

如何获得二进制文件中每个符号的实际大小影响?

如何告诉clang将调试符号放入可执行二进制文件中?

如何从C中的二进制文件读取插入符号?

未从 Yocto 中生成的二进制文件中剥离的调试符号

如何在 NASM 中创建 Mach-O 符号别名?

符号重复Apple Mach-O链接器错误

如何理解Mach-O符号表

Apple Mach-O链接器错误-重复的符号

插入二进制文件后,哈希符号(#)转换为英镑符号(£)

我可以通过查看二进制文件中的符号来识别未使用的 C++ 头文件吗?

如何在armv7l上执行二进制类型的Mach-O?

在二进制文件中搜索和替换

替换二进制文件中的字符串

在python包中包含外部二进制文件

有没有办法使用其他二进制文件中的全局符号而不将其链接

字符串,以无符号长形式将ascii值附加到二进制文件中。C ++

有符号十进制转二进制