Android開発者がIAPハッカーからアプリを保護する方法



問題を排除するために楽器を試してください

このガイドは、IAPから収入を得て、ハッカーやハッキングツールを介した不正な購入から身を守りたいAndroidアプリ開発者を対象としています。よく知られているIAPハッキングツールがいくつかありますが、ここではリストしませんが、基本的にこれらのツールは、ユーザーが無料のIAPを楽しめるように、誤った購入レシートをアプリに送信します。これは、毎月のサブスクリプションからゲーム内トークンまで何でもかまいません。





これらのハッキングツールの新しいバージョンは常にリリースされており、最新の更新と方法を常に把握することは非常に重要ですが、アプリのIAPが盗まれるのを防ぐためにできることがいくつかあります。特に、サーバー側のIAP検証のいくつかの方法を有効にする必要があります。これについては以下で詳しく説明します。



このガイドは初心者を対象としていませんが、このガイドのさまざまな用語を理解している経験豊富なアプリ開発者を対象としています。

特にこの目的のためのGitリポジトリプラグインの使用:

PiracyChecker

プロジェクトにリポジトリを追加します build.gradle



リポジトリ{

Maven {

url「https://jitpack.io」

}

}

そして、ライブラリをモジュールに追加します build.gradle

依存関係{

「com.github.javiersantos:PiracyChecker:1.1」をコンパイルします

}

推奨事項

  • 本番リリースでは常にProGuardを有効にしてください。
  • 有効なライセンスをできるだけ早くチェックするために、PiracyCheckerをonCreateメソッドに含める必要があります。
  • ライセンスが無効な場合は、ダイアログではなく新しいアクティビティを表示することをお勧めします。このようにして、アプリのメインアクティビティが終了したことを確認します。見る ' ダイアログまたは新しいアクティビティに結果を表示する '。

Google Playライセンス(LVL)を確認する

Google Playは、GooglePlayで公開するアプリケーションにライセンスポリシーを適用できるライセンスサービスを提供しています。 Google Playライセンスを使用すると、アプリケーションはGoogle Playにクエリを実行して、現在のユーザーのライセンスステータスを取得できます。

Google Playを通じて公開するすべてのアプリケーションは、GooglePlayライセンスサービスを使用できます。特別なアカウントや登録は必要ありません。

新しいPiracyChecker(this)

.enableGooglePlayLicensing(“ BASE_64_LICENSE_KEY”)

..。

。開始();

BASE64ライセンスキーを取得するには、アプリをにアップロードする必要があります GooglePlayデベロッパーコンソール 。次に、アプリにアクセスします->サービスとAPI。

Google Playライセンスを使用する場合は、アクティビティのonDestroy()メソッドで.destroy()を呼び出して、サービスの複数のインスタンスが実行されないようにする必要があります。

アプリの署名証明書(署名)を確認する

開発者は、アプリをユーザーデバイスにインストールする前に、常に秘密鍵/証明書(.keystoreファイルに含まれている)を使用してアプリケーションに署名する必要があります。署名証明書は、アプリの存続期間を通じて一貫性を保つ必要があり、通常、有効期限は25年です。

.apkが何らかの方法で変更されると、アプリの署名が壊れます。通常、署名されていないアプリはインストールできません。たとえば、攻撃者がライセンスチェックコードを削除して、料金を支払わずにアプリの全機能を有効にすることを想像できます。より危険な例は、.apkを変更して、正規のアプリにマルウェアを含め、機密性の高いユーザーデータを収集することです。変更された.apkをインストールするには、攻撃者はそれを辞任する必要があります。

新しいPiracyChecker(this)

.enableSigningCertificate(“ 478yYkKAQF + KST8y4ATKvHkYibo =”)// PRODUCTIONバージョンの元のAPK署名

..。

。開始();

注意してください!! アプリの署名は、PiracyCheckerUtilsメソッドを使用して取得できます。 PRODUCTIONキーストア(DEBUGキーストアを使用しない)を使用してAPKに署名し、配布する予定のバージョンをインストールしたことを確認してください。次に、このメソッドによって返された署名をコンソールにコピーし、.enableSigningCertificate(“ YOUR_APK_SIGNATURE”)に貼り付けます。

//このメソッドは、コンソールにアプリの署名を出力します

Log.e(“ SIGNATURE”、PiracyCheckerUtils.getAPKSignature(this));

インストーラーを確認する

特定のストアでのみアプリを配布することを計画している場合、この手法は別のストアを使用してアプリをインストールすることをブロックします。

サポートされているストア:Google Play、Amazon App Store、Samsung GalaxyApps。

新しいPiracyChecker(this)

.enableInstallerId(InstallerID.GOOGLE_PLAY)

.enableInstallerId(InstallerID.AMAZON_APP_STORE)

.enableInstallerId(InstallerID.GALAXY_APPS)

..。

。開始();

注意してください!! これは、アプリが別のマーケットを使用してインストールされたり、デバイスに.apkを直接インストールしたりするのをブロックするため、非常に制限的な手法です。ほとんどの場合、お勧めしません。

海賊版アプリの使用を確認する

ユーザーが海賊版アプリをインストールしているかどうかを確認したい場合は、このコードを使用できます。

Lucky Patcher、Uret Patcher、Freedom、CreeHackをチェックします。

新しいPiracyChecker(this)

.enableUnauthorizedAppsCheck()

..。

。開始();

この海賊版アプリがアンインストールされている場合でも、アプリをブロックできます。これにより、アプリにパッチが適用されてから、アプリを引き続き使用するために海賊版アプリがアンインストールされるのを防ぎます。ライブラリはSharedPreference値を保存して、海賊版アプリがいつ検出されたかを認識します。

