32

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

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

任何提示表示赞赏。


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

4

5 回答 5

30

最简单的检查方法是查看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 构建。

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

安全注意事项

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

于 2010-08-06T19:05:26.727 回答
12

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

编辑:

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

于 2012-03-26T15:20:38.053 回答
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)的所有答案。

于 2010-08-09T17:43:28.960 回答
0
#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif

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

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

于 2014-03-23T16:46:52.593 回答
0

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

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

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

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;
}
于 2016-10-14T11:32:08.397 回答