Como os desenvolvedores Android podem proteger seus aplicativos de hackers IAP



Experimente Nosso Instrumento Para Eliminar Problemas

Este guia é para desenvolvedores de aplicativos Android que ganham receita com IAPs e querem se proteger de hackers e compras fraudulentas por meio de ferramentas de hacking. Existem várias ferramentas de hacking de IAP conhecidas por aí, que não vou listar aqui, mas basicamente essas ferramentas enviam recibos de compra falsos para seu aplicativo para permitir que o usuário aproveite IAPs gratuitos. Isso pode ser qualquer coisa, desde assinaturas mensais a tokens no jogo.





Embora novas versões dessas ferramentas de hacking estejam sempre sendo lançadas e a diligência em ficar ciente de suas atualizações e métodos mais recentes seja muito importante, existem algumas coisas que você pode fazer para proteger os IAPs de seus aplicativos de serem roubados. Mais notavelmente, você precisa habilitar vários métodos de verificação IAP do lado do servidor, que detalharei a seguir.



Este guia não se destina a iniciantes, mas sim a desenvolvedores de aplicativos experientes que entenderão os diversos jargões deste guia.

Usando um plug-in Git Repo especificamente para esta finalidade:

PiracyChecker

Adicione o repositório ao seu projeto build.gradle :



repositórios {

maven {

url “https://jitpack.io”

}

}

E adicione a biblioteca ao seu módulo build.gradle :

dependencies {

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

}

Recomendações

  • Sempre habilite o ProGuard em suas versões de produção.
  • O PiracyChecker deve ser incluído em seu método onCreate para verificar se há uma licença válida o mais rápido possível.
  • É recomendável mostrar uma nova atividade em vez de um diálogo quando a licença não é válida. Desta forma, você garante que a atividade principal do aplicativo foi concluída. Vejo ' Exibir os resultados em um diálogo ou uma nova atividade '

Verificar licença do Google Play (LVL)

O Google Play oferece um serviço de licenciamento que permite aplicar políticas de licenciamento para aplicativos que você publica no Google Play. Com o licenciamento do Google Play, seu aplicativo pode consultar o Google Play para obter o status de licenciamento do usuário atual.

Qualquer aplicativo que você publicar por meio do Google Play pode usar o serviço de licenciamento do Google Play. Nenhuma conta especial ou registro é necessário.

novo PiracyChecker (este)

.enableGooglePlayLicensing (“BASE_64_LICENSE_KEY”)

...

.começar();

Para recuperar sua chave de licença BASE64, seu aplicativo deve ser carregado no Console do desenvolvedor do Google Play . Em seguida, acesse seu aplicativo -> Serviços e APIs.

Ao usar o licenciamento do Google Play, você deve chamar .destroy () no método onDestroy () de sua atividade para evitar a execução de várias instâncias do serviço.

Verifique o certificado de assinatura do seu app (assinatura)

Os desenvolvedores devem sempre assinar aplicativos com sua chave privada / certificado (contido em um arquivo .keystore) antes que o aplicativo possa ser instalado nos dispositivos dos usuários. O certificado de assinatura deve permanecer consistente durante toda a vida do aplicativo e, normalmente, ter uma data de validade de 25 anos.

A assinatura do aplicativo será quebrada se o .apk for alterado de alguma forma - aplicativos não assinados normalmente não podem ser instalados. Podemos imaginar um invasor removendo o código de verificação de licença para habilitar todos os recursos do aplicativo sem pagar, por exemplo. Um exemplo mais perigoso seria alterar o .apk para incluir malware em um aplicativo legítimo para coletar dados confidenciais do usuário. Para que o .apk alterado seja instalado, o invasor deve renunciar.

novo PiracyChecker (este)

.enableSigningCertificate (“478yYkKAQF + KST8y4ATKvHkYibo =”) // A assinatura do APK original para a versão de PRODUÇÃO

...

.começar();

SEJA CUIDADOSO!! Sua assinatura de aplicativo pode ser recuperada usando um método PiracyCheckerUtils. Certifique-se de que assinou seu APK usando seu armazenamento de chaves PRODUCTION (não usando o DEBUG) e instalou a versão que planeja distribuir. Em seguida, copie a assinatura retornada por este método no console e cole em .enableSigningCertificate (“YOUR_APK_SIGNATURE”)

// Este método imprimirá a assinatura do seu aplicativo no console

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

Verifique o instalador

Se você planeja distribuir o aplicativo apenas em uma loja específica, essa técnica impedirá a instalação do aplicativo em qualquer outra loja.

Lojas compatíveis: Google Play, Amazon App Store e Samsung Galaxy Apps.

novo PiracyChecker (este)

.enableInstallerId (InstallerID.GOOGLE_PLAY)

.enableInstallerId (InstallerID.AMAZON_APP_STORE)

.enableInstallerId (InstallerID.GALAXY_APPS)

...

.começar();

SEJA CUIDADOSO!! Esta é uma técnica realmente restritiva, pois bloqueará a instalação do seu aplicativo em outro mercado ou na instalação direta do .apk no dispositivo. Não é recomendado para a maioria dos casos.

Verifique o uso de aplicativos piratas

Se você quiser verificar se o usuário tem aplicativos piratas instalados, você pode usar este código.

Ele verificará se há: Lucky Patcher, Uret Patcher, Freedom e CreeHack.

novo PiracyChecker (este)

.enableUnauthorizedAppsCheck ()

