android - Piratería, piratería, piratería. ¿Que puedo hacer?
piracy (5)
Acabo de lanzar una aplicación, una aplicación de pago, 4 días después, un usuario me dijo que hay otro sitio web en China donde se encuentra mi aplicación. ¡Lo descargué desde allí, y funciona bien en mi dispositivo!
Hay publicaciones aquí que dicen que las personas pueden cambiar el nombre del paquete y volver a publicar una apk. Pero este no es mi caso, la versión crackeada todavía usa el mismo nombre de paquete. Utilicé licencias de venta de Android en el programa, pero la versión crackeada no hace ninguna verificación de licencias. Usé ProGuard para ofuscarlo, pero eso no desanima a los hackers.
Pregunta # 1: Firmé el archivo apk de acuerdo con las instrucciones de Google. Pero aún así, modificaron el código y sacaron la parte de verificación de licencias. ¿Me equivoco al firmar un archivo apk para evitar que las personas manipulen el contenido del archivo?
Pregunta # 2: Para los programas Win32 .exe, solía usar una suma de comprobación para determinar si el archivo ha sido alterado. Así es como funciona: cuando se crea un archivo .exe, usé una herramienta para calcular la suma del contenido de bytes del archivo, luego lo meto en algún lugar del archivo, por ejemplo, 4 bytes después de un patrón de texto "MI FIRMA" . Luego, en tiempo de ejecución, el programa abre el archivo .exe y calcula la suma de bytes, lo compara con el número entero después de la firma.
¿Alguien ha intentado este enfoque en archivos apk? ¿Te importa compartir tus experiencias?
Desvío pasivo / agresivo
Estoy de acuerdo con @metalideath en que ofuscar y prescindir del código de licencia no es infalible.
Aquí hay una técnica fácilmente oculta que yo llamo ''scuttling'' que funciona para las aplicaciones implementadas en Google Y Amazon. Scuttling es la detección de piratería de front-end por la aplicación. Lo que se debe hacer una vez que se detecte está a cargo del creador de la aplicación.
- El hundimiento agresivo: ej. Terminación y / o alarmas en aplicación pirateada. La comunicación en red no es necesariamente requerida.
- Disparo pasivo: sin modificación de la aplicación. P.ej. habilitar el seguimiento.
- Pasivo / agresivo Scuttling: modificación sutil de la aplicación. P.ej. deshabilita silenciosamente las características clave. Haga que los piratas piensen que cometieron errores y que publiquen la aplicación pirateada.
Si su aplicación fue renombrada y / o instalada desde cualquier fuente que no sea Google o Amazon, scuttle () retorna verdadero.
// Dont just copy/paste this code - that is what automated crackers look for - cludge it!
// No network communication is required at runtime.
// myPackageName should decode at runtime to "com.yourpackagename"
// google should decode at runtime to "com.android.vending";
// amazon should decode at runtime to "com.amazon.venezia";
public boolean scuttle(Context context, String myPackageName, String google, String amazon)
{
//Scallywags renamed your app?
if (context.getPackageName().compareTo(myPackageName != 0)
return true; // BOOM!
//Rogues relocated your app?
String installer = context.getPackageManager().getInstallerPackageName(myPackageName);
if (installer == null)
return true; // BOOM!
if (installer.compareTo(google) != 0 && installer.compareTo(amazon) != 0)
return true; // BOOM!
return false;
}
RESULTADOS
La siguiente captura de pantalla se tomó de Google Analytics y se muestra una aplicación gratuita rastreada pirateada desde playstore (com.android.vending) que se redistribuyó con un ataque agresivo (se detectaron y terminaron instalaciones que no son de playstore). Seguimiento de no playstore (no establecido) gotas. No se requirió el seguimiento, pero se habilitó para estas mediciones.
DISCUSIÓN
La firma del servicio de notas desempeña una función en el rastreo: el administrador de paquetes aplica nombres de paquetes únicos con firmas únicas.
Esto presenta la pregunta de qué hacer cuando la aplicación es descartada (pirata detectado por la aplicación). La piratería es una forma de viralización (distribución incontrolada) de su aplicación. Ya es detectable habilitando el back-end de seguimiento de análisis. Scuttling permite que el creador de la aplicación personalice una respuesta de front-end con o sin seguimiento.
El pirateo agresivo es obviamente detectable por los piratas (¡BOOM!). Esto fomenta más grietas. El desplazamiento pasivo es mucho menos obvio, pero puede implicar seguimiento.
La piratería puede no ser prevenible pero es predecible, detectable y rastreable.
El seguimiento puede presentar problemas insuperables para los piratas, pero también presenta sus propios problemas éticos.
La solución pasiva / agresiva que no requiere comunicación de red como se describe anteriormente es quizás la mejor solución. Se oculta fácilmente (a diferencia de las licencias) y se puede adaptar para que sea lo más obvio posible.
En última instancia, la protección incorporada de las aplicaciones en Android es muy pobre. Aquí están sus mejores prácticas.
1) Sí. La recomendación de Google de usar ofuscación de código, código firmado y su servidor de verificación de licencia está diseñado para evitar el robo de software. Su implementación, sin embargo, es altamente defectuosa. El único requisito que tiene que ejecutar un APK es que esté firmado. Aunque no importa quién lo firmó. No hay controles de que su firma sea con la que se firmó. Así que para descifrarlo, simplemente elimine la verificación de la licencia y vuelva a firmar con el certificado que desee. Luego, un usuario puede cargarlo en su teléfono con la opción "Permitir aplicaciones no comerciales" marcada.
No utilice las licencias de Google como es. Modificar el código en gran medida. Agregue algunos nuevos parámetros para usar al generar las claves. Mueve el código alrededor / rediseñalo. No incluya la biblioteca de licencias de Google como un proyecto de biblioteca. Ponlo directamente en tu código. Haz que el código sea lo más fino y torpe posible. Agrega funciones que no hacen nada, pero modifican los valores sobre la marcha. Haz otras funciones más tarde que las convierta de nuevo. Difunda la verificación de la licencia en todo su código base.
Si no haces esos pasos, entonces el código puede ser descifrado automáticamente. Al hacer esos pasos, al menos el cracker necesita tomarse el tiempo para hacerlo. Eso probablemente tomaría solo unas pocas horas como máximo. Sin embargo, unas pocas horas es mucho más tiempo que el de romper instantáneamente la capa estándar de licencias de Google. Existen herramientas de crackers que en realidad solo descargarán automáticamente los paquetes de Android recientemente lanzados y, si usan la licencia estándar de Android, los descifran y cargan los archivos APK agrietados en este tipo de sitios web. Al hacer su implementación, no la implementación de vainilla, hace las cosas mucho más difíciles, con solo unas pocas horas de esfuerzo.
2) Esta es una técnica anti-crack común. Puedes hacer esto en Android si quieres. Pero se puede romper en unos 5 minutos. Si buscas en Google, hay tutoriales sobre cómo resolver esta técnica específica. Básicamente, solo busca la llamada CRC en el código y elimina la verificación después de que el CRC regresa.
Android no tiene seguridad inherente. Puedes rootear cualquier teléfono y descargar el APK. Puede hackear fácilmente una APK para habilitar la depuración y simplemente pasar el código para ver las claves que haya almacenado en el código. Así que al final no pasaría mucho tiempo en esto. Es imposible asegurar una aplicación de Android. Simplemente haría las cosas de sentido común en la lista anterior y seguiría adelante.
3) Si está realmente paranoico, puede implementar su propia licencia en su propio servidor de licencias. Este es el enfoque que tomé, pero no tanto para proteger la aplicación contra el robo, como lo fue para darme un mecanismo para vender aplicaciones directamente desde mi sitio web para que los usuarios que no tienen Google Play puedan comprar mis aplicaciones.
Lo mejor que puedes hacer es no preocuparte por eso. Las personas que lo piratean en China no son sus clientes, y nunca lo serán. Si no hubiera una versión pirata disponible, todavía no te pagarían por una copia, con toda probabilidad. Además, si tu aplicación se vuelve popular, se clonará de todos modos, al igual que las aplicaciones iOS. Los sistemas de seguridad que ya ha implementado son todo lo que necesita, ya que evitan que la mayoría de los usuarios pirateen la aplicación.
Tratar de hacer que su aplicación sea una prueba de piratería solo dañará la base del código y hará que sea más difícil de mantener, así como también introducir problemas para sus clientes genuinos que pagan. En su lugar, céntrese en promocionar su aplicación y facilitar el pago y el uso para los clientes. Al responder a las solicitudes de funciones y los informes de errores, agrega valor que la gente está dispuesta a pagar, en lugar de buscar una copia falsa de un sitio web chino que probablemente sea un troyano.
Finalmente, reporte las copias piratas a los vendedores de antivirus. Suministrar copias de la APK. Agregarán firmas a sus bases de datos para que se marquen como potencialmente peligrosas.
Me puse en contacto con Google y fui dirigido a una charla muy útil sobre cómo modificar la licencia básica LVL. Echa un vistazo a esta charla de Google I / O 2011.
Según entiendo la revisión de los términos del mercado de Google, no puede vender su aplicación directamente desde su propio sitio, ya que viola los términos del mercado de la aplicación de Google. Creo que la implementación de protecciones personalizadas en su código es la mejor manera de hacerlo. Los métodos estándar simplemente no son efectivos ya que el código se puede desarmar fácilmente