Wie Android-Entwickler ihre Apps vor IAP-Hackern schützen können

Dieser Leitfaden richtet sich an Android-App-Entwickler, die mit IAPs Einnahmen erzielen und sich über Hacking-Tools vor Hackern und betrügerischen Einkäufen schützen möchten. Es gibt mehrere bekannte IAP-Hacking-Tools, die ich hier nicht auflisten werde. Grundsätzlich senden diese Tools jedoch falsche Kaufbelege an Ihre App, damit der Benutzer kostenlose IAPs nutzen kann. Dies kann alles sein, von monatlichen Abonnements bis hin zu Token im Spiel.

Während ständig neue Versionen dieser Hacking-Tools veröffentlicht werden und es sehr wichtig ist, sich über die neuesten Updates und Methoden zu informieren, können Sie einige Dinge tun, um die IAPs Ihrer Apps vor Diebstahl zu schützen. Vor allem müssen Sie verschiedene Methoden zur serverseitigen IAP-Überprüfung aktivieren, auf die ich weiter unten näher eingehen werde.

Dieser Leitfaden richtet sich nicht an Neulinge, sondern an erfahrene App-Entwickler, die die verschiedenen Fachbegriffe in diesem Leitfaden verstehen.

Verwenden eines Git Repo-Plug-Ins Speziell für diesen Zweck:

PiracyChecker

Fügen Sie das Repository zu Ihrem Projekt build.gradle hinzu:

Repositories {

maven {

URL “https://jitpack.io”

}}

}}

Und fügen Sie die Bibliothek Ihrem Modul build.gradle hinzu:

Abhängigkeiten {

kompiliere ‘com.github.javiersantos: PiracyChecker: 1.1’

}}

Empfehlungen

  • Aktivieren Sie ProGuard immer in Ihren Produktionsversionen.
  • PiracyChecker sollte in Ihrer onCreate-Methode enthalten sein, um so schnell wie möglich nach einer gültigen Lizenz zu suchen.
  • Es wird empfohlen, anstelle eines Dialogfelds eine neue Aktivität anzuzeigen, wenn die Lizenz nicht gültig ist. Auf diese Weise stellen Sie sicher, dass die Hauptaktivität der App beendet ist. Sehen “Die Ergebnisse werden in einem Dialogfeld oder einer neuen Aktivität angezeigt“.

Überprüfen Sie die Google Play-Lizenzierung (LVL).

Google Play bietet einen Lizenzierungsdienst, mit dem Sie Lizenzrichtlinien für Anwendungen durchsetzen können, die Sie auf Google Play veröffentlichen. Mit der Google Play-Lizenzierung kann Ihre Anwendung Google Play abfragen, um den Lizenzierungsstatus für den aktuellen Benutzer zu erhalten.

Jede Anwendung, die Sie über Google Play veröffentlichen, kann den Google Play-Lizenzierungsdienst verwenden. Es ist kein spezielles Konto oder eine Registrierung erforderlich.

neuer PiracyChecker (this)

.enableGooglePlayLicensing (“BASE_64_LICENSE_KEY”)

.Start();

Um Ihren BASE64-Lizenzschlüssel abzurufen, muss Ihre App auf die Website hochgeladen werden Google Play Developer Console. Dann greifen Sie auf Ihre App zu -> Dienste und APIs.

Wenn Sie die Google Play-Lizenzierung verwenden, sollten Sie .destroy () in der onDestroy () -Methode Ihrer Aktivität aufrufen, um zu vermeiden, dass mehrere Instanzen des Dienstes ausgeführt werden.

Überprüfen Sie das Signaturzertifikat Ihrer App (Signatur).

Entwickler müssen Anwendungen immer mit ihrem privaten Schlüssel / Zertifikat (in einer .keystore-Datei enthalten) signieren, bevor die App auf Benutzergeräten installiert werden kann. Das Signaturzertifikat muss während der gesamten Lebensdauer der App konsistent bleiben und in der Regel ein Ablaufdatum von 25 Jahren haben.

Die App-Signatur wird beschädigt, wenn die APK-Datei in irgendeiner Weise geändert wird. Nicht signierte Apps können normalerweise nicht installiert werden. Wir können uns vorstellen, dass ein Angreifer den Code zur Lizenzprüfung entfernt, um beispielsweise alle App-Funktionen zu aktivieren, ohne dafür zu bezahlen. Ein gefährlicheres Beispiel wäre die Änderung der APK-Datei, um Malware in eine legitime App aufzunehmen, um vertrauliche Benutzerdaten zu sammeln. Damit das geänderte .apk installiert werden kann, muss der Angreifer es zurücktreten.

