web-dev-qa-db-ja.com

Mac App Storeの領収書検証コード?

新しいMac App Storeの領収書検証のためのチュートリアルや作業用コードを誰かが持っているかどうか疑問に思っていますか?私がこれまでに見つけた唯一の参照については、トピックに関するAppleの優れたドキュメントと、コンパイルされますがインラインコメントが多くない1つのオープンソースプロジェクトです。

登録済み開発者向けのAppleドキュメントのみ:

https://developer.Apple.com/devcenter/mac/documents/validating.html

RoddiのValidateStoreReceipt(有望に見えますが、まばらに文書化されています):

https://github.com/roddi/ValidateStoreReceipt

また、なぜAppleが検証用の作業コードを提供しないのか疑問に思いますか?

他に良い参考資料はありますか?

40
Rei

Mac App Storeのレシート検証のための一般的なソリューションを提供することは困難です。これは主に、これがバイパスするのが難しい非常に機密性の高いコードであるためです(cf. Apple documentation )。

これらのGitHubプロジェクトは、レシート検証で実行する必要がある手順について学ぶための非常に優れた出発点です。

何をしなければならないかを理解したら、以下にいくつかのアドバイスを示します。

  • Objective-Cのクラスまたはメソッドを使用しないでください。 Objective-Cには多くのメタデータが含まれており、その動的な性質により、ランタイムインジェクションにさらされます。
  • C関数呼び出しのみを使用します。 CoreFoundationフレームワークでより多くのコード行が必要な場合でも、Foundationフレームワークで実行できること(NSString、NSArray、NSDictionaryなど)を完全に実行できます。
  • OpenSSL ライブラリと動的にリンクしないでください。ライブラリはMac OS X Lionで廃止されました。 OpenSSL を使用する場合は、静的にリンクして、最新のリリースが確実に得られるようにします。
  • 暗号化にはシステム関数を使用します。 Mac OS Xには、10.5以降、同等の機能が付属しています。たとえば、SHA-1ハッシュを計算するには、 CC_SHA1 関数を使用できます。
  • コードにプレーンテキストで文字列を入れないでください。それらをエンコードするか、暗号化します。そうしないと、コードの場所についてのヒントが得られます。
  • コードでは数値定数を使用しないでください。いくつかの単純な演算(+、-、/、または*)を使用して、実行時にそれらを計算します。繰り返しますが、失敗した場合は、コードの場所についてのヒントを提供します。
  • テストと NSApplicationMain の呼び出しを複雑なループに埋め込むことにより、検証のための単純なテストを回避します。
  • NSApplicationMainを直接呼び出さないでください。関数ポインターを使用して、呼び出しを非表示にします。そうしないと、コードの場所についてのヒントが得られます。
  • アプリケーションのリリースごとに、検証コードを少し変更して、同じにならないようにします。

領収書の検証は必要であり、見かけ上単純ではないことを忘れないでください。これは、アプリケーションに費やす時間を多く消費する可能性があります。

したがって、このアプリケーションを確認することをお勧めします: Receigen (免責事項:私はこのアプリケーションの開発者です)。

30

アプリのレシートを検証していることを確認してください。間違った領収書のすべての暗号化と署名の検証を簡単に行うことができます。

http://Pastebin.com/1eWf9LCg を参照してください。AngryBirdsがこのビットを逃したようで、無料のアプリからの領収書を代用している人々に公開されたままになっています。

Alan Quatermainには、これをgithubで実行するためのコードもあります。 https://github.com/AlanQuatermain/mac-app-store-validation-sample

自動削除を回避するために、そのまま使用しないでください。

6
koregan

テスト後に実際のレシートに対して検証するために、main.mファイルで次のコード行を変更します。

if (!validateReceiptAtPath(@"~/Desktop/receipt"))

#ifdef USE_SAMPLE_RECEIPT   // defined for debug version
    NSString *pathToReceipt = @"~/Desktop/receipt";
#else
    NSString *pathToReceipt = [[[NSBundle mainBundle] bundlePath]
        stringByAppendingPathComponent:@"Contents/_MASReceipt/receipt"];
#endif  
    if (!validateReceiptAtPath(pathToReceipt))
        exit(173); //receipt did not validate

コンパイラ設定では、デバッグ構成の「その他のCフラグ」に-DUSE_SAMPLE_RECEIPTを含める必要があります

礼儀 http://jesusagora.org/groups/futurebasic/0::53562:get:1read.html

6
snibbe

NPReceiptVerification を試すことができます。アプリにレシート確認を追加する最も簡単な方法です。クラスファイルをプロジェクトに追加し、バージョンとバンドル識別子を設定するだけで、他のすべてが自動的に処理されます。

4
indragie

Alan Quartermainのコードを確認しましたが、見た目はよさそうです。考えるべきこと:

ここの最後のパラメータは、コードがあなたの証明書によって署名され、他の誰も署名してはならないことを示すコンパイルされた要件である可能性があります。

開発者が承認のためにアプリをストアに送信すると、署名証明書は次のようになります。

3rd Party Mac Developer Application: me
Apple Worldwide Developer Relations Certification Authority
Apple Root CA

アプリがApp Storeからエンドユーザーに配信された後の署名証明書は次のとおりです。

Apple Mac OS Application Signing
Apple Worldwide Developer Relations Certification Authority
Apple Root CA

また、レシートがない場合はexit(173)のみをお勧めしますが、それ以外はすべて正常です。

