【问题标题】:Why does the solution to dyld_decache segfault work?为什么dyld_decache segfault的解决方案有效?
【发布时间】:2013-09-27 01:44:40
【问题描述】:

背景:https://github.com/kennytm/Miscellaneous/issues/1

特别看一下planetbeing的评论。但他们仍然让我感到困惑:

  1. “当在启用了 ASLR 的 iOS 上运行的进程读取时,/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv7 似乎由于应用了 ASLR 而发生了更改,尽管文件系统上实际上并未更改”。根据我的测试,/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armvXX 的 md5 有时会发生变化,因此文件系统上的文件似乎正在更改。我是不是误会了什么?
  2. 如果此文件在文件系统上未更改,并且没有 PIC 的程序(例如 https://gist.github.com/theiostream/4366719)将其复制到另一个位置,则两个文件在文件系统上应该相同。当我将它们 scp 到我的 MAC 时,为什么不能解缓存原始文件而新复制的文件?

【问题讨论】:

  • 你怎么知道磁盘上的文件正在改变?您是否经常在终端上运行md5 /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv7 命令?而且,看起来复制缓存然后将其传输到您的 Mac 是推荐的策略之一……这有问题吗?或者您只是想了解为什么这是必要的?
  • @Nate 起初我注意到使用 iFile 更改了 md5,但我编写了一个简单的命令行工具来计算指定文件的 md5。输出为link。注意最后 3 行,md5 发生了变化,但我不知道为什么。复制缓存并将其复制到我的 MAC 时出现问题,请参阅我的第二个问题 :) 谢谢!

标签: ios caching segmentation-fault jailbreak dyld


【解决方案1】:

dyld_shared_cache_armvXX 在文件系统中没有改变。做了简单的测试。将文件复制到我的 PC,在设备本身上使用 iFile 检查 MD5。重启后又做了。 iFile 中的 MD5 确实不同,但我 PC 上文件的 MD5 相同。

我怀疑这是由于 iOS 处理此文件的方式。在应用程序启动时,该文件被映射到应用程序的地址空间,因此 dyld 不需要查找、打开和读取每个库,从而减少了应用程序启动时间。因为当应用程序启动库被放置在它的虚拟内存空间中的随机偏移量时启用了 ASLR(我不认为操作系统正在改变实际物理内存中的某些东西,偏移量被添加到虚拟地址)。这就是为什么在启用 ASLR 时得到不同的 MD5 而在禁用 ASLR 时得到相同的 MD5。

【讨论】:

  • “iFile 中的 MD5 确实不同,但我 PC 上文件的 MD5 相同”,这是否意味着 iOS 文件系统中的缓存 IS 发生了变化?当然,一旦它不在 /System/Library/Caches/com.apple.dyld/ 下,它就不会改变(因为它不是可执行文件?)。
  • 我有点知道你在说什么,但我的问题是,如果 dyld_shared_cache_armvXX 由于 ASLR 而无法从其原始路径中删除,那么谁负责段错误? sshd?但是如果用no-pic程序复制到另一个地方,scp和dyld_decache配合得很好,所以我认为这不是sshd的错。我的猜测是 /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armvXX 在 scping 期间发生了变化,但我不确定。
  • @snakeninny,查看 dyld_shared_cache_armvXX 的最后修改日期 - 文件没有被更改。又做了一个测试。将 dyld_shared_cache_armvXX 复制到 iOS 文件系统中的另一个位置,用 iFile 检查 MD5 并与我 PC 上同一文件的 MD5 进行比较。是一样的。 dyld_shared_cache_armvXX 是一个非常特殊的文件,因为 ASLR 在启动时将其映射到应用程序的地址空间时会更改其内容。该文件只会出现更改,因为更改只发生在内存中,不会影响磁盘上的原始文件。
  • 如果不改,为什么/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armvXX的md5会变?看here。当我 scp 时,sshd 不是从磁盘读取而不是从内存读取吗?
  • 文件默认从内存中读取。当您读取某些内容时,内核会在内存缓存中预取文件的某些部分。您正在从此缓存中读取,而不是从磁盘本身读取。 dyld_shared_cache_armvXX 是一个特殊文件,因为它在启动时被映射到每个应用程序中。然后 ASLR 启动并在内存中偏移它的某些部分。当您自己阅读此文件时,您实际上正在阅读已经映射和更改的文件。内核可能正在重用已经映射到应用程序地址空间的内容。这就是为什么 md5 与文件系统中的实际文件不同的原因。
猜你喜欢
  • 2015-09-12
  • 2017-10-03
  • 1970-01-01
  • 2021-05-06
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多