Jak programiści Androida mogą chronić swoje aplikacje przed hakerami IAP



Wypróbuj Nasz Instrument Do Eliminowania Problemów

Ten przewodnik jest przeznaczony dla programistów aplikacji na Androida, którzy zarabiają na IAP i chcą chronić się przed hakerami i nieuczciwymi zakupami za pomocą narzędzi hakerskich. Istnieje kilka dobrze znanych narzędzi hakerskich IAP, których tutaj nie wymienię, ale zasadniczo narzędzia te wysyłają fałszywe potwierdzenia zakupu do Twojej aplikacji, aby umożliwić użytkownikowi korzystanie z bezpłatnych zakupów w aplikacji. Może to być wszystko, od miesięcznych subskrypcji po tokeny w grze.





Podczas gdy nowe wersje tych narzędzi hakerskich są zawsze wydawane, a staranność w utrzymywaniu świadomości ich najnowszych aktualizacji i metod jest bardzo ważna, jest kilka rzeczy, które możesz zrobić, aby chronić swoje aplikacje IAP przed kradzieżą. Przede wszystkim musisz włączyć kilka metod weryfikacji IAP po stronie serwera, które szczegółowo opiszę poniżej.



Ten przewodnik nie jest przeznaczony dla początkujących, ale doświadczonych programistów aplikacji, którzy rozumieją różne żargony zawarte w tym przewodniku.

Korzystanie z wtyczki Git Repo Specjalnie do tego celu:

PiracyChecker

Dodaj repozytorium do swojego projektu build.gradle :



repozytoria {

maven {

url „https://jitpack.io”

}

}

I dodaj bibliotekę do swojego modułu build.gradle :

zależności {

compile „com.github.javiersantos: PiracyChecker: 1.1”

}

Zalecenia

  • Zawsze włączaj ProGuard w swoich wersjach produkcyjnych.
  • PiracyChecker powinien być uwzględniony w Twojej metodzie onCreate, aby jak najszybciej sprawdzić, czy licencja jest ważna.
  • Jeśli licencja nie jest ważna, zaleca się wyświetlenie nowego działania zamiast okna dialogowego. W ten sposób upewnisz się, że główna aktywność aplikacji została zakończona. Widzieć ' Wyświetl wyniki w oknie dialogowym lub nowym działaniu ”.

Zweryfikuj licencje w Google Play (LVL)

Google Play oferuje usługę licencjonowania, która umożliwia egzekwowanie zasad licencjonowania aplikacji, które publikujesz w Google Play. Dzięki licencjonowaniu w Google Play Twoja aplikacja może wysyłać do Google Play zapytanie o stan licencji dla bieżącego użytkownika.

Każda aplikacja, którą publikujesz w Google Play, może korzystać z usługi licencjonowania w Google Play. Nie jest potrzebne żadne specjalne konto ani rejestracja.

nowy PiracyChecker (ten)

.enableGooglePlayLicensing („BASE_64_LICENSE_KEY”)

...

.początek();

Aby pobrać klucz licencyjny BASE64, Twoja aplikacja musi zostać przesłana do Konsola programisty Google Play . Następnie uzyskaj dostęp do swojej aplikacji -> Usługi i interfejsy API.

Korzystając z licencjonowania Google Play, należy wywołać .destroy () w metodzie onDestroy () swojego działania, aby uniknąć wielu uruchomionych instancji usługi.

Zweryfikuj certyfikat podpisywania aplikacji (podpis)

Programiści muszą zawsze podpisywać aplikacje swoim kluczem prywatnym / certyfikatem (zawartym w pliku .keystore), zanim aplikacja będzie mogła zostać zainstalowana na urządzeniach użytkowników. Certyfikat podpisywania musi pozostać niezmieniony przez cały okres użytkowania aplikacji i zwykle ma 25-letnią datę ważności.

Podpis aplikacji zostanie uszkodzony, jeśli plik .apk zostanie w jakikolwiek sposób zmieniony - zwykle nie można zainstalować niepodpisanych aplikacji. Możemy sobie wyobrazić, na przykład, że osoba atakująca usuwa kod sprawdzający licencję, aby włączyć pełne funkcje aplikacji bez płacenia. Bardziej niebezpiecznym przykładem byłaby zmiana .apk tak, aby zawierała złośliwe oprogramowanie w legalnej aplikacji do zbierania poufnych danych użytkownika. Aby zmodyfikowany plik .apk został zainstalowany, osoba atakująca musi go zrezygnować.

