android - para - ¿Cómo evitar la ingeniería inversa de un archivo APK?
descargar codigo fuente de aplicaciones para android (30)
¿Cómo puedo proteger todos los recursos, activos y código fuente de la aplicación para que los piratas informáticos no puedan hackear el archivo APK de ninguna manera?
Un archivo APK está protegido con el SHA . Puedes ver algunos archivos en la carpeta META-INF de APK. Si extrae cualquier archivo APK, cambia su contenido y vuelve a comprimirlo y cuando ejecuta ese nuevo archivo APK en una máquina Android, no funcionará, porque los hashes SHA-1 nunca coincidirán.
Estoy desarrollando una aplicación de procesamiento de pagos para Android, y quiero evitar que un pirata informático acceda a cualquier recurso, activo o código fuente del archivo APK .
Si alguien cambia la extensión .apk a .zip, puede descomprimirlo y acceder fácilmente a todos los recursos y recursos de la aplicación, y utilizando dex2jar y un descompilador Java, también puede acceder al código fuente. Es muy fácil aplicar ingeniería inversa a un archivo APK de Android: para obtener más información, consulte la pregunta sobre el desbordamiento de pila Ingeniería inversa de un archivo APK a un proyecto .
He utilizado la herramienta Proguard provista con el SDK de Android. Cuando realizo la ingeniería inversa de un archivo APK generado mediante un almacén de claves firmado y Proguard, me confundo el código.
Sin embargo, los nombres de los componentes de Android permanecen sin cambios y algunos códigos, como los valores clave utilizados en la aplicación, permanecen sin cambios. Según la documentación de Proguard, la herramienta no puede ofuscar los componentes mencionados en el archivo Manifest.
Ahora mis preguntas son:
- ¿Cómo puedo evitar completamente la ingeniería inversa de un APK de Android? es posible?
- ¿Cómo puedo proteger todos los recursos, activos y código fuente de la aplicación para que los piratas informáticos no puedan hackear el archivo APK de ninguna manera?
- ¿Hay alguna manera de hacer que el pirateo sea más difícil o incluso imposible? ¿Qué más puedo hacer para proteger el código fuente en mi archivo APK?
1. ¿Cómo puedo evitar completamente la ingeniería inversa de un APK de Android? es posible?
AFAIK, no hay ningún truco para evitar por completo la ingeniería inversa.
Y también muy bien dicho por @inazaruk: Independientemente de lo que le hagas a tu código, un atacante potencial puede cambiarlo de cualquier forma que él o ella lo encuentre viable . Básicamente no puedes proteger tu aplicación para que no sea modificada. Y cualquier protección que pongas allí puede ser desactivada / eliminada.
2. ¿Cómo puedo proteger todos los recursos, activos y código fuente de la aplicación para que los piratas informáticos no puedan hackear el archivo APK de ninguna manera?
Sin embargo, puedes hacer diferentes trucos para hacer que hackear sea más difícil. Por ejemplo, use ofuscación (si es código Java). Esto generalmente ralentiza significativamente la ingeniería inversa.
3. ¿Hay alguna manera de hacer que el pirateo sea más difícil o incluso imposible? ¿Qué más puedo hacer para proteger el código fuente en mi archivo APK?
Como todos dicen, y como probablemente sepan, no hay seguridad al 100%. Pero el lugar para comenzar para Android, que Google ha incorporado, es ProGuard. Si tiene la opción de incluir bibliotecas compartidas , puede incluir el código necesario en C ++ para verificar el tamaño de los archivos, la integración, etc. por la sugerencia de abajo.
Coloque la biblioteca en la ruta de la biblioteca nativa, que de forma predeterminada es "libs" en la carpeta de su proyecto. Si construiste el código nativo para el objetivo ''armeabi'' entonces ponlo bajo libs / armeabi . Si fue construido con armeabi-v7a , póngalo bajo libs / armeabi-v7a.
<project>/libs/armeabi/libstuff.so
1. ¿Cómo puedo evitar completamente la ingeniería inversa de un APK de Android? es posible?
Imposible
2. ¿Cómo puedo proteger todos los recursos, activos y código fuente de la aplicación para que los piratas informáticos no puedan hackear el archivo APK de ninguna manera?
Imposible
3. ¿Hay alguna manera de hacer que el pirateo sea más difícil o incluso imposible? ¿Qué más puedo hacer para proteger el código fuente en mi archivo APK?
Más difícil, posible, pero en realidad será más difícil principalmente para el usuario promedio, que solo busca en Google las guías de piratería. Si alguien realmente quiere hackear tu aplicación, será hackeada, tarde o temprano.
1. ¿Cómo puedo evitar completamente la ingeniería inversa de un APK de Android? es posible?
Eso es imposible
2. ¿Cómo puedo proteger todos los recursos, activos y código fuente de la aplicación para que los piratas informáticos no puedan hackear el archivo APK de ninguna manera?
Los desarrolladores pueden tomar medidas, como usar herramientas como ProGuard para ofuscar su código, pero hasta ahora, ha sido bastante difícil evitar que alguien descompile una aplicación.
Es una herramienta realmente excelente y puede aumentar la dificultad de "revertir" su código al tiempo que reduce la huella de su código.
Compatibilidad ProGuard integrada: ProGuard ahora está empaquetado con las herramientas SDK. Los desarrolladores ahora pueden ofuscar su código como parte integrante de una versión de lanzamiento.
3. ¿Hay alguna manera de hacer que el pirateo sea más difícil o incluso imposible? ¿Qué más puedo hacer para proteger el código fuente en mi archivo APK?
Mientras investigaba, llegué a conocer HoseDex2Jar . Esta herramienta protegerá su código de la descompilación, pero parece que no es posible proteger su código completamente.
Algunos de los enlaces útiles, puede referirse a ellos.
- Proguard, Android y el servidor de licencias
- Asegurando aplicaciones de Android LVL
- Pregunta de desbordamiento de pila ¿Es realmente imposible proteger las aplicaciones de Android de la ingeniería inversa?
- Pregunta de desbordamiento de pila ¿ Cómo evitar la ingeniería inversa de un archivo APK de Android para proteger el código?
1. ¿Cómo puedo evitar completamente la ingeniería inversa de un APK de Android? es posible?
Esto no es posible
2. ¿Cómo puedo proteger todos los recursos, activos y código fuente de la aplicación para que los piratas informáticos no puedan hackear el archivo APK de ninguna manera?
Cuando alguien cambia una extensión .apk a .zip, luego de descomprimirlo, alguien puede obtener fácilmente todos los recursos (excepto Manifest.xml ), pero con APKtool se puede obtener el contenido real del archivo de manifiesto. De nuevo, un no.
3. ¿Hay alguna manera de hacer que el pirateo sea más difícil o incluso imposible? ¿Qué más puedo hacer para proteger el código fuente en mi archivo APK?
Nuevamente, no, pero puedes prevenir hasta cierto nivel, es decir,
- Descarga un recurso de la web y haz un proceso de encriptación.
- Utilice una biblioteca nativa precompilada (C, C ++, JNI, NDK)
- Realice siempre algún hashing (claves MD5 / SHA o cualquier otra lógica)
Incluso con Smali
, la gente puede jugar con tu código. Con todo, no es POSIBLE.
Primera regla de seguridad de la aplicación: cualquier máquina a la que un atacante obtenga acceso físico o electrónico sin restricciones ahora pertenece a su atacante, independientemente de dónde esté realmente o de lo que haya pagado.
Segunda regla de seguridad de la aplicación: cualquier software que deje los límites físicos dentro de los cuales un atacante no puede penetrar ahora pertenece a su atacante, independientemente de cuánto tiempo haya pasado codificándolo.
Tercera regla: cualquier información que deje esos mismos límites físicos que un atacante no puede penetrar ahora pertenece a su atacante, sin importar cuán valioso sea para usted.
Los fundamentos de la seguridad de la tecnología de la información se basan en estos tres principios fundamentales; la única computadora verdaderamente segura es la que está encerrada en una caja fuerte, dentro de una jaula Farraday, dentro de una jaula de acero. Hay computadoras que pasan la mayor parte de su vida útil en este estado; Una vez al año (o menos), generan las claves privadas para las autoridades de certificación raíz de confianza (frente a una gran cantidad de testigos con cámaras que registran cada centímetro de la habitación en la que se encuentran).
Ahora, la mayoría de las computadoras no se utilizan en este tipo de entornos; Están físicamente al aire libre, conectados a Internet a través de un canal de radio inalámbrico. En resumen, son vulnerables, al igual que su software. Por lo tanto, no son de fiar. Hay ciertas cosas que las computadoras y su software deben saber o hacer para que sean útiles, pero se debe tener cuidado para garantizar que nunca puedan saber o hacer lo suficiente para causar daños (al menos no daños permanentes fuera de los límites de esa única máquina). ).
Usted ya sabía todo esto; Es por eso que estás tratando de proteger el código de tu aplicación. Pero, ahí radica el primer problema; las herramientas de ofuscación pueden hacer que el código sea un desastre para que un humano intente excavar, pero el programa aún tiene que ejecutarse; eso significa que el flujo lógico real de la aplicación y los datos que utiliza no se ven afectados por la ofuscación. Dado un poco de tenacidad, un atacante puede simplemente desenfocar el código, y eso no es necesario en ciertos casos donde lo que está mirando no puede ser otra cosa que lo que está buscando.
En su lugar, debe intentar asegurarse de que un atacante no pueda hacer nada con su código, no importa lo fácil que sea para él obtener una copia clara de él. Eso significa, no secretos ocultos, porque esos secretos no son secretos tan pronto como el código abandona el edificio en el que lo desarrolló.
Estos valores-clave que tiene codificados deben eliminarse por completo del código fuente de la aplicación. En su lugar, deben estar en uno de tres lugares; memoria volátil en el dispositivo, que es más difícil (pero aún no imposible) para que un atacante obtenga una copia fuera de línea; permanentemente en el clúster de servidores, al que controla el acceso con un puño de hierro; o en un segundo almacén de datos no relacionado con su dispositivo o servidores, como una tarjeta física o en la memoria de sus usuarios (lo que significa que eventualmente estará en una memoria volátil, pero no tiene que ser por mucho tiempo).
Considere el siguiente esquema. El usuario ingresa sus credenciales para la aplicación desde la memoria al dispositivo. Desafortunadamente, debe confiar en que el dispositivo del usuario no está comprometido por un registrador de teclas o un troyano; lo mejor que puede hacer al respecto es implementar seguridad multifactorial, recordando información de identificación difícil de falsificar sobre los dispositivos que el usuario ha utilizado (MAC / IP, IMEI, etc.) y proporcionando al menos un canal adicional al que un intento de inicio de sesión en un dispositivo desconocido puede ser verificado.
Las credenciales, una vez ingresadas, están ofuscadas por el software del cliente (usando un hash seguro), y las credenciales de texto sin formato se descartan; Ellos han cumplido su propósito. Las credenciales ofuscadas se envían a través de un canal seguro al servidor autenticado por certificado, que las vuelve a codificar para producir los datos utilizados para verificar la validez del inicio de sesión. De esta manera, el cliente nunca sabe lo que realmente se compara con el valor de la base de datos, el servidor de aplicaciones nunca conoce las credenciales de texto sin formato detrás de lo que recibe para validación, el servidor de datos nunca sabe cómo se producen los datos que almacena para validación, y un hombre el medio solo ve incoherencias incluso si el canal seguro estuviera comprometido.
Una vez verificado, el servidor transmite un token a través del canal. El token solo es útil dentro de la sesión segura, está compuesto por un ruido aleatorio o una copia encriptada (y por lo tanto verificable) de los identificadores de la sesión, y la aplicación cliente debe enviar este token en el mismo canal al servidor como parte de cualquier solicitud hacer algo. La aplicación cliente lo hará muchas veces, porque no puede hacer nada que involucre dinero, datos confidenciales o cualquier otra cosa que pueda ser perjudicial por sí misma; en su lugar, debe pedir al servidor que haga esta tarea. La aplicación cliente nunca escribirá información confidencial en la memoria persistente en el propio dispositivo, al menos no en texto sin formato; el cliente puede pedir al servidor a través del canal seguro una clave simétrica para cifrar cualquier información local, que el servidor recordará; en una sesión posterior, el cliente puede pedirle al servidor la misma clave para descifrar los datos para usarlos en la memoria volátil. Esa información tampoco será la única copia; cualquier cosa que el cliente almacene también debe transmitirse de alguna forma al servidor.
Obviamente, esto hace que su aplicación sea muy dependiente del acceso a Internet; el dispositivo cliente no puede realizar ninguna de sus funciones básicas sin la conexión y la autenticación adecuadas por parte del servidor. No es diferente a Facebook, de verdad.
Ahora, la computadora que el atacante desea es su servidor, ya que no es la aplicación / dispositivo cliente lo que le puede hacer ganar dinero o causarle dolor a otras personas por su disfrute. Está bien; obtienes mucho más por tu dinero gastando dinero y esfuerzo para asegurar el servidor que intentando proteger a todos los clientes. El servidor puede estar detrás de todo tipo de firewalls y otros dispositivos de seguridad electrónica y, además, puede estar asegurado físicamente detrás de acero, concreto, acceso con tarjeta / pin, y video vigilancia las 24 horas. Su atacante tendría que ser muy sofisticado para obtener cualquier tipo de acceso al servidor directamente, y debería (debería) saberlo de inmediato.
Lo mejor que puede hacer un atacante es robar el teléfono y las credenciales de un usuario e iniciar sesión en el servidor con los derechos limitados del cliente. En caso de que esto suceda, al igual que perder una tarjeta de crédito, el usuario legítimo debe recibir instrucciones para llamar al número 800 (preferiblemente fácil de recordar, y no en el reverso de una tarjeta que llevaría en su bolso, billetera o maletín, que podría ser robado junto con el dispositivo móvil) desde cualquier teléfono al que puedan acceder que los conecte directamente a su servicio al cliente. Indican que su teléfono fue robado, proporcionan algún identificador único básico, y la cuenta está bloqueada, todas las transacciones que el atacante pudo haber procesado se retrotraen y el atacante vuelve al punto de partida.
Nada es seguro cuando lo pone en la mano del usuario final, pero algunas prácticas comunes pueden hacer que sea más difícil para el atacante robar datos.
- Ponga su lógica principal (algoritmos) en el lado del servidor.
- Comunicarse con servidor y cliente; asegúrese de que la comunicación entre el servidor y el cliente esté protegida mediante SSL o HTTPS; o utilice otras técnicas de algoritmos de generación de pares de claves (ECC, RSA). Asegúrese de que la información confidencial permanezca cifrada de extremo a extremo.
- Usa sesiones y expíralas después de un intervalo de tiempo específico.
- Cifre los recursos y consígalos del servidor a pedido.
- O puede hacer que la aplicación híbrida acceda al sistema a través del
webview
código de recurso + de protección en el servidor
Múltiples enfoques; Esto es obvio que hay que sacrificar entre rendimiento y seguridad.
AFAIK, no puede proteger los archivos en el directorio / res más de lo que están protegidos en este momento.
Sin embargo, hay pasos que puede tomar para proteger su código fuente, o al menos lo que hace, si no todo.
- Utilice herramientas como ProGuard. Esto confundirá su código y hará que sea más difícil de leer cuando se descompila, si no imposible.
- Mueva las partes más críticas del servicio fuera de la aplicación y colóquelas en un servicio web, oculto detrás de un lenguaje del lado del servidor como PHP. Por ejemplo, si tiene un algoritmo que le ha costado un millón de dólares para escribir. Obviamente no quieres que la gente se la robe de tu aplicación. Mueva el algoritmo y haga que procese los datos en un servidor remoto, y use la aplicación para simplemente proporcionarlos con los datos. O use el NDK para escribirlos de forma nativa en archivos .so, que tienen muchas menos probabilidades de ser descompilados que los apks. No creo que exista un descompilador para los archivos .so a partir de ahora (e incluso si lo hiciera, no sería tan bueno como los descompiladores de Java). Además, como @nikolay se menciona en los comentarios, debe usar SSL al interactuar entre el servidor y el dispositivo.
- Al almacenar valores en el dispositivo, no los almacene en un formato sin procesar. Por ejemplo, si tiene un juego y está almacenando la cantidad de dinero en juego que el usuario tiene en SharedPreferences. Supongamos que son
10000
monedas. En lugar de guardar10000
directamente, guárdelo utilizando un algoritmo como((currency*2)+1)/13
. Entonces, en lugar de10000
, guarda1538.53846154
en las SharedPreferences. Sin embargo, el ejemplo anterior no es perfecto, y tendrá que trabajar para llegar a una ecuación que no pierda dinero por errores de redondeo, etc. - Puedes hacer algo similar para las tareas del lado del servidor. Ahora, por ejemplo, tomemos su aplicación de procesamiento de pagos. Digamos que el usuario tiene que hacer un pago de
$200
. En lugar de enviar un valor bruto de$200
al servidor, envíe una serie de valores más pequeños, predefinidos, que sumen hasta$200
. Por ejemplo, tenga un archivo o tabla en su servidor que iguale palabras con valores. Así que digamos queCharlie
corresponde a$47
, yJohn
a$3
. Entonces, en lugar de enviar$200
, puedes enviar aCharlie
cuatro veces y aJohn
cuatro veces. En el servidor, interpreta lo que significan y súmalo. Esto evita que un pirata informático envíe valores arbitrarios a su servidor, ya que no saben qué palabra corresponde a qué valor. Como medida adicional de seguridad, también podría tener una ecuación similar al punto 3 para esto, y cambiar las palabras clave cadan
días. - Finalmente, puede insertar código fuente aleatorio e inútil en su aplicación, de modo que el pirata informático esté buscando una aguja en un pajar. Inserte clases aleatorias que contengan fragmentos de Internet o solo funciones para calcular cosas aleatorias como la secuencia de Fibonacci. Asegúrese de que estas clases se compilen, pero no son utilizadas por la funcionalidad real de la aplicación. Agregue lo suficiente de estas clases falsas, y al hacker le costaría encontrar su código real.
Con todo, no hay forma de proteger tu aplicación al 100%. Puedes hacerlo más difícil, pero no imposible. Su servidor web podría verse comprometido, el pirata informático podría descubrir sus palabras clave al monitorear los montos de las transacciones y las palabras clave que envía, el pirata informático podría analizar minuciosamente la fuente y descubrir qué código es un dummy.
Solo puedes luchar, pero nunca ganar.
Aquí hay algunos métodos que puedes probar:
- Usa obfuscation y herramientas como ProGuard .
- Encripta alguna parte de la fuente y los datos.
- Use una suma de comprobación incorporada patentada en la aplicación para detectar alteraciones.
- Introduzca el código para evitar cargar en un depurador, es decir, deje que la aplicación tenga la capacidad de detectar al depurador y salir / matar al depurador.
- Separe la autenticación como un servicio en línea.
- Usa la diversidad de aplicaciones
- Utilice la técnica de impresión digital para, por ejemplo, firmas de hardware de los dispositivos de diferentes subsistemas antes de autenticar el dispositivo.
Como alguien que trabajó extensivamente en plataformas de pago, incluida una aplicación de pagos móviles (MyCheck), diría que debe delegar este comportamiento en el servidor, no se debe almacenar ningún nombre de usuario ni contraseña para el procesador de pagos (lo que sea) o Codificado en la aplicación móvil, eso es lo último que desea, porque la fuente se puede entender incluso si se confunde el código.
Además, no debe almacenar tarjetas de crédito ni tokens de pago en la aplicación, todo debe estar, nuevamente, delegado a un servicio que usted construyó, también le permitirá más adelante, ser compatible con PCI más fácilmente y las compañías de tarjetas de crédito ganaron No respire por su cuello (como lo hicieron con nosotros).
En ningún momento de la historia de la informática ha sido posible evitar la ingeniería inversa del software cuando le das una copia de trabajo al atacante. Además, lo más probable es que nunca sea posible .
Con eso entendido, hay una solución obvia: no le des sus secretos a su atacante. Si bien no puedes proteger el contenido de tu APK, lo que puedes proteger es cualquier cosa que no distribuyas. Por lo general, este es un software del lado del servidor que se usa para cosas como la activación, los pagos, la aplicación de reglas y otros bits de código jugosos. Puede proteger activos valiosos al no distribuirlos en su APK. En su lugar, configure un servidor que responda a las solicitudes de su aplicación, "use" los activos (lo que sea que eso pueda significar) y luego envíe el resultado a la aplicación. Si este modelo no funciona para los activos que tiene en mente, entonces puede volver a pensar su estrategia.
Además, si su objetivo principal es prevenir la piratería de aplicaciones : ni siquiera se moleste. Ya ha quemado más tiempo y dinero en este problema del que cualquier medida antipiratería podría esperar salvarle. El retorno de la inversión para resolver este problema es tan bajo que no tiene sentido ni siquiera pensar en ello.
La pregunta principal aquí es si se pueden descompilar los archivos dex y la respuesta es que pueden ser "más o menos". Hay desensambladores como dedexer y smali .
ProGuard, debidamente configurado, ofuscará su código. DexGuard, que es una versión comercial extendida de ProGuard, puede ayudar un poco más. Sin embargo, su código aún se puede convertir en smali y los desarrolladores con experiencia en ingeniería inversa podrán averiguar lo que está haciendo desde smali.
Tal vez elegir una buena licencia y hacerla cumplir por la ley de la mejor manera posible.
Las otras respuestas upvotadas aquí son correctas. Solo quiero dar otra opción.
Para ciertas funciones que considere importantes, puede alojar el control WebView en su aplicación. La funcionalidad sería implementada en su servidor web. Se verá como si se estuviera ejecutando en su aplicación.
Los desarrolladores pueden seguir los siguientes pasos para evitar que un APK se robe de alguna manera,
la forma más básica es usar herramientas como
ProGuard
para ofuscar su código, pero hasta ahora, ha sido bastante difícil evitar que alguien descompile una aplicación por completo.También he oído hablar de una herramienta HoseDex2Jar . Detiene
Dex2Jar
insertando un código inofensivo en un APK de Android que confunde y deshabilitaDex2Jar
y protege el código de la descompilación. De alguna manera podría evitar que los hackers descompongan un APK en un código Java legible.Use alguna aplicación del lado del servidor para comunicarse con la aplicación solo cuando sea necesario. Podría ayudar a prevenir los datos importantes.
En absoluto, no puede proteger completamente su código de los posibles piratas informáticos. De alguna manera, podría hacer que sea una tarea difícil y un poco frustrante para que puedan descompilar su código. Una de las formas más eficientes es escribir en código nativo (C / C ++) y almacenarlo como bibliotecas compiladas.
No es posible evitar el 100% de la ingeniería inversa del APK de Android, pero puede utilizar estas formas para evitar extraer más datos, como el código fuente, los recursos de su APK y los recursos:
Utilice ProGuard para ofuscar el código de la aplicación
Use NDK con C y C ++ para colocar el núcleo de su aplicación y asegurar parte del código en archivos
.so
Para asegurar los recursos, no incluya todos los recursos importantes en la carpeta de activos con APK. Descargue estos recursos al momento de iniciar la aplicación.
Si queremos que la ingeniería inversa (casi) sea imposible, podemos poner la aplicación en un chip altamente resistente a la manipulación, que ejecuta todo lo sensible internamente, y se comunica con algún protocolo para hacer posible el control de la GUI en el host. Incluso los chips resistentes a la manipulación no son 100% a prueba de grietas; simplemente establecen el listón mucho más alto que los métodos de software. Por supuesto, esto es inconveniente: la aplicación requiere una pequeña verruga USB que contiene el chip que se debe insertar en el dispositivo.
La pregunta no revela la motivación para querer proteger esta aplicación tan celosamente.
Si el objetivo es mejorar la seguridad del método de pago ocultando cualquier falla de seguridad que la aplicación pueda tener (conocida o no), está completamente equivocada. De hecho, los bits sensibles a la seguridad deben ser de código abierto, si eso es posible. Debería hacerlo lo más fácil posible para que cualquier investigador de seguridad que revise su aplicación encuentre esos bits y analice su funcionamiento y se comunique con usted. Las aplicaciones de pago no deben contener ningún certificado incorporado. Es decir, no debe haber ninguna aplicación de servidor que confíe en un dispositivo simplemente porque tiene un certificado fijo de la fábrica. Se debe realizar una transacción de pago solo con las credenciales del usuario, utilizando un protocolo de autenticación de extremo a extremo correctamente diseñado que impida confiar en la aplicación, la plataforma, la red, etc.
Si el objetivo es evitar la clonación, a excepción de ese chip a prueba de manipulación indebida, no hay nada que pueda hacer para proteger el programa de ingeniería inversa y copia, de modo que alguien incorpore un método de pago compatible en su propia aplicación. subir a "clientes no autorizados". Hay formas de dificultar el desarrollo de clientes no autorizados. Uno sería crear sumas de comprobación basadas en instantáneas del estado completo del programa: todas las variables de estado, para todo. GUI, lógica, lo que sea. Un programa de clonación no tendrá exactamente el mismo estado interno. Claro, es una máquina de estados que tiene transiciones de estado visibles externamente similares (como pueden observarse mediante entradas y salidas), pero casi no tiene el mismo estado interno. Una aplicación de servidor puede interrogar al programa: ¿cuál es su estado detallado? (es decir, dame una suma de comprobación sobre todas tus variables de estado internas). Esto se puede comparar con el código de cliente ficticio que se ejecuta en el servidor en paralelo, pasando por las transiciones de estado genuinas. Un clon de terceros tendrá que replicar todos los cambios de estado relevantes del programa genuino para dar las respuestas correctas, lo que dificultará su desarrollo.
Su cliente debe contratar a alguien que sepa lo que está haciendo, que puede tomar las decisiones correctas y puede ser su mentor.
Hablar más arriba sobre si tiene alguna capacidad para cambiar el sistema de procesamiento de transacciones en el backend es absurdo: no se le debería permitir hacer tales cambios de arquitectura, así que no espere poder hacerlo.
Mi razonamiento sobre esto:
Dado que su dominio es el procesamiento de pagos, es seguro asumir que PCI DSS y / o DSS de PA (y las posibles leyes estatales / federales) serán importantes para su negocio. Para cumplir, debe demostrar que está seguro. Para sentirse inseguro, descubra (a través de las pruebas) que no está seguro, luego repárelos, vuelva a realizar las pruebas, etc., hasta que la seguridad pueda verificarse en un nivel adecuado = costoso, lento y de alto riesgo. Para hacer lo correcto, piense bien por adelantado, comprometa talento experimentado en el trabajo, desarrolle de manera segura, luego pruebe, repare (menos), etc. (menos) hasta que la seguridad se pueda verificar a un nivel adecuado = barato, rápido, Camino de bajo riesgo al éxito.
APK firma esquema v2 en Android N
La clase PackageManager ahora admite la verificación de aplicaciones usando el esquema de firma APK v2. El esquema de firma APK v2 es un esquema de firma de archivo completo que mejora significativamente la velocidad de verificación y fortalece las garantías de integridad al detectar cambios no autorizados en los archivos APK.
Para mantener la compatibilidad con versiones anteriores, una APK debe firmarse con el esquema de firma v1 (esquema de firma JAR) antes de firmarse con el esquema de firma v2. Con el esquema de firma v2, la verificación falla si firma el APK con un certificado adicional después de firmar con el esquema v2.
El soporte del esquema de firma APK v2 estará disponible más adelante en N Developer Preview.
http://developer.android.com/preview/api-overview.html#apk_signature_v2
Herramienta: el uso de Proguard en su aplicación puede restringirse a la ingeniería inversa de su aplicación
No es posible evitar completamente los RE, pero al hacerlos más complejos internamente, se pone más difícil para los atacantes ver el funcionamiento claro de la aplicación, lo que puede reducir la cantidad de vectores de ataque.
Si la aplicación maneja datos altamente confidenciales, existen varias técnicas que pueden aumentar la complejidad de la ingeniería inversa de su código. Una técnica es usar C / C ++ para limitar la fácil manipulación en tiempo de ejecución por parte del atacante. Existen numerosas bibliotecas de C y C ++ que son muy maduras y fáciles de integrar con las ofertas de Android JNI. Un atacante debe primero evadir las restricciones de depuración para atacar la aplicación en un nivel bajo. Esto añade una mayor complejidad a un ataque. Las aplicaciones de Android deben tener configurado android: debuggable = "false" en el manifiesto de la aplicación para evitar que el atacante o el malware puedan manipularlo fácilmente.
Verificación de seguimiento : una aplicación puede determinar si un depurador u otra herramienta de depuración está realizando un seguimiento actual. Si se está rastreando, la aplicación puede realizar cualquier número de posibles acciones de respuesta de ataque, como descartar claves de cifrado para proteger los datos del usuario, notificar a un administrador del servidor u otro tipo de respuestas en un intento de defenderse. Esto puede determinarse verificando los indicadores de estado del proceso o utilizando otras técnicas como la comparación del valor de retorno de ptrace attach, el proceso principal, la lista negra de depuradores en la lista de procesos o la comparación de marcas de tiempo en diferentes lugares del programa.
Optimizaciones : para ocultar cálculos matemáticos avanzados y otros tipos de lógica compleja, las optimizaciones del compilador pueden ayudar a ofuscar el código objeto para que un atacante no lo pueda desarmar fácilmente, lo que hace que sea más difícil para un atacante comprender el código en particular. En Android, esto se puede lograr más fácilmente utilizando bibliotecas compiladas de forma nativa con el NDK. Además, el uso de un ofuscador LLVM o cualquier SDK protector proporcionará una mejor ofuscación de código de máquina.
Eliminación de archivos binarios : la eliminación de archivos binarios nativos es una forma efectiva de aumentar la cantidad de tiempo y nivel de habilidad que requiere un atacante para ver la composición de las funciones de bajo nivel de la aplicación. Al eliminar un binario, la tabla de símbolos del binario se elimina, por lo que un atacante no puede depurar o aplicar ingeniería inversa a una aplicación. Puede referirse a técnicas utilizadas en sistemas GNU / Linux como sstriping o usar UPX.
Y, por último, debe ser consciente de ofuscación y herramientas como ProGuard.
Sólo una adición a las buenas respuestas anteriores.
Otro truco que conozco es almacenar códigos valiosos como Java Library. Luego configura esa biblioteca para que sea tu proyecto de Android. Sería bueno como archivo .so pero haría Android Lib.
De esta manera, estos valiosos códigos almacenados en la Biblioteca de Android no serán visibles después de la descompilación.
¿No se supone que los chips TPM (Trusted Platform Module) administran el código protegido por usted? Se están volviendo comunes en las PC (especialmente en las de Apple) y es posible que ya existan en los chips para teléfonos inteligentes de hoy. Desafortunadamente no hay una API de sistema operativo para hacer uso de ella todavía. Esperemos que Android agregue soporte para este día. Esa es también la clave para limpiar el contenido DRM (en el que Google está trabajando para WebM).
Básicamente no es posible. Nunca será posible. Sin embargo, hay esperanza. Puedes usar un obfuscation para hacer que algunos ataques comunes sean mucho más difíciles de realizar, incluyendo cosas como:
- Cambiar el nombre de los métodos / clases (así que en el descompilador obtienes tipos como
aa
) - Ocultando el flujo de control (por lo que en el descompilador el código es muy difícil de leer)
- Encriptando cadenas y posiblemente recursos.
Estoy seguro de que hay otros, pero esos son los principales. Trabajo para una empresa llamada PreEmptive Solutions en un ofuscador .NET . También tienen un ofuscador de Java que funciona para Android, así como uno llamado DashO .
Sin embargo, la ofuscación siempre tiene un precio. Cabe destacar que el rendimiento suele ser peor y, por lo general, requiere cierto tiempo adicional para las versiones. Sin embargo, si su propiedad intelectual es extremadamente importante para usted, entonces generalmente vale la pena.
De lo contrario, su única opción es hacer que su aplicación de Android pase a un servidor que aloja toda la lógica real de su aplicación. Esto tiene su propia cuota de problemas, porque significa que los usuarios deben estar conectados a Internet para usar su aplicación.
Además, no es solo Android el que tiene este problema. Es un problema en cada tienda de aplicaciones. Es solo una cuestión de lo difícil que es llegar al archivo del paquete (por ejemplo, no creo que sea muy fácil para iPhones, pero aún es posible).
De acuerdo con @Muhammad Saqib aquí: https://.com/a/46183706/2496464
Y @Mumair da unos buenos pasos iniciales: https://.com/a/35411378/474330
Siempre es seguro asumir que todo lo que distribuye al dispositivo de su usuario, pertenece al usuario. Sencillo y sencillo. Es posible que pueda usar las últimas herramientas y procedimientos para cifrar sus propiedades intelectuales, pero no hay manera de evitar que una persona determinada "estudie" su sistema. E incluso si la tecnología actual puede dificultarles el acceso no deseado, puede haber alguna forma fácil mañana, ¡o incluso la próxima hora!
Así, aquí viene la ecuación:
When it comes to money, we always assume that client is untrusted.
Incluso en una economía tan simple como en el juego. (¡Especialmente en juegos! ¡Hay usuarios más ''sofisticados'' allí y las lagunas se extienden en segundos!)
¿Cómo nos mantenemos seguros?
La mayoría, si no todos, de nuestros sistemas de procesamiento de claves (y la base de datos, por supuesto) ubicados en el lado del servidor. Y entre el cliente y el servidor, se encuentran las comunicaciones cifradas, las validaciones, etc. Esa es la idea de thin client.
No hay forma de evitar completamente la ingeniería inversa de un APK. Para proteger los recursos de la aplicación, los recursos, puede utilizar el cifrado.
- El cifrado hará que sea más difícil de usar sin descifrar. Elegir un algoritmo de cifrado fuerte hará que el craqueo sea más difícil.
- Agregar algún código de suplantación de identidad en su lógica principal para hacer más difícil el descifrado
- Si puede escribir su lógica crítica en cualquier idioma nativo y eso seguramente hará más difícil la descompilación.
- Usando marcos de seguridad de terceros como Quixxi
Puedo ver esa buena respuesta en este hilo. Además puedes usar facebook redex
para optimizar el código. Redex trabaja en el .dex
nivel donde proguard funciona como .class
nivel.
Si bien estoy de acuerdo en que no hay una solución al 100% que proteja su código, la versión 3 de HoseDex2Jar ahora está activada si desea intentarlo.
Si su aplicación es tan sensible, debería considerar la parte de procesamiento de pagos en el lado del servidor. Trate de cambiar sus algoritmos de procesamiento de pagos. Use la aplicación de Android solo para recopilar y mostrar información del usuario (es decir, el saldo de la cuenta) y, en lugar de procesar pagos con códigos Java, envíe esta tarea a su servidor mediante un protocolo SSL seguro con parámetros cifrados. Cree una API totalmente encriptada y segura para comunicarse con su servidor.
Por supuesto, también puede ser pirateado y no tiene nada que ver con la protección de los códigos fuente, pero considera que es otra capa de seguridad para dificultar que los piratas informáticos engañen a su aplicación.
Te sugiero que mires Protect Software Applications from Attacks . Es un servicio comercial, pero la compañía de mi amigo usó esto y están contentos de usarlo.
cuando tienen la aplicación en su teléfono, tienen acceso completo a la memoria de la misma. por lo tanto, si desea evitar que sea pirateado, podría intentar que no pueda obtener la dirección de memoria estática directamente usando un depurador. podrían hacer un desbordamiento de búfer de pila si tienen un lugar para escribir y tienen un límite. así que trate de hacerlo cuando escriban algo, si tienen que tener un límite, si envían más caracteres que límite, si (entrada> límite) entonces ignoren, así que no pueden poner el código de ensamblaje allí.