【问题标题】:How to determine at run-time if app is for development, app store or ad hoc distribution?如何在运行时确定应用程序是用于开发、应用程序商店还是临时分发?
【发布时间】:2010-08-06 18:04:01
【问题描述】:

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

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

感谢任何提示。


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

【问题讨论】:

    标签: iphone signature asn.1


    【解决方案1】:

    最简单的检查方法是查看embedded.mobileprovision ([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]):

    • 解析有点麻烦,因为它是一个签名的 plist(PKCS#7 签名数据,根据 openssl asn1parse -inform der),但一个不好的 hack 是只查找 <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 版本。

    除了那些和它签署的证书之外,开发/临时/App Store 应用程序之间没有区别(权利/配置配置文件中还有一些其他内容,但没有比我能想到的更可靠的了)。

    安全注意事项

    这些都不是那么难以规避的。对于第一种方法,应用程序可以“调酒”-[NSBundle pathForResource:ofType:]。第二种方法有点困难,具体取决于您使用什么 API 来读取文件。

    【讨论】:

    • 非常感谢您的有用意见。确定分发类型的原因是我想出售一个可以在开发和测试期间免费使用但需要 App Store 分发许可证的库。我在 Xcode 的 build 目录中找到的 embedded.mobileprovision 文件是嵌入了一些 XML 的二进制文件。将应用安装到设备上后是否相同,还是仅安装 XML 部分?
    • 嗨,Codo,我也遇到了同样的情况……你最后是如何实施检查的?
    • 对于内部分发,您将看到:<key>ProvisionsAllDevices</key> <true/>
    • @SveinungKvalBakken 我假设您的意思是企业内部分发。我也认为它可以被视为 App Store 分发,除非您想为内部分发提供特殊许可条款。
    • 谢谢!我已将其归为一个类别,希望它能为某人节省一些工作:github.com/blindsightcorp/BSMobileProvision
    【解决方案2】:

    openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54 是访问我找到的数据的最简单方法。

    编辑:

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

    【讨论】:

    • 太棒了。这是我一直在寻找的东西。
    【解决方案3】:

    我提取了一个 embedded.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)的所有答案。

    【讨论】:

      【解决方案4】:
      #if (DEBUG)
      #define SERVER @"aaaa.com/dev"
      #else
      #define SERVER @"aaa.com/pro"
      #endif
      

      这就是我区分调试和发布模式的方式,

      但我不知道临时或生产,除非使用配置文件名称

      【讨论】:

        【解决方案5】:

        我创建了一个 gist 来检测 Ad Hoc 构建
        见:https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410

        AdHoc 检测具有以下 2 个条件:

        1.embedded.mobileprovision 包含字段ProvisionedDevices(Debug and Ad Hoc Build 包含此字段,不发布)

        2.不是DEBUG Build,我们可以用#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;
        }
        

        【讨论】:

          猜你喜欢
          • 2014-12-04
          • 1970-01-01
          • 2015-12-12
          • 2012-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-24
          相关资源
          最近更新 更多