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

时间:2010-08-06 18:04:01

标签: iphone distribution signature asn.1

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

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

任何提示都表示赞赏。


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

5 个答案:

答案 0 :(得分:29)

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

  • 解析时有点痛苦,因为它是一个签名的plist(PK {7签名数据,根据openssl asn1parse -inform der),但糟糕的黑客只是寻找<plist和{{1 }}。
  • 开发包含UDID和</plist>
  • Ad Hoc发行版包含UDID(和get-task-allow = false)
  • App Store分发不包含UDID。

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

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

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

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

安全注意事项

这些都难以规避。对于第一种方法,应用可能只是“混蛋”<key>get-task-allow</key><false/>。第二种方法有点困难,具体取决于您用来读取文件的API。

答案 1 :(得分:12)

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

编辑:

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

答案 2 :(得分:2)

我已经提取了一个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部分,其中包含有关分发类型(开发人员,ad-hoc,App Store)的所有答案。

答案 3 :(得分:0)

#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif

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

但我不知道adhoc或制作,除非使用提供资料名称

答案 4 :(得分:0)

我创建了一个要点来检测Ad Hoc构建
请参阅:https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410

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

1. embedded.mobileprovision包含字段ProvisionedDevices(Debug和Ad Hoc Build包含此字段,Release not not)

2.it不是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;
}