【问题标题】:parsing embedded.mobileprovision and LC_CODE_SIGNATURE to verify the certificate解析 Embedded.mobileprovision 和 LC_CODE_SIGNATURE 以验证证书
【发布时间】:2021-01-30 18:50:47
【问题描述】:

我的目标是执行类似于 How to get access to iOS Developer Certificate from code 的操作:验证我的库未在重新打包的 IPA 中使用。那里的答案建议解析embedded.mobileprovision 文件以查看有关证书和配置文件的信息。

embedded.mobileprovision文件中,我可以找到一个很长的嵌入plist,我在里面看到的XML有两个相关字段:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>AppIDName</key>
…
  <key>application-identifier</key>
  <string>ABCDEFGHIJ.com.example.ObjCExample</string>
…
  <key>UUID</key>
  <string>00000000-0000-0000-0000-000000000000</string>
…
  <key>Version</key>
  <integer>1</integer>
</dict>
</plist>

(出于显而易见的原因,我将真正的 DEVELOPMENT_TEAM ID 替换为 ABCDEFGHIJ 并将 UUID 替换为零)

DeveloperCertificates 键下还有一个长 &lt;data&gt; 条目的 list 数组,但我不知道如何使用这些数据。例如,我不知道我是否可以始终如一地选择这些证书之一。但我没有在这个文件中看到签名证书 ID,而且我没有可靠的程序来解析 embedded.mobileprovision 文件。

不过,这对于我的目的来说可能已经足够了,但我还有另一种更强大的方法。我可以解析我的二进制文件的mach_header,在Dave DeLong 之后的exampleCédric Luthi 的基础上基于earlier answerLC_CODE_SIGNATURE 的格式似乎比 embedded.mobileprovision 文件的格式更好。

具体来说,EMBEDDED_ENTITLEMENTS blob (magic 0xfade7171) 包含一个简短的纯文本 plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>ABCDEFGHIJ.com.example.ObjCExample</string>
    <key>com.apple.developer.team-identifier</key>
    <string>ABCDEFGHIJ</string>
    <key>get-task-allow</key>
    <true/>
    <key>keychain-access-groups</key>
    <array>
        <string>ABCDEFGHIJ.com.example.ObjCExample</string>
    </array>
</dict>
</plist>

到目前为止一切都很好,但我不确定相同的 XML 将如何查找来自 AppStore 的应用程序。例如,有一个新的EMBEDDED_ENTITLEMENTS_DER blob (0xfade7172),它似乎在同一个 plist 上打洞,但采用二进制格式(是否有示例说明如何解析?)。

另外,我在REQUIREMENTS blob(魔术0xfade0c01)中看到签名证书 ID Apple Development: alexcohn@mycompany.com (KLMNOPQRST),并且通过遵循go package 的流程,我可以通过编程方式在我的可执行文件中找到此 ID。

哪个证书 ID 对我来说更可靠

要求很简单:

  • 此 ID 应在应用退出时更改,即使它没有为 App Store 退出。
  • 此 ID 应存在于调试版本和发布版本中(它们可能是不同的 ID)。
  • 此 ID 应稳定,即当开发人员重新构建应用程序、切换构建机器或将新设备添加到 adHoc 配置文件时,它不应更改。
  • 这个 ID 应该很容易找到(就像签名证书在钥匙串应用中可见一样)。

【问题讨论】:

    标签: ios provisioning-profile code-signing-certificate code-signing-entitlements


    【解决方案1】:

    好的,所以我在 github 上找到了 this repo,现在我可以提取(并验证)签名证书的正确 SHA256 签名,该签名以标准 PKCS7 格式存储在 0xfade0b01 blob 的 LC_CODE_SIGNATURE命令。

    缺点是我为此导入了整个openssl library。难道没有办法在内置SecCertificate 类的帮助下解析这个blob吗?另一个悬而未决的问题,也许嵌入式 openssl lib 比系统框架更能抵御逆向工程和 Frida 风格的注入攻击?

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 2012-06-25
      相关资源
      最近更新 更多