neuer PiracyChecker (this)

.enableSigningCertificate (“478yYkKAQF + KST8y4ATKvHkYibo =”) // Die ursprüngliche APK-Signatur für die PRODUCTION-Version

.Start();

ACHTUNG!! Ihre App-Signatur kann mit einer PiracyCheckerUtils-Methode abgerufen werden. Stellen Sie sicher, dass Sie Ihre APK mit Ihrem PRODUCTION-Keystore (nicht mit dem DEBUG-Keystore) signiert und die Version installiert haben, die Sie verteilen möchten. Kopieren Sie dann die von dieser Methode zurückgegebene Signatur auf die Konsole und fügen Sie .enableSigningCertificate (“YOUR_APK_SIGNATURE”) ein.

// Diese Methode druckt Ihre App-Signatur in der Konsole

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

Überprüfen Sie das Installationsprogramm

Wenn Sie nur vorhaben, die App in einem bestimmten Geschäft zu verteilen, verhindert diese Technik, dass die App in einem anderen Geschäft installiert wird.

Unterstützte Stores: Google Play, Amazon App Store und Samsung Galaxy Apps.

neuer PiracyChecker (this)

.enableInstallerId (InstallerID.GOOGLE_PLAY)

.enableInstallerId (InstallerID.AMAZON_APP_STORE)

.enableInstallerId (InstallerID.GALAXY_APPS)

.Start();

ACHTUNG!! Dies ist eine sehr restriktive Technik, da dadurch verhindert wird, dass Ihre App auf einem anderen Markt installiert oder die APK direkt auf dem Gerät installiert wird. Es wird in den meisten Fällen nicht empfohlen.

Überprüfen Sie die Verwendung von Piraten-Apps

Wenn Sie überprüfen möchten, ob der Benutzer Piraten-Apps installiert hat, können Sie diesen Code verwenden.

Es wird geprüft nach: Lucky Patcher, Uret Patcher, Freedom und CreeHack.

neuer PiracyChecker (this)

.enableUnauthorizedAppsCheck ()

.Start();

Sie können die App auch dann blockieren, wenn diese Piraten-Apps deinstalliert wurden. Dies verhindert, dass die App gepatcht wird, und deinstalliert dann die Piraten-App, um Ihre App weiterhin zu verwenden. Die Bibliothek speichert einen SharedPreference-Wert, um zu erfahren, wann eine Piraten-App erkannt wurde.

Es gibt zwei Möglichkeiten, dies zu tun:

Definieren Sie die SharedPreferences und den Namen der Voreinstellung, in der Sie das Ergebnis speichern möchten.

neuer PiracyChecker (this)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled (Einstellungen, “app_unauthorized”) // Ändern Sie “app_unauthorized” mit Ihrem eigenen Wert

.Start();

Definieren Sie den Namen SharedPreferences und den Namen der Voreinstellung, in der Sie das Ergebnis speichern möchten.

neuer PiracyChecker (this)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled (“Lizenzpräferenzen”, “app_unauthorized”) // Ändern Sie “Lizenzpräferenzen” und “app_unauthorized” mit Ihrem eigenen Wert

.Start();

Überprüfen Sie die Verwendung von Store-Apps von Drittanbietern

Wenn Sie überprüfen möchten, ob auf dem Benutzer Store-Apps von Drittanbietern installiert sind, können Sie diesen Code verwenden.

Es wird geprüft nach: Aptoide, BlackMart, Mobogenie, 1Mobile, GetApk, GetJar, SlideMe und ACMarket.

neuer PiracyChecker (this)

.enableStoresCheck ()

.Start();

Überprüfen Sie, ob es sich bei der App um ein Debug-Build handelt

Wenn Ihre App auf einem Emulator außerhalb des Entwicklungsprozesses ausgeführt wird, gibt dies einen Hinweis darauf, dass eine andere Person als Sie versucht, die App zu analysieren.

neuer PiracyChecker (this)

.enableDebugCheck ()

.Start();

Überprüfen Sie, ob die App in einem Emulator ausgeführt wird

Außerhalb der Entwicklung ist es unwahrscheinlich, dass Ihre App auf einem Emulator ausgeführt wird. Das Freigeben von Apps mit aktiviertem Debuggable wird nicht empfohlen, da verbundene Computer über die Android Debug Bridge auf die App zugreifen und sie debuggen können.

boolean deep = false;

neuer PiracyChecker (this)

.enableEmulatorCheck (tief)

.Start();

