多くのユーザーは、アプリ内購入(IAP)でアイテムを購入する代わりに、いわゆる「IAPクラッカー」を使用していることがわかりました。 Zynga PokerとPokeristがすでにIAPクラッカーを検出し、偽のIAPを防止していることも知りました。どの電話がIAPクラッカーを使用しているかを検出したいと思います。 Cydiaハッキングツールの場合、アプリケーションパスで見つけることができます。
しかし、iAPクラッカーが特定のアプリケーションに分類されるとは思わない。 「Url Scheme」を呼び出すことで確認できると思いますが、名前はわかりません。方法を知っている人はいますか?
現時点での最善の解決策は、外部サーバーを使用してIAPトランザクションを検証し、デバイス固有のキーを送り返して、そのサーバーでのみ生成可能な有料アイテムをロック解除することです。これは防弾ではありませんが、汎用IAPクラッキングシステムに対するアプリの耐性を高める必要があります。アプリをクラックしたい人は、そのアプリ専用のクラックを開発する必要があります。 (これははるかに複雑で、IAP Crackerを使用するほとんどの人の手の届かないところにあります)
基本的に必要なことは次のとおりです。
(ステップ3で今行う必要がある追加の検証については、以下のEDITの後のテキストを参照)
あなたの場合、あなたのアプリはすでにクラックされており、IAPアイテムを不正に入手した人を非アクティブ化しようとしているので、アプリの新しいバージョンでこの機能をプッシュしてから、最初にrestoreCompletedTransactionsを呼び出します正当なユーザーの購入を再検証/再アクティブ化し、他のすべてのユーザーをブロックするバージョンが実行されました。
ただし、これは[〜#〜] lot [〜#〜]であることを追加する必要があります-スムーズに動作するために数週間のプログラマー時間がかかりましたが、ステップ2と3の大部分を処理するソースコードがすぐに表示されます。その再アクティブ化ステップにはサポートとPRコストもあります-必然的に一部の人々はiTunesアカウントを変更したり、インターネットに接続されていないか、そのようなものがないため、正当に支払われたものへのアクセスを一時的に失うこともあります。
クラックがジェイルブレイクユーザーのみに利用可能であるため(潜在的な顧客の90%が影響を受けない)、それをインストールするほとんどの人があなたのアプリにお金を払う可能性が低いときに、これに時間を投資する価値があるかどうかを検討する必要がありますとにかく;アプリをクラックしている膨大な数のユーザーに怖がらないでください。多くの人は、たとえお金を払わなくても喜んで何かを無料でダウンロードします。正当なユーザーに利益をもたらす改善に時間をかける方がよいでしょう(そして、より多くのユーザーにアプリを購入するように勧めます)。
[〜#〜] edit [〜#〜] 1年後でもこれは(ほぼ)正確ですが、本日発表された新しいクラックに対処するために、本物の領収書を傍受してから再送信するようになりましたサーバー側でもう少し作業が必要です。 (残念ながら、検証サーバーが既にセットアップされている場合は、アプリを更新せずにこれを行うことができます)2つの新しい要件:
1)Appleのサーバーから返される復号化された領収書の製品ID(アプリケーションIDとIAP製品の両方)が、ユーザーが購入している製品と実際に一致することを確認します。
2)以前に使用したトランザクションIDのログを保持することにより、領収書のトランザクションID(または復元領収書の復元トランザクションID)が以前に使用されたことがないことを確認します。
しかし、ジェイルブレイクされていないユーザーがIAPクラッキングを利用できるようになったとしても、私の基本的なポイントは、これが価値以上のトラブルになる可能性があることです-完全に面白くないコードのバッチの実装と維持に費やす時間を削減するために、結局のところ、製品の代金を支払うことに気が進まないため、iPhoneのセキュリティを大幅に侵害することを避けようとする人々から多くの追加販売を得る必要があります。
BinPressで$ 20 component を見つけましたが、これはこの保護を提供すると主張しています。実際、彼らの説明を読んでいたので、IAPクラッカーを検索し、この質問に導かれました!
説明を一読するだけで、少なくともこれらの攻撃に対する安価な障壁として試してみる価値があります。
このコンポーネントは、最も人気のある「iAP Cracker」など、アプリ内購入をバイパスし、プレミアムコンテンツを無料でロック解除するツールから保護します。保護は、サーバーでホストされているホストされたレシート検証サービスを介して管理されます。実績のあるセキュリティとクラッキングツールに対する信頼性の両方を備えており、開発者にとって可能な限り簡単に統合できるように設計されています。
「アプリ内購入の確認」は、サーバーを維持せず、購入の確認を自分で管理することを避けたい人向けです。時間を大幅に節約できます。追加のコード行(以下を参照)。それ以降、サーバーは魔法をかけ、各領収書をAppleサーバーで確認します。購入した回数も提供します。
Appleはここでこの問題を述べました: iOSでのアプリ内購入の領収書検証
本文で説明されているように、完了後にトランザクションを検証します(うまくいけば)。
IAPクラッカーを検出するには、NSFileManager
を使用してインストール済みパッケージを確認するだけです。私は脱獄を検出するためにCydiaで試してみましたが、うまくいきます。
Cydiaはすべてのジェイルブレイクされたデバイスに自動的にインストールされるため、次のように脱獄を確認できます。
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]){
NSLog(@"Jailbreak detected");
}
IAPクラッカーはシステムにインストールされている単なるパッケージであり、確認することもできます。
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/DynamicLibraries/iap.dylib"]){
NSLog(@"IAP Cracker detected");
}
誰かがAppleガイドラインに違反しているかどうか知っていますか?
System( "dpkg -l | grep iapCracker> /var/tmp/logiap.txt");を試してください。次に、NSStringにlogiap.txtの内容を入力し、文字列に何かが含まれているかどうかを確認します。しかし、Appleこれを許可するかどうか;)
今週(2015年5月)にアプリでこれを提出します。だからAppleが承認した場合
+(BOOL)isJailbroken {
#if (TARGET_IPHONE_SIMULATOR)
return NO;
#endif
#ifndef IS_APP_EXTENSION
NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
BOOL doesHaveCydia = [[UIApplication sharedApplication] canOpenURL:url];
if (doesHaveCydia) {
return YES;
}
NSError* error=nil;
NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/System" error:&error];
//NSLog(@"blah %i error %@",(int)[files count], error);
if (error==nil) {
//A non-jailbroken device will have an operation not permitted error.
//Jailbroken device should have a list of files and a nil error.
if (files) {
NSLog(@"jailbreak? %i",(int)[files count]);
}
return YES;
}
return NO;
#else
return NO;
#endif
}
@ Morpheus2002によって書かれたNSFileManager
メソッドは、私にとっては機能せず、Appleのガイドラインに違反している可能性があります。 Cydiaがインストールされているかどうか、したがってデバイスがジェイルブレイクされているかどうかを確認するには、cydia://home
@MarkJohnson推奨のURLスキーム:
if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://home"]]) {
NSLog(@"Jailbreak is not detected");
} else {
NSLog(@"Jailbreak is detected");
}