Cómo los desarrolladores de Android pueden proteger sus aplicaciones de los piratas informáticos de IAP



Pruebe Nuestro Instrumento Para Eliminar Los Problemas

Esta guía está destinada a los desarrolladores de aplicaciones de Android que obtienen ingresos de los IAP y desean protegerse de los piratas informáticos y las compras fraudulentas mediante herramientas de piratería. Existen varias herramientas de piratería de IAP conocidas, que no enumeraré aquí, pero básicamente estas herramientas envían recibos de compra falsos a su aplicación para permitir que el usuario disfrute de IAP gratis. Esto puede ser cualquier cosa, desde suscripciones mensuales hasta tokens en el juego.





Si bien siempre se lanzan nuevas versiones de estas herramientas de piratería, y la diligencia para estar al tanto de sus últimas actualizaciones y métodos es muy importante, hay algunas cosas que puede hacer para proteger los IAP de sus aplicaciones contra el robo. En particular, debe habilitar varios métodos de verificación IAP del lado del servidor, que detallaré a continuación.



Esta guía no está destinada a principiantes, sino a desarrolladores de aplicaciones con experiencia que comprenderán la jerga de esta guía.

Usando un complemento de Git Repo específicamente para este propósito:

PiracyChecker

Agrega el repositorio a tu proyecto build.gradle :



repositorios {

maven {

url 'https://jitpack.io'

}

}

Y agrega la biblioteca a tu módulo build.gradle :

dependencias {

compile 'com.github.javiersantos: PiracyChecker: 1.1'

}

Recomendaciones

  • Habilite siempre ProGuard en sus versiones de producción.
  • PiracyChecker debe incluirse en su método onCreate para verificar una licencia válida lo antes posible.
  • Se recomienda mostrar una nueva actividad en lugar de un cuadro de diálogo cuando la licencia no sea válida. De esta forma te aseguras de que la actividad principal de la aplicación esté terminada. Ver ' Mostrar resultados en un diálogo o una nueva actividad “.

Verificar licencias de Google Play (LVL)

Google Play ofrece un servicio de licencias que le permite hacer cumplir las políticas de licencias para las aplicaciones que publica en Google Play. Con las licencias de Google Play, su aplicación puede consultar a Google Play para obtener el estado de la licencia del usuario actual.

Cualquier aplicación que publique a través de Google Play puede utilizar el servicio de licencias de Google Play. No se necesita una cuenta o registro especial.

nuevo PiracyChecker (esto)

.enableGooglePlayLicensing ('BASE_64_LICENSE_KEY')

.comienzo();

Para recuperar su clave de licencia BASE64, su aplicación debe estar cargada en el Consola para desarrolladores de Google Play . Luego acceda a su aplicación -> Servicios y API.

Cuando use las licencias de Google Play, debe llamar a .destroy () en el método onDestroy () de su actividad para evitar que se ejecuten varias instancias del servicio.

Verifique el certificado de firma de su aplicación (firma)

Los desarrolladores siempre deben firmar las aplicaciones con su clave / certificado privado (contenido en un archivo .keystore) antes de que la aplicación se pueda instalar en los dispositivos del usuario. El certificado de firma debe ser coherente durante toda la vida útil de la aplicación y, por lo general, tiene una fecha de caducidad de 25 años.

La firma de la aplicación se romperá si el .apk se modifica de alguna manera; las aplicaciones sin firmar normalmente no se pueden instalar. Podemos imaginar a un atacante eliminando el código de verificación de licencia para habilitar las funciones completas de la aplicación sin pagar, por ejemplo. Un ejemplo más peligroso sería alterar el .apk para incluir malware en una aplicación legítima para recopilar datos confidenciales del usuario. Para que se instale el .apk alterado, el atacante debe renunciar.

nuevo PiracyChecker (esto)

.enableSigningCertificate (“478yYkKAQF + KST8y4ATKvHkYibo =”) // La firma APK original para la versión PRODUCTION

.comienzo();

¡¡TEN CUIDADO!! La firma de su aplicación se puede recuperar utilizando un método PiracyCheckerUtils. Asegúrese de haber firmado su APK utilizando su almacén de claves de PRODUCCIÓN (no utilizando el DEBUG) e instalado la versión que planea distribuir. Luego copie la firma devuelta por este método en la consola y péguela en .enableSigningCertificate ('YOUR_APK_SIGNATURE')

// Este método imprimirá la firma de su aplicación en la consola

Log.e ('FIRMA', PiracyCheckerUtils.getAPKSignature (esto));

Verificar el instalador

Si solo planea distribuir la aplicación en una tienda en particular, esta técnica impedirá instalar la aplicación en cualquier otra tienda.

Tiendas compatibles: Google Play, Amazon App Store y Samsung Galaxy Apps.

nuevo PiracyChecker (esto)

.enableInstallerId (InstallerID.GOOGLE_PLAY)

.enableInstallerId (InstallerID.AMAZON_APP_STORE)

.enableInstallerId (InstallerID.GALAXY_APPS)

.comienzo();

¡¡TEN CUIDADO!! Esta es una técnica realmente restrictiva, ya que evitará que su aplicación se instale en otro mercado o instale directamente el .apk en el dispositivo. No se recomienda para la mayoría de los casos.

Verificar el uso de aplicaciones piratas

Si desea verificar si el usuario tiene aplicaciones piratas instaladas, puede usar este código.

Buscará: Lucky Patcher, Uret Patcher, Freedom y CreeHack.

nuevo PiracyChecker (esto)

.enableUnauthorizedAppsCheck ()

.comienzo();