nowy PiracyChecker (ten)

.enableSigningCertificate („478yYkKAQF + KST8y4ATKvHkYibo =”) // Oryginalny podpis APK dla wersji PRODUKCYJNEJ

...

.początek();

BĄDŹ OSTROŻNY!! Twój podpis aplikacji można pobrać za pomocą metody PiracyCheckerUtils. Upewnij się, że podpisałeś swój plik APK przy użyciu magazynu kluczy PRODUKCJI (a nie DEBUG) i zainstalowałeś wersję, którą zamierzasz rozpowszechniać. Następnie skopiuj podpis zwrócony przez tę metodę na konsolę i wklej w .enableSigningCertificate („YOUR_APK_SIGNATURE”)

// Ta metoda spowoduje wydrukowanie podpisu aplikacji w konsoli

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

Zweryfikuj instalator

Jeśli planujesz rozpowszechniać aplikację tylko w określonym sklepie, ta technika uniemożliwi instalację aplikacji w innym sklepie.

Obsługiwane sklepy: Google Play, Amazon App Store i Samsung Galaxy Apps.

nowy PiracyChecker (ten)

.enableInstallerId (InstallerID.GOOGLE_PLAY)

.enableInstallerId (InstallerID.AMAZON_APP_STORE)

.enableInstallerId (InstallerID.GALAXY_APPS)

...

.początek();

BĄDŹ OSTROŻNY!! Jest to bardzo restrykcyjna technika, ponieważ blokuje instalację aplikacji na innym rynku lub bezpośrednią instalację aplikacji .apk na urządzeniu. W większości przypadków nie jest to zalecane.

Sprawdź, czy używasz pirackich aplikacji

Jeśli chcesz sprawdzić, czy użytkownik ma zainstalowane pirackie aplikacje, możesz użyć tego kodu.

Sprawdza: Lucky Patcher, Uret Patcher, Freedom i CreeHack.

nowy PiracyChecker (ten)

.enableUnauthorizedAppsCheck ()

...

.początek();

Możesz zablokować aplikację, nawet jeśli ta piracka aplikacja została odinstalowana. Zapobiega to łataniu aplikacji, a następnie odinstalowaniu aplikacji pirackiej w celu dalszego korzystania z aplikacji. Biblioteka zapisze wartość SharedPreference, aby wiedzieć, kiedy wykryto piracką aplikację.

Można to zrobić na dwa sposoby:

Zdefiniuj SharedPreferences i nazwę preferencji, w której chcesz zapisać wynik.

nowy PiracyChecker (ten)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled (preferencje, „app_unauthorized”) // Zmień „app_unauthorized” na własną wartość

...

.początek();

Zdefiniuj nazwę SharedPreferences i nazwę preferencji, w której chcesz zapisać wynik.

nowy PiracyChecker (ten)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled („license_preferences”, „app_unauthorized”) // Zmień „license_preferences” i „app_unauthorized” na własną wartość

...

.początek();

Sprawdź, czy korzystasz z aplikacji ze sklepu innych firm

Jeśli chcesz sprawdzić, czy użytkownik ma zainstalowane aplikacje ze sklepu innych firm, możesz użyć tego kodu.

Sprawdza: Aptoide, BlackMart, Mobogenie, 1Mobile, GetApk, GetJar, SlideMe i ACMarket.

nowy PiracyChecker (ten)

.enableStoresCheck ()

...

.początek();

Sprawdź, czy aplikacja jest kompilacją do debugowania

Jeśli Twoja aplikacja działa na emulatorze poza procesem programowania, oznacza to, że ktoś inny niż Ty próbuje analizować aplikację.

nowy PiracyChecker (ten)

.enableDebugCheck ()

...

.początek();

Sprawdź, czy aplikacja jest uruchamiana w emulatorze

Poza programowaniem jest mało prawdopodobne, aby Twoja aplikacja działała na emulatorze, a wydawanie aplikacji z włączoną możliwością debugowania jest odradzane, ponieważ umożliwia podłączonym komputerom dostęp do aplikacji i debugowanie jej za pośrednictwem Android Debug Bridge.

