有没有办法以编程方式确定当前运行的应用程序是仅为开发而构建和签名的,还是为分发而构建的?能否确定是为应用程序商店还是临时分发而构建的?
例如,是否可以访问代码签名并从那里获取信息?或者某个变体中是否存在其他变体中不存在的某些文件?是捆绑信息的一部分吗?或者可以从可执行文件中派生出来吗?
任何提示表示赞赏。
看来embedded.mobileprovision文件是ASN.1格式的。
Is there a way to determine programmatically if the currently running app was built and signed for development only or whether it was built for distribution? And can one determine if was build for app store or ad hoc distribution?
Is it e.g. possibly to access the code signature and get the information from there? Or are there certain files present in one of variants that don't exist in the other ones? Is part of the bundle info? Or can it be derived from the executable file?
Any hints are appreciated.
It seems that the embedded.mobileprovision file is in ASN.1 format.
发布评论
评论(5)
我创建了一个要点来检测临时构建
请参阅: 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这就是我区分调试和发布模式的方式,
但我不知道临时模式或生产模式,除非使用配置文件名称
that's the way i distinguish the debug and release mode ,
but i have no idea for adhoc or production unless use the provision profile name
我提取了一个嵌入的.mobileprovision 文件并粘贴到在线 ASN.1 查看器中(例如 http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html),这就是所得到的:
有了这个和一些 ASN.1 知识,你的解释就很完美感觉。
有趣的部分是从 3c3f786d6c 开始的八位字节字符串。这是 Apple 属性列表格式中的 XML 部分,其中包含有关分发类型(开发人员、临时、App Store)的所有答案。
I've extracted an embedded.mobileprovision file and pasted into an online ASN.1 viewer (e.g. http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html), and that's what a got:
With this and some ASN.1 knowledge, your explanation makes perfect sense.
The interesting part is the octet string starting 3c3f786d6c. That's the XML part in Apple's property list format that contains all the answers about the distribution type (developer, ad-hoc, App Store).
最简单的检查方法是查看
embedded.mobileprovision
([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]
):openssl asn1parse -inform der
),但一个糟糕的黑客是只寻找。
您可以检查的另一件事是可执行文件中嵌入的权利(
otool -l
将其列为LC_CODE_SIGNATURE
)。解析这个更加繁琐(您需要解析 Mach-O 标头和加载命令,对于现在默认的“通用”二进制文件,您需要检查当前加载的体系结构或所有体系结构)。我认为 Ad Hoc 版本和 App Store 版本之间的权利没有区别。
除了这些和它签署的证书之外,开发/临时/应用程序商店应用程序之间没有区别(权利/配置文件中还有一些其他内容,但我能想到的没有更可靠的东西)。
安全考虑
这些都不是很难规避的。对于第一种方法,应用程序只需“调配”
-[NSBundle pathForResource:ofType:]
。第二种方法有点困难,具体取决于您使用什么 API 来读取文件。The easiest way to check is to look at
embedded.mobileprovision
([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]
):openssl asn1parse -inform der
), but a bad hack is to just look for<plist
and</plist>
.<key>get-task-allow</key><true/>
The other thing you can check is the entitlements embedded in the executable (
otool -l
lists it asLC_CODE_SIGNATURE
). Parsing this is even more tedious (you need to parse the Mach-O header and load commands, and for "universal" binaries which are now the default, you'll need to check the currently-loaded architecture or all architectures).<key>get-task-allow</key><true/>
<key>get-task-allow</key><false/>
I don't think the entitlements distinguish between Ad Hoc and App Store builds.
Apart from those and the certificate it's signed with, there's no difference between Development/Ad Hoc/App Store apps (there are a few other things in the entitlements/provisioning profile, but nothing more reliable that I can think of).
Security considerations
Neither of these are that difficult to circumvent. For the first method, the app could just "swizzle"
-[NSBundle pathForResource:ofType:]
. The second method is a bit more difficult depending on what API you use to read the file.openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54
是访问我找到的数据的最简单方法。编辑:
security cms -D -i *Mobile_Provision_File*
实际上更容易。 openssl 命令在输出中留下一些垃圾。openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54
is the easiest way to access the data that I've found.EDIT:
security cms -D -i *Mobile_Provision_File*
is actually easier. The openssl command leaves some garbage in the output.