3
C0C0AL0C0

ObjCメソッドではなく、コード検証ルーチンをC関数としてを実装することを提案します。

この手法では、バイナリにコンパイルされるメソッド名が少なくなるため、受信確認コードを見つけるのが(少し)難しくなります。

2
SteAp

RVNReceiptValidation を参照できます。実装は簡単です。 RVNReceiptValidation.mファイルとアプリのバージョンでバンドルIDを設定するだけです。 Appleからレシートを取得することを忘れないでください。Finderからアプリを起動する必要があります。このクラスは、InApp Purchaseの実装にも役立ちます。

2
Aravindhan

Apple Docsからサンプルの領収書を作成する場合、 'end'の後に余分な文字を含めないでください。そうしないと、uudecodeが失敗します。

1
pygar

プリラーの答えについて詳しく説明します。 Appleが検証プロセスのコードサンプルを提供した場合、Bad Guyがコンパイル済みアプリを取得し、検証プロセスに対応するコードをスキャンすることは非常に簡単です。BadGuy Appleの標準コードサンプルを使用すると、コンパイルされたコードがどのように見えるかを正確に把握できます。BadGuyがコードのそのセクションを見つけたら、アプリのコンパイル済みコードを変更して、受信確認ステージをスキップし、すべてが役に立たない。

そうは言っても、断固としたクラッカーは、あなたが何をしようとも、あなたが導入したコピー防止策を回避するでしょう。 (たとえば)ゲーム業界は、ソフトウェアを保護するために多くの時間を費やしており、クラックされたバージョンは常に利用できるようです。

1
Pete Hodgson

RVNReceiptValidationは素晴らしく、Appleで非推奨となったopensslではなくCommonCryptoを使用しています。デバッグするには、プロジェクトに有効なレシートを添付する必要があります。これを行うには、別のApp Bundleから有効なレシートを取得し、テスト環境でビルドフェーズを作成して、バンドルに追加します。難読化には次の手法をお勧めします。

KRVNBundleIDおよびkRVNBundleVersionを暗号化し、CFBundleIdentifierおよびCFBundleShortVersionStringと比較するときにそれらを復号化します。

次のようなコードを使用して実行する前に、ランダムな値を持つ関数ポインターの配列を作成し、実行時にRVNReceiptValuationの関数への有効なポインターに変更します。

static void testFunction(void);

typedef void (*functionPtr)(void);

functionPtr obfuscationArray[8] = {
    (functionPtr)0xA243F6A8,
    (functionPtr)0x885308D3,
    (functionPtr)0x13198A2E,
    (functionPtr)0x03707344,
    (functionPtr)0xA4093822,
    (functionPtr)0x299F31D0,
    (functionPtr)0x082EFA98,
    (functionPtr)0xEC4E6C89};

int main(int argc, const char * argv[]) {
    functionPtr myFuncPtr;

    obfuscationArray[3] = &testFunction;
    myFuncPtr = obfuscationArray[3];
    (myFuncPtr)();

    return 0;
}

static void testFunction(void){
    printf("function executed\n");
}
1
Billy Bob

はい、彼らのドキュメントには、「アプリケーションに固有のソリューションを採用することが重要です」と書かれています。

0
priller

NPReceiptValidationを使用しても、署名証明書を含むアプリケーションバンドルのセキュリティを検証する必要があります。これは、開発者向けのWWDR推奨事項に記載されています。

解決策: http://iTunes.Apple.com/us/app/apptight-pro-app-store-code/id427083596?mt=12

NPReceiptValidationの潜在的な問題の1つは、Cocoaオブジェクトのメソッドセレクターが非常に簡単に乗っ取られることです。アプリを拡張する最も一般的な方法です。

アプリ内購入の解析を支援する別のツールを次に示します。

http://iTunes.Apple.com/us/app/pkcs-7viewer/id547539804?mt=12

0
C0C0AL0C0

roddiのValidateStoreReceiptは以前は機能しましたが、機能しなくなりました。私は解決策についてブログ投稿を書きました: http://vinceyuan.blogspot.com/2012/07/validate-mac-app-store-receipt-2012.html

ここにコピー:roddiのコードはまだ機能しています。変更する必要はありません。 (最新バージョンを入手する必要があります)次の手順に従ってください(インターネットが必要です):

  1. Mac App Storeアプリからログアウトします。
  2. プロジェクトの設定からUSE_SAMPLE_RECEIPTフラグを削除します->プリプロセッサマクロ。
  3. プロジェクトをコンパイルする
  4. Finderでこのアプリを見つける
  5. Finderでダブルクリックして実行します。 Xcodeで実行しないでください。
  6. OSは、あなたのApple IDでログインするように要求します。実際のiTunesアカウントでログインしないでください。テストアカウントでログインする必要があります。それを見つけるか、iTunesconnectで作成してくださいウェブサイト。
  7. OSは、「アプリが壊れています。AppStoreでダウンロードしてください」のようなメッセージを表示します。このメッセージは無視してください。このアプリの「パッケージの内容を表示」をFinderで表示すると、_MASReceipt/receiptというファイルがあることがわかります。 OSが開発レシートをインストールしました。古いサンプルの領収書はもう必要ありません。これが、USE_SAMPLE_RECEIPTデバッグフラグを削除する理由です。

できました。今すぐアプリをデバッグできます。

0
Vince Yuan