...

.começar();

Você pode bloquear o aplicativo mesmo quando esses aplicativos piratas forem desinstalados. Isso evita que o aplicativo seja corrigido e, em seguida, desinstale o aplicativo pirata para continuar usando seu aplicativo. A biblioteca salvará um valor SharedPreference para saber quando um aplicativo pirata foi detectado.

Existem duas maneiras de fazer isso:

Defina as SharedPreferences e o nome da preferência onde deseja salvar o resultado.

novo PiracyChecker (este)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled (preferências, “app_unauthorized”) // Altere “app_unauthorized” com seu próprio valor

...

.começar();

Defina o nome SharedPreferences e o nome da preferência em que deseja salvar o resultado.

novo PiracyChecker (este)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled (“license_preferences”, “app_unauthorized”) // Altere “license_preferences” e “app_unauthorized” com seu próprio valor

...

.começar();

Verifique o uso de aplicativos de loja de terceiros

Se você deseja verificar se o usuário tem aplicativos de loja de terceiros instalados, você pode usar este código.

Ele verificará se há: Aptoide, BlackMart, Mobogenie, 1Mobile, GetApk, GetJar, SlideMe e ACMarket.

novo PiracyChecker (este)

.enableStoresCheck ()

...

.começar();

Verifique se o aplicativo é uma compilação de depuração

Se seu aplicativo estiver sendo executado em um emulador fora do processo de desenvolvimento, isso indica que outra pessoa além de você está tentando analisar o aplicativo.

novo PiracyChecker (este)

.enableDebugCheck ()

...

.começar();

Verifique se o aplicativo está sendo executado em um emulador

Fora do desenvolvimento, é improvável que seu aplicativo seja executado em um emulador, e lançar aplicativos com depuração habilitado é desencorajado, pois permite que os computadores conectados acessem e depure o aplicativo por meio do Android Debug Bridge.

profundidade booleana = falso;

novo PiracyChecker (este)

.enableEmulatorCheck (profundo)

...

.começar();

Nota: o deep boolean com faz a biblioteca fazer verificações extras para detectar se o dispositivo é um emulador ou não. Isso pode levar a alguns travamentos estranhos, então seja sábio ao usá-lo.

Salve o resultado da verificação da licença em SharedPreferences

Salvar o resultado da verificação da licença é útil para verificar o status da licença sem chamar .start () várias vezes.

Existem duas maneiras de fazer isso:

Defina as SharedPreferences e o nome da preferência onde deseja salvar o resultado.

novo PiracyChecker (este)

.saveResultToSharedPreferences (preferências, “valid_license”) // Altere “valid_license” com seu próprio valor

...

.começar();

Defina o nome SharedPreferences e o nome da preferência em que deseja salvar o resultado.

novo PiracyChecker (este)

.saveResultToSharedPreferences (“license_preferences”, “valid_license”) // Altere “license_preferences” e “valid_license” com seu próprio valor

...

.começar();

Personalizações

Exibir os resultados em um diálogo ou uma nova atividade

É recomendável mostrar uma nova atividade em vez de um diálogo quando a licença não é válida. Desta forma, você garante que a atividade principal do aplicativo foi concluída.

Por padrão, uma caixa de diálogo não cancelável será exibida.

novo PiracyChecker (este)

.display (Display.ACTIVITY)

...

.começar();

Por padrão, a Atividade exibida usará as cores da biblioteca. Para aplicar uma cor escura primária e primária personalizada e definir se a atividade deve mostrar uma barra de status normal ou clara, use:

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

Você também pode definir um layout xml personalizado para o conteúdo desta atividade, usando:

.withActivityLayout (R.layout.my_custom_layout)

Usando callbacks personalizados

Adicionar um retorno de chamada ao construtor permite que você personalize o que acontecerá quando a licença for verificada e gerencie os erros de verificação de licença se o usuário não tiver permissão para usar o aplicativo. Tenha em mente que ao usar este método você deve estar ciente de bloquear o aplicativo de usuários não autorizados .

Por padrão, a biblioteca exibirá uma caixa de diálogo não cancelável se o usuário não tiver permissão para usar o aplicativo, caso contrário, nada acontecerá.

Use o construtor e adicione o seguinte:

.callback (new PiracyCheckerCallback () {

@Sobrepor

public void allow () {

// Faça algo quando o usuário tiver permissão para usar o aplicativo

}

@Sobrepor

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

// Você pode fazer algo específico quando o usuário não tem permissão para usar o aplicativo

// Ou gerencie o erro, usando o parâmetro ‘error’, você mesmo (verifique os erros em {@link PiracyCheckerError}).

// Além disso, se você habilitou a verificação de aplicativos piratas e / ou lojas de terceiros, o parâmetro ‘app’

// é o aplicativo que foi detectado no dispositivo. O aplicativo pode ser nulo e, quando nulo, significa que nenhum aplicativo ou loja pirata foi encontrado,

// ou você desativou a verificação desses aplicativos.

// Isso permite que você informe aos usuários os possíveis motivos pelos quais a licença é inválida.

}

@Sobrepor

public void onError (@NonNull PiracyCheckerError error) {

// Este método não precisa ser implementado / substituído, mas ...

// Você pode fazer algo específico quando ocorre um erro durante a verificação da licença,

// Ou gerencie o erro, usando o parâmetro ‘error’, você mesmo (verifique os erros em {@link PiracyCheckerError}).

}

})

6 minutos lidos