如何在运行时确定应用程序是用于开发,应用程序商店还是临时分发?

Cod*_*odo 30 iphone asn.1 distribution signature

有没有办法以编程方式确定当前正在运行的应用程序是否仅为开发而构建和签名,或者是否为分发而构建?并且可以确定是否为应用商店或临时分发构建?

例如,是否可能访问代码签名并从那里获取信息?或者某些变体中是否存在某些不存在于其他变体中的文件?是捆绑信息的一部分吗?或者它可以从可执行文件派生?

任何提示都表示赞赏.


似乎embedded.mobileprovision文件是ASN.1格式.

tc.*_*tc. 29

最简单的检查方法是查看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/>
  • Ad Hoc分发包含UDID(和get-task-allow = false)
  • App Store分发不包含UDID.

您可以检查的另一件事是嵌入在可执行文件中的权利(otool -l将其列为LC_CODE_SIGNATURE).解析这个更加繁琐(您需要解析Mach-O头和加载命令,对于现在是默认的"通用"二进制文件,您需要检查当前加载的体系结构或所有体系结构).

  • 开发构建包含 <key>get-task-allow</key><true/>
  • Ad Hoc和App Store构建包含 <key>get-task-allow</key><false/>

我不认为权利区分Ad Hoc和App Store构建.

除了那些和它签署的证书之外,开发/ Ad Hoc/App Store应用程序之间没有区别(权利/配置文件中还有一些其他的东西,但我认为没有更可靠的东西).

安全考虑

这些都不难以规避.对于第一种方法,应用程序可能只是"混蛋" -[NSBundle pathForResource:ofType:].第二种方法有点困难,具体取决于您用于读取文件的API.

  • 谢谢你!我把它包装在一个类别中,希望能在某个地方节省一些工作:https://github.com/blindsightcorp/BSMobileProvision (2认同)

Bri*_*ing 12

openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54 是访问我发现的数据的最简单方法.

编辑:

security cms -D -i *Mobile_Provision_File*实际上更容易.openssl命令在输出中留下一些垃圾.