Hur Android-utvecklare kan skydda sina appar från IAP-hackare



Prova Vårt Instrument För Att Eliminera Problem

Den här guiden är för Android-apputvecklare som tjänar intäkter från IAP och vill skydda sig mot hackare och bedrägliga inköp via hackverktyg. Det finns flera välkända IAP-hackverktyg där ute, som jag inte kommer att lista här, men i princip skickar dessa verktyg falska inköpskvitton till din app så att användaren kan njuta av gratis IAP. Detta kan vara allt från månadsabonnemang till spel-tokens.





Medan nya versioner av dessa hackverktyg alltid släpps, och flit i att hålla sig medvetna om deras senaste uppdateringar och metoder är mycket viktigt, finns det några saker du kan göra för att skydda dina appar IAP: er från att bli stulna. Framför allt måste du aktivera flera metoder för IAP-verifiering på serversidan, som jag kommer att beskriva nedan.



Den här guiden är inte avsedd för nybörjare, men erfarna apputvecklare som förstår de olika lingo i den här guiden.

Använda en Git Repo Plug-in specifikt för detta ändamål:

PiracyChecker

Lägg till förvaret i ditt projekt build.gradle :



arkiv {

maven {

url “https://jitpack.io”

}

}

Och lägg till biblioteket i din modul build.gradle :

beroenden {

kompilera ”com.github.javiersantos: PiracyChecker: 1.1”

}

Rekommendationer

  • Aktivera alltid ProGuard i dina produktionsreleaser.
  • PiracyChecker bör ingå i din onCreate-metod för att söka efter en giltig licens så snart som möjligt.
  • Vi rekommenderar att du visar en ny aktivitet istället för en dialogruta när licensen inte är giltig. På det här sättet ser du till att appens huvudaktivitet är klar. Ser ' Visa resultat i en dialog eller en ny aktivitet '.

Verifiera Google Play Licensing (LVL)

Google Play erbjuder en licensieringstjänst som låter dig tillämpa licenspolicyer för applikationer som du publicerar på Google Play. Med Google Play Licensing kan din applikation fråga Google Play för att få licensstatus för den aktuella användaren.

Alla applikationer som du publicerar via Google Play kan använda tjänsten Google Play Licensing. Inget speciellt konto eller registrering behövs.

nya PiracyChecker (detta)

.enableGooglePlayLicensing (“BASE_64_LICENSE_KEY”)

...

.Start();

För att hämta din BASE64 licensnyckel måste din app laddas upp till Google Play Developer Console . Gå sedan till din app -> Tjänster och API: er.

När du använder Google Play-licensiering bör du ringa .destroy () i onDestroy () -metoden för din aktivitet för att undvika flera instanser av tjänsten som körs.

Verifiera appens signeringscertifikat (signatur)

Utvecklare måste alltid signera applikationer med sin privata nyckel / certifikat (som finns i en .keystore-fil) innan appen kan installeras på användarenheter. Signeringscertifikatet måste vara konsekvent under hela appens livslängd och har vanligtvis ett utgångsdatum på 25 år.

Appens signatur kommer att brytas om .apk ändras på något sätt - osignerade appar kan vanligtvis inte installeras. Vi kan föreställa oss att en angripare tar bort kod för att kontrollera licensen för att tillåta fullständiga appfunktioner utan att till exempel betala. Ett farligare exempel skulle vara att ändra .apk för att inkludera skadlig kod i en legitim app för att skörda känslig användardata. För att den ändrade .apk ska installeras måste angriparen avgå.

nya PiracyChecker (detta)

.enableSigningCertificate (“478yYkKAQF + KST8y4ATKvHkYibo =”) // Den ursprungliga APK-signaturen för PRODUCTION-versionen

...

.Start();

VAR FÖRSIKTIG!! Din appsignatur kan hämtas med en PiracyCheckerUtils-metod. Se till att du har signerat din APK med hjälp av din PRODUCTION-nyckellager (inte använder DEBUG) och installerat den version som du planerar att distribuera. Kopiera sedan signaturen som returneras med den här metoden på konsolen och klistra in i .enableSigningCertificate (“YOUR_APK_SIGNATURE”)

// Den här metoden skriver ut din appsignatur i konsolen

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

Verifiera installationsprogrammet

Om du bara planerar att distribuera appen i en viss butik kommer denna teknik att hindra installationen av appen i någon annan butik.

Stödda butiker: Google Play, Amazon App Store och Samsung Galaxy Apps.

nya PiracyChecker (detta)

.enableInstallerId (InstallerID.GOOGLE_PLAY)

.enableInstallerId (InstallerID.AMAZON_APP_STORE)

.enableInstallerId (InstallerID.GALAXY_APPS)

...

.Start();

VAR FÖRSIKTIG!! Det här är en riktigt begränsande teknik eftersom det kommer att blockera att din app installeras på en annan marknad eller direkt installerar .apk på enheten. Det rekommenderas inte i de flesta fall.

Verifiera användningen av piratappar

Om du vill kontrollera om användaren har piratappar installerade kan du använda den här koden.

Det kommer att söka efter: Lucky Patcher, Uret Patcher, Freedom och CreeHack.

nya PiracyChecker (detta)

.enableUnauthorizedAppsCheck ()

...

.Start();

