有没有办法以编程方式确定当前运行的应用程序是仅为开发而构建和签名的,还是为分发而构建的?可以确定是为应用程序商店还是临时分发而构建的吗?
是不是例如可能访问代码签名并从那里获取信息吗?或者某个变体中是否存在其他变体中不存在的某些文件?是捆绑信息的一部分吗?或者可以从可执行文件中派生出来吗?
任何提示表示赞赏。
<小时/>embedded.mobileprovision 文件似乎是 ASN.1 格式。
最佳答案
最简单的检查方法是查看 embedded.mobileprovision
([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]
):
- 解析起来有点麻烦,因为它是一个签名的 plist(PKCS#7 签名数据,根据
openssl asn1parse -inform der
),但是一个糟糕的黑客就是只寻找<plist
。和</plist>
. - 开发包含 UDID 和
<key>get-task-allow</key><true/>
- 临时分发包含 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 版本之间的权利没有区别。
除了这些和它所签署的证书之外,开发/Ad Hoc/App Store 应用程序之间没有区别(权利/配置文件中还有一些其他内容,但我想不出更可靠的东西)。
安全考虑
这些都不是很难规避的。对于第一种方法,应用程序只需“swizzle”-[NSBundle pathForResource:ofType:]
。第二种方法有点困难,具体取决于您使用什么 API 来读取文件。
关于iphone - 如何在运行时确定应用程序是用于开发、应用程序商店还是临时分发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3426467/