Hinweis: Der Deep Boolean mit veranlasst die Bibliothek, zusätzliche Überprüfungen durchzuführen, um festzustellen, ob das Gerät ein Emulator ist oder nicht. Es könnte zu seltsamen Abstürzen führen, seien Sie also vorsichtig, wenn Sie es verwenden.

Speichern Sie das Ergebnis der Lizenzprüfung in SharedPreferences

Das Speichern des Ergebnisses der Lizenzprüfung ist nützlich, um den Lizenzstatus zu überprüfen, ohne .start () mehrmals aufzurufen.

Es gibt zwei Möglichkeiten, dies zu tun:

Definieren Sie die SharedPreferences und den Namen der Voreinstellung, in der Sie das Ergebnis speichern möchten.

neuer PiracyChecker (this)

.saveResultToSharedPreferences (Einstellungen, “valid_license”) // Ändern Sie “valid_license” mit Ihrem eigenen Wert

.Start();

Definieren Sie den Namen SharedPreferences und den Namen der Voreinstellung, in der Sie das Ergebnis speichern möchten.

neuer PiracyChecker (this)

.saveResultToSharedPreferences (“Lizenzpräferenzen”, “gültige Lizenz”) // Ändern Sie “Lizenzpräferenzen” und “gültige Lizenz” mit Ihrem eigenen Wert

.Start();

Anpassungen

Die Ergebnisse werden in einem Dialogfeld oder einer neuen Aktivität angezeigt

Es wird empfohlen, anstelle eines Dialogfelds eine neue Aktivität anzuzeigen, wenn die Lizenz nicht gültig ist. Auf diese Weise stellen Sie sicher, dass die Hauptaktivität der App beendet ist.

Standardmäßig wird ein nicht stornierbarer Dialog angezeigt.

neuer PiracyChecker (this)

.display (Display.ACTIVITY)

.Start();

Standardmäßig verwendet die angezeigte Aktivität die Bibliotheksfarben. Verwenden Sie Folgendes, um eine benutzerdefinierte primäre und primäre dunkle Farbe anzuwenden und zu definieren, ob für die Aktivität eine normale oder helle Statusleiste angezeigt werden soll:

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

Sie können auch eine benutzerdefinierte Layout-XML für diesen Aktivitätsinhalt definieren, indem Sie Folgendes verwenden:

.withActivityLayout (R.layout.my_custom_layout)

Benutzerdefinierte Rückrufe verwenden

Durch Hinzufügen eines Rückrufs zum Builder können Sie anpassen, was passiert, wenn die Lizenz überprüft wurde, und die Lizenzprüfungsfehler verwalten, wenn der Benutzer die App nicht verwenden darf. Beachten Sie, dass Sie bei Verwendung dieser Methode darauf achten müssen, die App für nicht autorisierte Benutzer zu blockieren.

Standardmäßig zeigt die Bibliothek ein nicht stornierbares Dialogfeld an, wenn der Benutzer die App nicht verwenden darf. Andernfalls geschieht nichts.

Verwenden Sie den Builder und fügen Sie Folgendes hinzu:

.callback (neuer PiracyCheckerCallback () {

@Override

public void allow () {

// Mach etwas, wenn der Benutzer die App benutzen darf

}}

@Override

public void dontAllow (@NonNull PiracyCheckerError-Fehler, @Nullable PirateApp-App) {

// Sie können entweder etwas Bestimmtes tun, wenn der Benutzer die App nicht verwenden darf

// Oder verwalten Sie den Fehler mithilfe des Parameters ‘error’ selbst (Überprüfen Sie die Fehler unter {@link PiracyCheckerError}).

// Wenn Sie außerdem die Überprüfung von Piraten-Apps und / oder Geschäften von Drittanbietern aktiviert haben, wird der Parameter ‘app’ angezeigt

// ist die App, die auf dem Gerät erkannt wurde. App kann null sein, und wenn null, bedeutet dies, dass keine Piraten-App oder kein Piraten-Store gefunden wurde.

// oder Sie haben die Prüfung für diese Apps deaktiviert.

// Auf diese Weise können Sie den Benutzern die möglichen Gründe mitteilen, warum die Lizenz ungültig ist.

}}

@Override

public void onError (@NonNull PiracyCheckerError-Fehler) {

// Diese Methode muss nicht implementiert / überschrieben werden, aber…

// Sie können entweder etwas Bestimmtes tun, wenn beim Überprüfen der Lizenz ein Fehler auftritt.

// Oder verwalten Sie den Fehler mithilfe des Parameters ‘error’ selbst (Überprüfen Sie die Fehler unter {@link PiracyCheckerError}).

}}

})

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *