是否可以通过编程方式确定当前正在运行的应用程序是仅为开发而构建并签名还是为发行而构建?并且可以确定是为应用商店还是临时发行构建的?

是例如可能访问代码签名并从那里获取信息?还是某些变体中存在某些文件而其他变体中不存在?是 bundle 包信息的一部分吗?还是可以从可执行文件派生它?

任何提示表示赞赏。

似乎Embedded.mobileprovision文件为ASN.1格式。

最佳答案

最简单的检查方法是查看embedded.mobileprovision([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]):

  • 解析它有点麻烦,因为它是一个签名的plist(根据openssl asn1parse -inform der表示为PKCS#7签名的数据),但是一个不好的破解方法是仅查找<plist</plist>
  • 开发包含UDID和<key>get-task-allow</key><true/>
  • Ad Hoc分发包含UDID(和get-task-allow = false)
  • App Store发行版不包含UDID。

  • 您可以检查的另一件事是可执行文件中嵌入的权利(otool -l将其列为LC_CODE_SIGNATURE)。解析它甚至更加乏味(您需要解析Mach-O header 并加载命令,对于现在是默认设置的“通用”二进制文件,您将需要检查当前加载的体系结构或所有体系结构)。
  • 开发版本包含<key>get-task-allow</key><true/>
  • Ad Hoc和App Store版本包含<key>get-task-allow</key><false/>

  • 我认为Ad Hoc和App Store版本之间没有区别。

    除了这些和签名所使用的证书之外,Development / Ad Hoc / App Store应用程序之间没有什么区别(权利/配置文件中还有其他一些内容,但是我想起来没有什么更可靠的了)。

    安全注意事项

    这些都不是很难避免的。对于第一种方法,应用程序可以仅“旋转” -[NSBundle pathForResource:ofType:]。第二种方法要困难一些,具体取决于您使用哪种API读取文件。

    关于iphone - 如何在运行时确定应用程序是用于开发,应用程序商店还是临时发行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3426467/

    10-12 12:28
    查看更多