如何在运行时确定应用程序是用于开发、应用程序商店还是临时分发?
-
26-09-2019 - |
题
有没有办法以编程方式确定当前运行的应用程序是仅为开发而构建和签名的,还是为分发而构建的?能否确定是为应用程序商店还是临时分发而构建的?
是不是例如可能访问代码签名并从那里获取信息吗?或者某个变体中是否存在其他变体中不存在的某些文件?是捆绑信息的一部分吗?或者可以从可执行文件中派生出来吗?
任何提示表示赞赏。
看来embedded.mobileprovision文件是ASN.1格式的。
解决方案
最简单的方法是检查看看 embedded.mobileprovision
([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]
):
- 这是一个有点痛以分析,因为它是一个签署plist(环7个签名的数据,根据
openssl asn1parse -inform der
),但坏破解的是只要看看<plist
和</plist>
. - 发展包含UDIDs和
<key>get-task-allow</key><true/>
- 特设分发包含UDIDs(并获得任务-允许=false)
- 应用程序存储分发不含UDIDs.
其他的事情你可以检查是应享权利嵌入可执行的(otool -l
列出了它作为 LC_CODE_SIGNATURE
).分析这甚至更加繁琐(你需要来分析马赫-O的标题和载荷的命令,对于具有"普遍性"的二进制文件的现在这是默认,则需要检查目前载的建筑或者所有构架).
- 发展建立包含
<key>get-task-allow</key><true/>
- 特设和应用存储建立包含
<key>get-task-allow</key><false/>
我不认为权利之间的区分临时和应用储存基础之上。
除了这些证书是签名,就没有差别的发展/特别/应用程序的储存应用程序(还有一些其他的东西在权利/配置文件,但没有更可靠的,我能想到的).
安全注意事项
没有这些都是难以规避。对于第一种方法,该应用程序可能只是"调酒" -[NSBundle pathForResource:ofType:]
.第二种方法是一个比较困难的根据是什么API用来阅读该文件。
其他提示
openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54
是最简单的方法访问的数据,我已经发现。
编辑:
security cms -D -i *Mobile_Provision_File*
实际上是更容易。 openssl命令叶子一些垃圾在输出中。
我提取了一个嵌入的.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)的所有答案。
#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif
这就是我区分调试和释放模式的方式,
,但我不知道用于自组织或生产,除非使用提供的配置文件名称
<强>我创建要旨检测特设构建强>结果 参考: https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410
的AdHoc用以下2个条件检测:
1.embedded.mobileprovision
包含字段ProvisionedDevices
(调试和特设生成包含该领域中,推出不)
2.it不调试版本,我们可以使用#ifdef DEBUG
决定它
NS_INLINE BOOL isAdHoc(){
BOOL isAdHoc = NO;
BOOL isDebug;
#ifdef DEBUG
isDebug=YES;
#else
isDebug=NO;
#endif
NSData *data=[NSData dataWithContentsOfURL:[[NSBundle mainBundle]URLForResource:@"embedded" withExtension:@"mobileprovision"]];
NSString *str=[[NSString alloc]initWithData:data encoding:NSISOLatin1StringEncoding];
NSRange rangeOfDevicesUDIDs = [str rangeOfString:@"ProvisionedDevices"];
isAdHoc = rangeOfDevicesUDIDs.location!=NSNotFound && !isDebug;
return isAdHoc;
}