如何在运行时确定应用程序是用于开发、应用程序商店还是临时分发?
有没有办法以编程方式确定当前运行的应用程序是仅为开发而构建和签名的,还是为分发而构建的?能否确定是为应用程序商店还是临时分发而构建的?
例如,是否可以访问代码签名并从那里获取信息?或者某个变体中是否存在其他变体中不存在的某些文件?是捆绑信息的一部分吗?或者可以从可执行文件中派生出来吗?
任何提示表示赞赏。
看来embedded.mobileprovision文件是ASN.1格式的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(5)
#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif
这就是我区分调试和发布模式的方式,
但我不知道临时模式或生产模式,除非使用配置文件名称
我提取了一个嵌入的.mobileprovision 文件并粘贴到在线 ASN.1 查看器中(例如 http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html),这就是所得到的:
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.7.2 (signedData)
[0] {
SEQUENCE {
INTEGER 1
SET {
SEQUENCE {
OBJECTIDENTIFIER 1.3.14.3.2.26
NULL
}
}
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.7.1 (data)
[0] {
OCTETSTRING 3c3f786d6c20766 ... 6c6973743e0a
}
}
[0] {
SEQUENCE {
SEQUENCE {
[0] {
INTEGER 2
}
... [much more]
有了这个和一些 ASN.1 知识,你的解释就很完美感觉。
有趣的部分是从 3c3f786d6c 开始的八位字节字符串。这是 Apple 属性列表格式中的 XML 部分,其中包含有关分发类型(开发人员、临时、App Store)的所有答案。
最简单的检查方法是查看 embedded.mobileprovision
([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]
):
- 有点解析起来很痛苦,因为它是一个签名的 plist(PKCS#7 签名数据,根据
openssl asn1parse -inform der
),但一个糟糕的黑客是只寻找< code=""> 和
。
- 开发包含 UDID 和
get-task-allow - Ad Hoc 发行版包含 UDID(且 get-task-allow=false)
- App Store 发行版不包含UDID。
您可以检查的另一件事是可执行文件中嵌入的权利(otool -l
将其列为 LC_CODE_SIGNATURE
)。解析这个更加繁琐(您需要解析 Mach-O 标头和加载命令,对于现在默认的“通用”二进制文件,您需要检查当前加载的体系结构或所有体系结构)。
- 开发版本包含
get-task-allow - Ad Hoc 和 App Store 版本包含
get-task-allow
我认为 Ad Hoc 版本和 App Store 版本之间的权利没有区别。
除了这些和它签署的证书之外,开发/临时/应用程序商店应用程序之间没有区别(权利/配置文件中还有一些其他内容,但我能想到的没有更可靠的东西)。
安全考虑
这些都不是很难规避的。对于第一种方法,应用程序只需“调配”-[NSBundle pathForResource:ofType:]
。第二种方法有点困难,具体取决于您使用什么 API 来读取文件。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我创建了一个要点来检测临时构建
请参阅: https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410
AdHoc 检测具有以下 2 个条件:
1.
embedded.mobileprovision
包含字段ProvisionedDevices
(Debug 和 Ad Hoc Build 包含此字段,Release 不包含)2.它不是 DEBUG Build ,我们可以使用
#ifdef DEBUG
来决定它I create a gist to detect Ad Hoc build
See : https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410
AdHoc detect with following 2 conditions :
1.
embedded.mobileprovision
contains fieldProvisionedDevices
(Debug and Ad Hoc Build contains this field ,Release not)2.it is not DEBUG Build , we can use
#ifdef DEBUG
to decide it