¿Cómo puedo evitar la ingeniería inversa de un archivo APK de Android?

Seguridad de código de Android

No hay forma de proporcionar una seguridad del 100% de una aplicación de Android. Si alguien se compromete a ingresar el código de su aplicación, lo hará. La única forma de combatirlo es hacerlo sin sentido.

En el caso de una aplicación iOS escrita en Swift, es un proceso difícil y laborioso, debido a su relativa novedad, pero ¿qué pasa con Java? Ha existido durante décadas y hay millones de desarrolladores. Teniendo en cuenta las peculiaridades del sistema operativo Android, así es como puede proteger una aplicación. El código fuente de la aplicación de Android generalmente se escribe en Java, pero no se distribuye en compilaciones como código de bytes de Java, sino que se carga en archivos .dex, que se pueden descompilar en el código fuente de Java. La única medida eficaz que la comunidad parece estar de acuerdo es la ofuscación.

Ofuscación de código de Android

Una de las formas más poderosas para asegurar un APK de Android es usar la ofuscación de código. Esta práctica cambia los nombres y las clases de variables de la aplicación de forma regular para hacer que las cadenas de código sean confusas y rompan las dependencias. Pero es más que eso. La ofuscación de código también reduce el código, oculta algunos de los fragmentos y lo reduce significativamente. Algunas de las herramientas de ofuscación más populares son:

  • Proguard
  • DexProtector

Estas son herramientas sólidas que evitan intrusiones a través de algunos algoritmos criptográficos fuertes, al tiempo que inyectan controles de seguridad en Android APK. La aplicación se puede bloquear una vez que la herramienta se da cuenta de que el código de la aplicación está siendo aprovechado.

Licencias de aplicaciones de Android

Una característica incorporada de las licencias de aplicaciones de Android es un intento de aplicar una política de licencias flexible aplicación por aplicación: cada aplicación puede hacer cumplir las licencias de la manera más adecuada. Otorga algún tipo de control de acceso a su aplicación.

“Cuando una aplicación verifica el estado de la licencia, el servidor de Google Play firma la respuesta del estado de la licencia utilizando un par de claves que está asociado de forma exclusiva con la aplicación. Su aplicación almacena la clave pública en su archivo .apk compilado y la usa para verificar la respuesta del estado de la licencia “.

“Por ejemplo, una aplicación puede verificar el estado de la licencia y luego aplicar restricciones personalizadas que permiten al usuario ejecutarla sin licencia durante un período de validez específico. Una aplicación también puede restringir el uso de la aplicación a un dispositivo específico, además de otras restricciones ”. Esta característica ya se está utilizando para integrar la seguridad y la transparencia en el uso del código de la aplicación del lado del cliente.

Pautas generales de seguridad de aplicaciones en Shakuro

Como puede parecer, el código no es la parte más valiosa de su aplicación, sin duda es el corazón de una aplicación, pero es casi contraintuitivo cuánto se necesita para descompilar el código y construir un clon. En cambio, hay algunos problemas específicos de dispositivos móviles que afectan el activo más valioso que tiene: la información. El objetivo principal del desarrollador es mantener la información segura y privada.

Almacenamiento de datos

Si una aplicación almacena datos de usuario, especialmente credenciales, tokens y claves de acceso, esas cosas deben protegerse mejor que solo Archivo Info.plist . En su lugar, use los servicios de llavero del sistema nativo o las bibliotecas de terceros para un almacenamiento seguro. Además, usar caché y no hacer una copia de seguridad de todos los datos en los servicios en la nube puede ahorrar espacio y evitar que alguien lo analice.

Canales de comunicación seguros

El protocolo HTTP es una aplicación sin cifrar para el método de comunicación del servidor. Los puntos de Wi-Fi públicos a los que se conectan muchos teléfonos a diario pueden ser el medio para ataques de hombre en el medio. Entonces, si se envía algo confidencial o crítico para la seguridad, HTTPS es el canal de comunicación más seguro. Para protocolos de red personalizados, use TLS.

Datos del usuario

A medida que se integran más aplicaciones a nuestras vidas a través de varias funciones útiles, los teléfonos se convierten en los centros principales de información personal y confidencial que debe almacenarse de manera responsable. Si un usuario concede a su aplicación acceso a esa información, no debe duplicarse y almacenarse por separado en algún lugar. Estamos considerando seriamente dónde almacenamos la información y solo utilizamos fuentes no comprometidas.