boolean deep = false;

nowy PiracyChecker (ten)

.enableEmulatorCheck (głęboko)

...

.początek();

Uwaga: Deep boolean z make biblioteka wykonuje dodatkowe sprawdzenia, aby wykryć, czy urządzenie jest emulatorem, czy nie. Może to prowadzić do dziwnych awarii, więc używaj go mądrze.

Zapisz wynik sprawdzania licencji w SharedPreferences

Zapisanie wyniku sprawdzenia licencji jest przydatne do sprawdzenia statusu licencji bez wielokrotnego wywoływania .start ().

Można to zrobić na dwa sposoby:

Zdefiniuj SharedPreferences i nazwę preferencji, w której chcesz zapisać wynik.

nowy PiracyChecker (ten)

.saveResultToSharedPreferences (preferencje, „valid_license”) // Zmień „valid_license” na własną wartość

...

.początek();

Zdefiniuj nazwę SharedPreferences i nazwę preferencji, w której chcesz zapisać wynik.

nowy PiracyChecker (ten)

.saveResultToSharedPreferences („license_preferences”, „valid_license”) // Zmień „license_preferences” i „valid_license” na własną wartość

...

.początek();

Modyfikacje

Wyświetl wyniki w oknie dialogowym lub nowym działaniu

Jeśli licencja nie jest ważna, zaleca się wyświetlenie nowego działania zamiast okna dialogowego. W ten sposób upewnisz się, że główna aktywność aplikacji została zakończona.

Domyślnie zostanie wyświetlone okno dialogowe, którego nie można anulować.

nowy PiracyChecker (ten)

.display (Display.ACTIVITY)

...

.początek();

Domyślnie wyświetlane działanie będzie miało kolory z biblioteki. Aby zastosować niestandardowy podstawowy i podstawowy ciemny kolor oraz określić, czy aktywność ma wyświetlać normalny, czy jasny pasek stanu, użyj:

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

Możesz również zdefiniować niestandardowy układ XML dla tej zawartości działania, używając:

.withActivityLayout (R.layout.my_custom_layout)

Korzystanie z niestandardowych wywołań zwrotnych

Dodanie wywołania zwrotnego do kreatora pozwala dostosować, co się stanie, gdy licencja zostanie sprawdzona, i zarządzać błędami sprawdzania licencji, jeśli użytkownik nie będzie mógł korzystać z aplikacji. Należy o tym pamiętać podczas korzystania z tej metody musisz być świadomy blokowania aplikacji przed nieautoryzowanymi użytkownikami .

Domyślnie biblioteka wyświetli okno dialogowe, którego nie można anulować, jeśli użytkownik nie może korzystać z aplikacji, w przeciwnym razie nic się nie stanie.

Użyj kreatora i dodaj następujące elementy:

.callback (new PiracyCheckerCallback () {

@Nadpisanie

public void allow () {

// Zrób coś, gdy użytkownik będzie mógł korzystać z aplikacji

}

@Nadpisanie

public void dontAllow (błąd @NonNull PiracyCheckerError, aplikacja @Nullable PirateApp) {

// Możesz zrobić coś konkretnego, gdy użytkownik nie może korzystać z aplikacji

// Możesz też samodzielnie zarządzać błędem, używając parametru „error” (sprawdź błędy na {@link PiracyCheckerError}).

// Dodatkowo, jeśli włączyłeś sprawdzanie pirackich aplikacji i / lub sklepów innych firm, parametr „aplikacja”

// to aplikacja, która została wykryta na urządzeniu. Aplikacja może mieć wartość null, a gdy jest pusta, oznacza to, że nie znaleziono pirackiej aplikacji ani sklepu,

// lub wyłączyłeś sprawdzanie tych aplikacji.

// Dzięki temu możesz poinformować użytkowników o możliwych przyczynach nieważności licencji.

}

@Nadpisanie

public void onError (błąd @NonNull PiracyCheckerError) {

// Ta metoda nie musi być implementowana / zastępowana, ale…

// Możesz zrobić coś konkretnego, gdy wystąpi błąd podczas sprawdzania licencji,

// Możesz też samodzielnie zarządzać błędem, używając parametru „error” (sprawdź błędy na {@link PiracyCheckerError}).

}

})

6 minut czytania