32

現在実行中のアプリが開発専用にビルドおよび署名されたのか、それとも配布用にビルドされたものなのかをプログラムで判断する方法はありますか? また、アプリ ストア用にビルドされたのか、アドホック配布用にビルドされたのかを判断できますか?

たとえば、コード署名にアクセスしてそこから情報を取得することは可能ですか? または、他のバリアントには存在しない特定のファイルがバリアントの 1 つに存在しますか? バンドル情報の一部ですか? または、実行可能ファイルから派生できますか?

ヒントをいただければ幸いです。


embedded.mobileprovision ファイルは ASN.1 形式のようです。

4

5 に答える 5

30

確認する最も簡単な方法は、embedded.mobileprovision( [[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil])を確認することです。

  • 署名された plist ( によると、PKCS#7 署名データ) であるため、解析するのは少し面倒ですが、悪いハックは、 and をopenssl asn1parse -inform der探すことです。<plist</plist>
  • 開発には UDID が含まれており、<key>get-task-allow</key><true/>
  • アドホック配布には UDID が含まれます (および get-task-allow=false)
  • App Store ディストリビューションには UDID が含まれていません。

他に確認できることは、実行可能ファイルに埋め込まれた資格です (otool -lとしてリストされますLC_CODE_SIGNATURE)。これを解析するのはさらに面倒です (Mach-O ヘッダーと読み込みコマンドを解析する必要があり、現在デフォルトになっている「ユニバーサル」バイナリについては、現在読み込まれているアーキテクチャまたはすべてのアーキテクチャを確認する必要があります)。

  • 開発ビルドには含まれています<key>get-task-allow</key><true/>
  • アドホック ビルドと App Store ビルドには次のものが含まれます<key>get-task-allow</key><false/>

権利が Ad Hoc ビルドと App Store ビルドを区別しているとは思わない。

それらと署名された証明書を除けば、開発/アドホック/App Store アプリの間に違いはありません (資格/プロビジョニング プロファイルには他にもいくつかありますが、私が考えることができるより信頼できるものはありません)。

セキュリティに関する考慮事項

これらのいずれも、回避するのはそれほど困難ではありません。最初の方法では、アプリは単に「スウィズル」することができ-[NSBundle pathForResource:ofType:]ます。2 番目の方法は、ファイルの読み取りに使用する 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 で始まるオクテット文字列です。これは、配布タイプ (開発者、アドホック、App Store) に関するすべての回答を含む、Apple のプロパティ リスト形式の XML 部分です。

于 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

アドホック ビルドを検出するための Gist を作成します

AdHoc は、次の 2 つの条件で検出します。

1.embedded.mobileprovisionフィールドを含むProvisionedDevices(デバッグおよびアドホック ビルドにはこのフィールドが含まれますが、リリースは含まれません)

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 に答える