Consejos específicos para Android

  • Evite Webview debido a las vulnerabilidades de la interfaz Javascript.
  • Evite la redelegación de permisos debido al acceso no autorizado de aplicaciones de terceros.
  • Evite las intenciones debido a los riesgos de ser aprovechado.
  • Evite las inyecciones SQL debido a la introducción inadvertida de vulnerabilidades.

Línea de fondo

Una de las mejores maneras de resistir es hacer que el jugo no valga la pena. El propósito de la piratería de aplicaciones es robar una aplicación y obtener algún tipo de recompensa por ella. Si la importancia de la recompensa no supera el tiempo y el esfuerzo invertidos, los piratas y hackers oportunistas la abandonarán. Al final del día, también son hombres de negocios … poco éticos e ilegales, pero respaldados por una lógica retorcida.

La abrumadora mayoría de los desarrolladores dice que si alguien quiere realizar una ingeniería inversa de una aplicación, lo harán.

Es justo decir que el código fuente no es la razón por la cual los clientes aprecian a los desarrolladores. Sí, es el resultado y el resultado de todo el trabajo duro, pero no es la razón por la que nos pagan. Cuando los clientes contratan un equipo, invierten en la solución de su tarea, que está más allá del código. Deciden contratar un equipo en función de sus habilidades técnicas, su experiencia, su modelo de negocio, etc. Ganamos clientes por la forma en que nos comunicamos y nos esforzamos por comprender sinceramente sus proyectos, y mostramos nuestro compromiso con ellos una vez que comenzamos.

Lanza nuevas versiones a menudo, almacena contenido en la nube y trabaja con tu base de usuarios de pago mediante notificaciones push y contenido enriquecido.

Básicamente, envíe contenido nuevo y actualizaciones a aquellos que son usuarios legítimos.

Use una plataforma BaaS para alojar los paquetes de contenido y administrar el envío.

Algunos ejemplos de código para usted:
http://quickblox.com/developers/
http://quickblox.com/developers/

Para decodificar recursos, puede usar Apktool. Esta herramienta puede decodificar recursos a su forma original y reconstruir APK después de la modificación.

También puede transformar archivos dex a la fuente Smali. Smali es más un lenguaje basado en ensamblajes y no se puede usar para la reconstrucción completa del código Java.

Para descompilar archivos dex en código Java, puede usar una herramienta dex2jar. Convierte dex (bytecode de VM de Android) a jar (bytecode de Java). Luego, para descompilar jar al código fuente de Java, puede usar uno de los descompiladores de Java como jd-gui o JAD.

Sin embargo, esta forma tiene una desventaja: la transformación de dex a jar pierde metadatos importantes que el descompilador podría usar. Existen dos descompiladores de fuente dex a Java: Androguard DAD y JEB.

Para proteger una aplicación de Android de la ingeniería inversa, utilizamos ProGuard. ProGuard es un reductor, optimizador, ofuscador y preverificador de archivos de clase Java.

Además, aprenda más sobre otras formas, herramientas y prácticas eficientes que permiten evitar la ingeniería inversa.

Antes de continuar, responda honestamente las siguientes preguntas:

  1. ¿Qué estás tratando de proteger y por qué?
  2. ¿De quién y de qué lo estás protegiendo?
  3. ¿Qué sucederá tan pronto como se rompa la protección?

Agregar algún tipo de ofuscación al código del cliente solo ralentizará los esfuerzos de ingeniería inversa de un adversario motivado, por ejemplo, por un factor de dos, pero nunca protegerá, por ejemplo, la lógica y las claves / tokens que almacena El código del cliente.

Puede usar ProGuard, que evita que su aplicación tenga ingeniería inversa. ProGuard está integrado en el sistema de compilación de Android, por lo que no tiene que invocarlo manualmente.

La herramienta ProGuard reduce, optimiza y ofusca su código al eliminar el código no utilizado y renombrar clases, campos y métodos con nombres semánticamente oscuros. El resultado es un archivo .apk de menor tamaño que es más difícil de realizar ingeniería inversa.