Du kan blockera appen även när de här piratapparna har avinstallerats. Detta förhindrar att appen lappas och avinstallerar sedan piratappen för att fortsätta använda din app. Biblioteket sparar ett SharedPreference-värde för att veta när en piratapp har upptäckts.

Det finns två sätt att göra detta:

Definiera SharedPreferences och namnet på preferensen där du vill spara resultatet.

nya PiracyChecker (detta)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled (preferenser, 'app_unauthorized') // Ändra 'app_unauthorized' med ditt eget värde

...

.Start();

Definiera SharedPreferences-namnet och namnet på inställningen där du vill spara resultatet.

nya PiracyChecker (detta)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled ('licens_preferences', 'app_unauthorized') // Ändra 'licens_preferences' och 'app_unauthorized' med ditt eget värde

...

.Start();

Verifiera användningen av appar från tredje part

Om du vill kontrollera om användaren har installerade butiksappar från tredje part kan du använda den här koden.

Det kommer att kontrollera om: Aptoide, BlackMart, Mobogenie, 1Mobile, GetApk, GetJar, SlideMe och ACMarket.

nya PiracyChecker (detta)

.enableStoresCheck ()

...

.Start();

Verifiera om appen är en felsökningsbyggnad

Om din app körs på en emulator utanför utvecklingsprocessen, ger det en indikation på att någon annan än du försöker analysera appen.

nya PiracyChecker (detta)

.enableDebugCheck ()

...

.Start();

Verifiera om appen körs i en emulator

Utanför utveckling är det osannolikt att din app ska köras på en emulator, och det släpps inte på att släppa appar med debuggable aktiverat eftersom det gör att anslutna datorer kan komma åt och felsöka appen via Android Debug Bridge.

boolesk djup = falsk;

nya PiracyChecker (detta)

.enableEmulatorCheck (djup)

...

.Start();

Notera: den djupa booleska med gör att biblioteket gör extra kontroller för att upptäcka om enheten är en emulator eller inte. Det kan leda till några konstiga kraschar, så var klok när du använder den.

Spara resultatet av licenskontrollen i SharedPreferences

Att spara resultatet av licenskontrollen är användbart för att kontrollera licensstatus utan att ringa .start () flera gånger.

Det finns två sätt att göra detta:

Definiera SharedPreferences och namnet på preferensen där du vill spara resultatet.

nya PiracyChecker (detta)

.saveResultToSharedPreferences (preferenser, 'valid_license') // Ändra 'valid_license' med ditt eget värde

...

.Start();

Definiera SharedPreferences-namnet och namnet på inställningen där du vill spara resultatet.

nya PiracyChecker (detta)

.saveResultToSharedPreferences ('licens_preferenser', 'valid_license') // Ändra 'licens_preferences' och 'valid_license' med ditt eget värde

...

.Start();

Anpassningar

Visa resultat i en dialog eller en ny aktivitet

Vi rekommenderar att du visar en ny aktivitet istället för en dialogruta när licensen inte är giltig. På det här sättet ser du till att appens huvudaktivitet är klar.

Som standard visas en dialog som inte kan avbrytas.

nya PiracyChecker (detta)

.display (Display.ACTIVITY)

...

.Start();

Som standard använder den visade aktiviteten bibliotekets färger. För att använda en anpassad primär och primär mörk färg och för att definiera om aktiviteten ska visa normal eller ljus statusfält, använd:

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

Du kan också definiera en anpassad layout xml för detta aktivitetsinnehåll med:

.withActivityLayout (R.layout.my_custom_layout)

Använda anpassade återuppringningar

Genom att lägga till en återuppringning till byggaren kan du anpassa vad som kommer att hända när licensen har kontrollerats och hantera licenskontrollfelen om användaren inte får använda appen. Tänk på att när du använder den här metoden du måste vara medveten om att blockera appen från obehöriga användare .

Som standard visar biblioteket en dialogruta som inte kan avbrytas om användaren inte får använda appen, annars händer ingenting.

Använd byggaren och lägg till följande:

.callback (ny PiracyCheckerCallback () {

@Åsidosätta

offentligt tomrum tillåta () {

// Gör något när användaren får använda appen

}

@Åsidosätta

offentligt ogiltigt dontAllow (@NonNull PiracyCheckerError-fel, @Nullable PirateApp-app) {

// Du kan antingen göra något specifikt när användaren inte får använda appen

// Eller hantera felet med hjälp av ”fel” -parametern själv (Kontrollera fel på {@link PiracyCheckerError}).

// Dessutom, om du aktiverade kontrollen av piratappar och / eller tredjepartsbutiker, kommer parametern 'app'

// är appen som har upptäckts på enheten. Appen kan vara null, och när den är null betyder det att ingen piratapp eller butik hittades,

// eller inaktiverade du kontrollen för dessa appar.

// Detta låter dig informera användare om de möjliga orsakerna till att licensen är ogiltig.

}

@Åsidosätta

offentligt ogiltigt onError (@NonNull PiracyCheckerError fel) {

// Denna metod krävs inte för att implementeras / åsidosättas men ...

// Du kan antingen göra något specifikt när ett fel uppstår när du kontrollerar licensen,

// Eller hantera felet med hjälp av ”fel” -parametern själv (Kontrollera fel på {@link PiracyCheckerError}).

}

})

6 minuter läst