するあらゆる側面を含んでいます実行時の場合アプリ開発、app storeまたはアドホックです。
-
26-09-2019 - |
質問
があるので、判断プログラムによれば、現在実行中のアプリに築かれた署名のための開発のみかたとができます。ととすることができるかを判断したビルドをアプリまたはアドホックです。
で例が関与するものと考えられるアクセスし、コード署名の情報からありますか?やはり特定のファイルの現在の異な存在しされているのではないだろうか?のバンドル。ですから実行ファイルとは何ですか?
他のヒントありがたくお受けいたします。.
もっとも導入されています。mobileprovisionファイルのASN.1形式です。
解決
チェックする最も簡単な方法は、 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/>
- アドホック配布には UDID (および get-task-allow=false) が含まれています
- App Store のディストリビューションには UDID は含まれません。
もう 1 つ確認できるのは、実行可能ファイルに埋め込まれている資格です (otool -l
それを次のようにリストします LC_CODE_SIGNATURE
)。これを解析するのはさらに面倒です (Mach-O ヘッダーを解析してコマンドをロードする必要があり、現在デフォルトになっている「ユニバーサル」バイナリの場合は、現在ロードされているアーキテクチャまたはすべてのアーキテクチャを確認する必要があります)。
- 開発ビルドには以下が含まれます
<key>get-task-allow</key><true/>
- アドホック ビルドと App Store ビルドには以下が含まれます
<key>get-task-allow</key><false/>
資格によってアドホック ビルドと App Store ビルドが区別されるとは思えません。
これらと署名に使用されている証明書を除けば、開発/アドホック/App Store アプリの間に違いはありません (権利/プロビジョニング プロファイルには他にもいくつかありますが、これ以上に信頼できるものは思いつきません)。
セキュリティに関する考慮事項
どちらも回避するのはそれほど難しくありません。最初の方法では、アプリは単に「スウィズル」するだけです。 -[NSBundle pathForResource:ofType:]
. 。2 番目の方法は、ファイルの読み取りに使用する API によっては少し難しくなります。
他のヒント
openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54
私が見つけたことをデータアクセスに最も簡単な方法です。
EDITます:
security cms -D -i *Mobile_Provision_File*
は実際には簡単です。 opensslコマンドの葉出力のいくつかのごみます。
私は抽出されています。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.ことになるのXML部分アップルのプロパティリスト形式を含むすべての回答の分布(開発者、アドホック-アプリ-デパート)。
#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif
私は、デバッグとリリースモードを区別する方法ですつまり、
しかし、私は使用しない限り、プロビジョニングプロファイル名
をアドホックまたは生産のための見当がつかないアドホック ビルドを検出するための gist を作成します
見る : https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410
次の 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;
}