Como dijo Quora User, y como Microsoft aprendió para su decepción, la única forma de evitar la ingeniería inversa de su aplicación (aparte de demandar, ya que la ingeniería inversa es ilegal) es nunca lanzarla. No importa cuánto lo ofusque, no importa cuánto use nombres genéricos, si alguien quiere pasar el tiempo y el esfuerzo de descompilar su código y descubrir qué hace (para que pueda dar nombres razonables), lo hará. Incluso cosas como ‘eval’ en JavaScript, que durante mucho tiempo se pensó que eran defensas inexpugnables contra la ingeniería inversa, han sido superadas. Recuerde, no puede modificar tanto el código y los recursos que la computadora no pueda reconocerlos, y si la computadora puede reconocerlos, una persona determinada puede usar una computadora para recorrer el código y resolverlo.

Un error común es que, la mayoría de los desarrolladores de Android piensan que incluso los activos se pueden proteger con el protector, pero esto está mal.

La herramienta ProGuard reduce, optimiza y ofusca su código al eliminar el código no utilizado y renombrar clases, campos y métodos con nombres semánticamente oscuros. Una cosa importante es que sus activos no se cifrarán o no podrán protegerse mediante Proguard

Para proteger sus activos, necesita usar otra herramienta llamada “Dexguard”, y ha sido desarrollada por el mismo tipo que desarrolló Proguard.

Dexguard = Proguard + Muchas características adicionales

Algunas de las características de Dexguard, que creo que son realmente interesantes son

  1. DexGuard puede cifrar sus archivos de activos
  2. Dexguard admite “Detección de manipulación”
  3. Puede fortalecer aún más su código, permitiendo que DexGuard inserte reflejos en su código para acceder a API sensibles
  4. El código procesado y los recursos son difíciles de realizar ingeniería inversa, extraer o modificar.
  5. Si ha estado usando ProGuard con éxito, actualizar a DexGuard es fácil

Para obtener más información sobre Dexguard, visite DexGuard | Saikoa
Y para la comparación entre proguard y dexguard, simplemente marque Comparación de ProGuard y DexGuard

PD Lamentablemente, Dexguard no es gratis

Simplemente use ProGuard para su código Java y Uglify para su JavaScript. Esos son fáciles y son básicamente todo lo que puedes hacer de todos modos. Si lo desea, también puede usar HTTPS para todas las comunicaciones con su backend.

¿Te ofuscaste tu código usando proguard? Ayudará hasta cierto punto.

puedes usar DexGuard.
Se paga la versión. Al usar esto, puede asegurar la carpeta de activos.
Sin embargo, a partir de ahora, no puede asegurar sus imágenes, pero los desarrolladores están trabajando en ello. Con suerte, en la próxima versión de dexguard, lo harán tan

Hable con los chicos de Lookout – http://www.mylookout.com

Tienen experiencia en seguridad móvil y podrían ayudar

La naturaleza del cifrado es tal que no hace que nada sea imposible. Simplemente lo hace poco práctico o tan inconveniente como para retirar el beneficio que se obtiene de una acción. Ni siquiera estamos hablando de cifrado aquí. Simplemente el caso de un descompilador.

Hay poco que puedas hacer contra un atacante determinado. El hecho es que no hay forma posible de evitar que un atacante descompile su código. Podrías ofuscarlo, lo que incomodará al atacante pero no lo disuadirá.

Pero debo preguntarle por qué está invirtiendo energías tratando de evitar esto. Si Adobe falló, puede estar seguro de que también lo hará. Lamento ser tan directo. Todas las decisiones deben tener sentido comercial. ¿Qué espera lograr al evitar el abuso de su código? Aumento de las ganancias? Lo dudo. Me parece que esto no tiene nada que ver con los negocios, sino más bien con un programador emocional que se resiente de que alguien obtenga un viaje gratis, no importa que estuvieras conduciendo hacia el norte de todos modos. Podrían haber escrito el código sin ti, sí podrían. No son incompetentes, quizás vagos, pero ciertamente saben lo que están haciendo.

Ignora a estos chicos y concéntrate en crear un gran producto.

La mejor manera es mantener sus cálculos importantes, lógica y algoritmos en su servidor y solicitarlos a través de su aplicación.

En realidad no puedes …
Como las aplicaciones de Android son fácilmente reversibles al código y es la base para que Android sea de código abierto.
lo que puede hacer mejor es hacer que sea más difícil para el adversario aplicar ingeniería inversa a su aplicación al ofuscarla en varios niveles.

Camino de la galleta de Android “Qswim