これを行うには2つの方法があります。

SharedPreferencesと、結果を保存するプリファレンスの名前を定義します。

新しいPiracyChecker(this)

.enableUnauthorizedAppsCheck()

.blockIfUnauthorizedAppUninstalled(preferences、“ app_unauthorized”)//「app_unauthorized」を独自の値に変更します

..。

。開始();

SharedPreferences名と、結果を保存するプリファレンスの名前を定義します。

新しいPiracyChecker(this)

.enableUnauthorizedAppsCheck()

.blockIfUnauthorizedAppUninstalled( 'license_preferences'、 'app_unauthorized')//「license_preferences」と「app_unauthorized」を独自の値に変更します

..。

。開始();

サードパーティのストアアプリの使用を確認する

ユーザーにサードパーティストアアプリがインストールされているかどうかを確認する場合は、このコードを使用できます。

Aptoide、BlackMart、Mobogenie、1Mobile、GetApk、GetJar、SlideMe、ACMarketをチェックします。

新しいPiracyChecker(this)

.enableStoresCheck()

..。

。開始();

アプリがデバッグビルドかどうかを確認します

アプリが開発プロセス外のエミュレーターで実行されている場合は、あなた以外の誰かがアプリを分析しようとしていることを示します。

新しいPiracyChecker(this)

.enableDebugCheck()

..。

。開始();

アプリがエミュレーターで実行されているかどうかを確認します

開発以外では、アプリがエミュレーターで実行される可能性は低く、接続されたコンピューターがAndroid Debug Bridgeを介してアプリにアクセスしてデバッグできるため、デバッグ可能が有効になっているアプリをリリースすることはお勧めしません。

boolean deep = false;

新しいPiracyChecker(this)

.enableEmulatorCheck(deep)

..。

。開始();

注意: 深いブール値を使用すると、ライブラリに追加のチェックを実行して、デバイスがエミュレータであるかどうかを検出できます。奇妙なクラッシュにつながる可能性があるので、使用するときは賢明です。

ライセンスチェックの結果をSharedPreferencesに保存します

ライセンスチェックの結果を保存すると、.start()を複数回呼び出さずにライセンスステータスをチェックするのに役立ちます。

これを行うには2つの方法があります。

SharedPreferencesと、結果を保存するプリファレンスの名前を定義します。

新しいPiracyChecker(this)

.saveResultToSharedPreferences(preferences、“ valid_license”)//「valid_license」を独自の値に変更します

..。

。開始();

SharedPreferences名と、結果を保存するプリファレンスの名前を定義します。

新しいPiracyChecker(this)

.saveResultToSharedPreferences( 'license_preferences'、 'valid_license')//「license_preferences」と「valid_license」を独自の値に変更します

..。

。開始();

カスタマイズ

ダイアログまたは新しいアクティビティに結果を表示する

ライセンスが無効な場合は、ダイアログではなく新しいアクティビティを表示することをお勧めします。このようにして、アプリのメインアクティビティが終了したことを確認します。

デフォルトでは、キャンセル不可のダイアログが表示されます。

新しいPiracyChecker(this)

.display(Display.ACTIVITY)

..。

。開始();

デフォルトでは、表示されるアクティビティはライブラリの色を使用します。カスタムのプライマリおよびプライマリダークカラーを適用し、アクティビティに通常または明るいステータスバーを表示するかどうかを定義するには、次を使用します。

.withActivityColors(R.color.colorPrimary、R.color.colorPrimaryDark、withLightStatusBar)

以下を使用して、このアクティビティコンテンツのカスタムレイアウトxmlを定義することもできます。

.withActivityLayout(R.layout.my_custom_layout)

カスタムコールバックの使用

ビルダーにコールバックを追加すると、ライセンスがチェックされたときに何が起こるかをカスタマイズし、ユーザーがアプリの使用を許可されていない場合にライセンスチェックエラーを管理できます。この方法を使用するときは注意してください 許可されていないユーザーからアプリをブロックすることに注意する必要があります

デフォルトでは、ユーザーがアプリの使用を許可されていない場合、ライブラリはキャンセル不可のダイアログを表示します。それ以外の場合、何も起こりません。

ビルダーを使用して、以下を追加します。

.callback(new PiracyCheckerCallback(){

@オーバーライド

public void allow(){

//ユーザーがアプリの使用を許可されているときに何かをする

}

@オーバーライド

public void dontAllow(@NonNull PiracyCheckerError error、@ Nullable PirateApp app){

//ユーザーがアプリの使用を許可されていない場合は、特定のことを行うことができます

//または、「error」パラメータを使用してエラーを自分で管理します({@link PiracyCheckerError}でエラーを確認してください)。

//さらに、海賊版アプリやサードパーティストアのチェックを有効にした場合、「app」パラメータ

//デバイスで検出されたアプリです。アプリはnullになる可能性があり、nullの場合は、海賊版アプリまたはストアが見つからなかったことを意味します。

//または、これらのアプリのチェックを無効にしました。

//これにより、ライセンスが無効である理由として考えられるものをユーザーに知らせることができます。

}

@オーバーライド

public void onError(@NonNull PiracyCheckerError error){

//このメソッドは実装/オーバーライドする必要はありませんが…

//ライセンスの確認中にエラーが発生した場合は、特定の操作を実行できます。

//または、「error」パラメータを使用してエラーを自分で管理します({@link PiracyCheckerError}でエラーを確認してください)。

}

})

読んだ6分