Puede bloquear la aplicación incluso cuando esta aplicación pirata se haya desinstalado. Esto evita que la aplicación sea parcheada y luego desinstale la aplicación pirata para continuar usando su aplicación. La biblioteca guardará un valor SharedPreference para saber cuándo se ha detectado una aplicación pirata.

Hay dos maneras de hacer esto:

Defina SharedPreferences y el nombre de la preferencia donde desea guardar el resultado.

nuevo PiracyChecker (esto)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled (preferencias, 'app_unauthorized') // Cambie 'app_unauthorized' con su propio valor

.comienzo();

Defina el nombre SharedPreferences y el nombre de la preferencia donde desea guardar el resultado.

nuevo PiracyChecker (esto)

.enableUnauthorizedAppsCheck ()

.blockIfUnauthorizedAppUninstalled ('license_preferences', 'app_unauthorized') // Cambie 'license_preferences' y 'app_unauthorized' con su propio valor

.comienzo();

Verificar el uso de aplicaciones de tiendas de terceros

Si desea verificar si el usuario tiene instaladas aplicaciones de tiendas de terceros, puede usar este código.

Verificará: Aptoide, BlackMart, Mobogenie, 1Mobile, GetApk, GetJar, SlideMe y ACMarket.

nuevo PiracyChecker (esto)

.enableStoresCheck ()

.comienzo();

Verifique si la aplicación es una compilación de depuración

Si su aplicación se ejecuta en un emulador fuera del proceso de desarrollo, da una indicación de que alguien más que usted está tratando de analizar la aplicación.

nuevo PiracyChecker (esto)

.enableDebugCheck ()

.comienzo();

Verifique si la aplicación se está ejecutando en un emulador

Fuera del desarrollo, es poco probable que su aplicación deba ejecutarse en un emulador, y se desaconseja la publicación de aplicaciones con depurable habilitado, ya que permite que las computadoras conectadas accedan y depuren la aplicación a través de Android Debug Bridge.

booleano profundo = falso;

nuevo PiracyChecker (esto)

.enableEmulatorCheck (profundo)

.comienzo();

Nota: el booleano profundo hace que la biblioteca realice comprobaciones adicionales para detectar si el dispositivo es un emulador o no. Podría provocar algunos fallos extraños, así que sea prudente al usarlo.

Guarde el resultado de la verificación de la licencia en SharedPreferences

Guardar el resultado de la verificación de la licencia es útil para verificar el estado de la licencia sin llamar a .start () varias veces.

Hay dos maneras de hacer esto:

Defina SharedPreferences y el nombre de la preferencia donde desea guardar el resultado.

nuevo PiracyChecker (esto)

.saveResultToSharedPreferences (preferencias, 'valid_license') // Cambie 'valid_license' con su propio valor

.comienzo();

Defina el nombre SharedPreferences y el nombre de la preferencia donde desea guardar el resultado.

nuevo PiracyChecker (esto)

.saveResultToSharedPreferences ('license_preferences', 'valid_license') // Cambie 'license_preferences' y 'valid_license' con su propio valor

.comienzo();

Personalizaciones

Mostrar resultados en un diálogo o una nueva actividad

Se recomienda mostrar una nueva actividad en lugar de un cuadro de diálogo cuando la licencia no sea válida. De esta forma te aseguras de que la actividad principal de la aplicación esté terminada.

De forma predeterminada, se mostrará un cuadro de diálogo no cancelable.

nuevo PiracyChecker (esto)

.display (Pantalla.ACTIVIDAD)

.comienzo();

De forma predeterminada, la actividad mostrada utilizará los colores de la biblioteca. Para aplicar un color oscuro primario y primario personalizado, y para definir si la actividad debe mostrar una barra de estado normal o clara, use:

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

También puede definir un xml de diseño personalizado para el contenido de esta actividad, utilizando:

.withActivityLayout (R.layout.my_custom_layout)

Usar devoluciones de llamada personalizadas

Agregar una devolución de llamada al constructor le permite personalizar lo que sucederá cuando se haya verificado la licencia y administrar los errores de verificación de licencia si el usuario no tiene permiso para usar la aplicación. Tenga en cuenta que al utilizar este método debe tener en cuenta el bloqueo de la aplicación de usuarios no autorizados .

De forma predeterminada, la biblioteca mostrará un cuadro de diálogo no cancelable si el usuario no puede usar la aplicación; de lo contrario, no pasará nada.

Utilice el constructor y agregue lo siguiente:

.callback (nuevo PiracyCheckerCallback () {

@Anular

public void allow () {

// Haga algo cuando el usuario tenga permiso para usar la aplicación

}

@Anular

public void dontAllow (error @NonNull PiracyCheckerError, aplicación @Nullable PirateApp) {

// Puede hacer algo específico cuando el usuario no tiene permiso para usar la aplicación

// O gestione el error, utilizando el parámetro 'error', usted mismo (compruebe los errores en {@link PiracyCheckerError}).

// Además, si habilitó la verificación de aplicaciones piratas y / o tiendas de terceros, el parámetro 'aplicación'

// es la aplicación que se ha detectado en el dispositivo. La aplicación puede ser nula y, cuando es nula, significa que no se encontró ninguna aplicación o tienda pirata.

// o desactivó la verificación de esas aplicaciones.

// Esto le permite informar a los usuarios de las posibles razones por las que la licencia no es válida.

}

@Anular

public void onError (@NonNull PiracyCheckerError error) {

// No es necesario implementar / anular este método, pero ...

// Puede hacer algo específico cuando se produce un error al verificar la licencia,

// O gestione el error, utilizando el parámetro 'error', usted mismo (compruebe los errores en {@link PiracyCheckerError}).

}

})

6 minutos de lectura