English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Android 7Análisis del impacto de la nueva firma en el paquete de múltiples canales en .0

Principio de empaquetado de múltiples canales de la firma antigua

Introducción

debido a Android7.0 lanzó un nuevo mecanismo de firma, fortaleció la fortificación de la firma, lo que llevó a que bajo el nuevo mecanismo de firma ya no sea posible continuar creando paquetes de múltiples canales de la manera de Meituan. Sin embargo, en cuanto al nuevo mecanismo de firma y su impacto en el esquema de empaquetado,
Antes de entender el impacto y por qué afecta a nuestro mecanismo de打包 original, necesitamos entender brevemente el principio de打包 y el papel de la firma en todo el proceso de打包.

Flujo de打包 Android

El proceso de打包 Android se ilustra大致如图所示, el proceso completo es integrar el código Java, los archivos de recursos y las bibliotecas de terceros en un archivo Apk, y firmar y alinear optimizadamente el archivo integrado. Todo el proceso puede ser resumido

El proceso se divide en los siguientes pasos:

  1. Precompilación de recursos Generar un ID para cada recurso no assert y guardarlo en un archivo R.
  2. Compilación de archivos Java Compilar los archivos Java escritos manualmente y los archivos Java generados en los pasos anteriores en archivos .class
  3. Generación de archivos Dex Integrar los archivos class generados anteriormente y los archivos class de las bibliotecas de terceros en un archivo .dex, que es equivalente a una tabla de índice de todos los archivos .class, a través de la cual se puede encontrar cada archivo .class
  4. Empaquetado de archivos de recursos Optimizar el tamaño de los recursos y recopilar toda la información de configuración correspondiente a los recursos con ID en el archivo resource.arsc, que es equivalente a una tabla de índice de recursos.
  5. Generación de archivos APK Integrar los archivos .dex generados anteriormente, el archivo resource.arsc y los archivos de recursos (archivos res que contienen algunos archivos compilados en binario como archivos de diseño y algunos archivos no compilados en binario como imágenes) y archivos sin ID asignados (archivos assert) en un archivo APK (un archivo .zip especial).
  6. Firma Firmar el APK generado, agregar una identificación única, para garantizar que pueda instalarse y sobrescribirse normalmente, no sea cubierto maliciosamente, y explicar la procedencia y propietario del APK.
  7. Alineación de procesamiento Ajustar la posición binaria de algunos recursos en el APK para acelerar la velocidad de ejecución del APK.

Los pasos para generar el APK son más o menos así, no necesitamos preocuparnos por los detalles de la implementación, solo con una comprensión general de estos procesos podemos entender el principio de nuestro plan de paquete posterior. Por supuesto, al verlo de esta manera, parece que el APK

Es un archivo muy mágico, que puede ser instalado y ejecutado. De hecho, el APK no es más que un tipo de archivo .zip particular, que puede ser reconocido e instalado por nuestros dispositivos Android como una aplicación. Podemos descomprimir el archivo APK para ver su contenido.


Se puede ver que el contenido del archivo es básicamente el mismo que el que mencionamos anteriormente, ahora veamos la carpeta más importante, que es el archivo en el capítulo tres de la imagen, estos archivos están en META-En la carpeta INF, estos son los archivos que agregamos durante el proceso de firma como identificación única del APK. ¿Qué significado tiene esto para la optimización de paquete? Dejemos este misterio por ahora, y lo discutiremos más tarde. Antes de entender esto, primero debemos aclarar el asunto de la firma.

签名的作用和原理

El papel de la firma


Las aplicaciones pueden agregar algunos de sus propios contenido, como anuncios integrados para obtener ganancias, volver a emitir la aplicación modificada para que los usuarios la instalen, podríamos sufrir pérdidas graves. Por supuesto, este tipo de cosa no ocurrirá, Google agrega un mecanismo de firma único para cada aplicación, como cuando vamos al banco a hacer negocios, no solo hay que proporcionar una identificación, sino también firmar y sellar, el número de identificación se puede ver por todos, pero el firmar y sellar solo puede hacerlo uno mismo, los demás no pueden imitarlo, la aplicación asegura la unicidad y la seguridad a través de este mecanismo. La aplicación Android tiene una identificación única durante el desarrollo, la llamamos nombre del paquete, por ejemplo, el nombre del paquete del gran cliente es com.Quanr, el nombre del paquete es como el número de identificación, está asociado uno a uno con cada persona, al instalar la aplicación, la máquina también reconoce la aplicación a través del nombre del paquete, no puede haber dos aplicaciones con el mismo nombre de paquete en una máquina, esto es la unicidad de la aplicación en la máquina. Cuando actualizamos la aplicación, por ejemplo, la instalación de sobrescritura, se realiza a través del nombre del paquete para identificar y coincidir, de esta manera se garantiza que la aplicación se actualice sin cubrir otras aplicaciones, del mismo modo, otras aplicaciones con nombres de paquete diferentes no pueden cubrir nuestra aplicación. Aunque Android proporciona un mecanismo de identificación de nombres de paquete, ¿suficiente es solo el nombre del paquete? Imagina que alguien usa nuestro nombre de paquete para crear una aplicación nueva que quiera cubrir nuestra aplicación o que los delincuentes rompan nuestra

Entonces, ¿cómo logra la firma estos efectos?

El principio de la firma

Hay varias herramientas para firmar APK, pero los principios son bastante similares, aquí tomamos el ejemplo de la herramienta signapk, para firmar APK solo se necesita usar esta herramienta con algunos parámetros y nuestro archivo de firma único, firmar directamente con la herramienta es muy simple, lo que realmente necesitamos prestar atención es a su principio y cómo se realiza específicamente, de esta manera podemos encontrar el secreto de las打包渠道包. Antes de usar la herramienta de firma, debemos preparar la clave privada y la clave pública que se necesitan para la firma (a-(clave privada)->b-(clave pública)->a, es mejor usar una imagen para mostrarlo), luego usar la herramienta de firma para firmar APK, después del proceso de firma se creará una nueva carpeta META dentro de APK.-Crea una carpeta INF y genera tres archivos dentro, estos tres archivos son la clave de la firma y la base de la verificación.

Como se puede ver en la imagen, los tres archivos son:

  1. MANIFEST.MF
  2. CERT.RSA
  3. CERT.SF

A continuación, hablemos de cómo se generan estos tres archivos.

MANIFEST.MF


Veamos su contenido, podemos ver que hay Name correspondiente a SHA1El valor, es fácil de saber que este archivo guarda un valor único correspondiente a cada archivo. La función del archivo MANIFEST.MF es como se dijo anteriormente, cuando se firma APK, primero se realiza un código numérico para cada archivo, generando un SHA único.1El valor, diferentes contenido de archivos diferentes corresponden a diferentes SHA1El valor también es diferente, por lo que si alguien modifica el contenido del archivo, el valor correspondiente SHA1El valor también cambiará. Al firmar APK, verifique cada uno de sus archivos y genere el SHA correspondiente1Guardamos todo este contenido en un archivo MANIFEST.MF nuevo y colocamos este archivo en el META-En el directorio INF, se completa la generación del primer archivo de firma.

CERT.SF

Después de generar el archivo MANIFEST.MF, podemos registrar el valor único de cada archivo, asegurando que el archivo no se pueda modificar, aunque esto asegura la seguridad de los archivos registrados en MANIFEST, no asegura la seguridad de MANIFEST en sí, otros pueden modificar los archivos originales y generar el SHA correspondiente1Luego, modificar el archivo MANIFEST, por lo que también debemos fortalecer el MANIFEST para garantizar la seguridad. Después de completar la generación del primer archivo, la herramienta de firma comienza a generar el segundo archivo, que es CERT.RSA. En este paso, realizamos una vez más la codificación numérica del archivo generado en el paso anterior y guardamos el resultado en la cabecera del nuevo archivo CERT.RSA, y realizamos una vez más la codificación numérica de cada bloque de atributos del archivo MANIFEST.MF y guardamos en un bloque de atributos del archivo CERT.SF.

CERT.RSA

Estos archivos son binarios, después de generar el archivo CERT.SF, usamos la clave privada para realizar el cálculo de encriptación y obtener la firma, guardamos la firma y la información del certificado público en el CERT.RSA, y el proceso de firma se termina.

A continuación, describamos brevemente los pasos de verificación en el proceso de instalación de Apk, que es similar a los pasos de generación de archivos de firma:

  1. Primero, verificar que la codificación numérica de todos los archivos en Apk coincida con la codificación numérica en MANIFEST.MF
  2. Verificar si la información de firma del archivo CERT.SF y el contenido del CERT.RSA son consistentes
  3. Firmar todo el archivo MANIFEST.MF en el valor de la propiedad de encabezado del archivo CERT.SF y verificar si la firma de cada bloque de atributos del archivo MANIFEST.MF coincide con el archivo CERT.SF

Desde el proceso anterior, se puede descubrir claramente un problema, durante todo el proceso nunca se realiza la codificación numérica de META-Cualquier archivo en INF se realiza la codificación numérica y encriptación, ya que esta carpeta se genera durante la firma, no se realiza la codificación numérica de cualquier archivo en esta carpeta al generar el primer archivo MANIFEST.MF, porque esta carpeta debe estar vacía, el segundo archivo se genera basado en el primer archivo, el tercero se genera basado en el segundo, por lo que durante todo el proceso, esta META-El directorio INF está casi fuera de nuestro control. Podemos agregar algunos archivos para evitar este proceso de firma. Esto es la brecha de acceso al esquema de paquetes de múltiples canales de Meituan.

Meituan completa el empaquetado de múltiples canales aprovechando el principio de firma

A través de la comprensión del proceso de empaquetado anterior, podemos saber que para hacer rápidamente paquetes de múltiples canales, hay que saltar la etapa de empaquetado y encontrar directamente la manera de modificar el archivo Apk, pero esto implica un desafío a las reglas de verificación de firma de Android, pero justo, a través de nuestro análisis del proceso de firma, descubrimos que podemos hacerlo en el archivo META-Añadir archivos al directorio INF para evitar la verificación de las reglas de firma, en este momento, el nuevo esquema está gestando, después de empaquetar un archivo Apk sin canales, copiamos este archivo y en el archivo META-Añadir un archivo al archivo INF, y luego determinar el número de canal mediante el nombre del archivo, diferentes archivos Apk tienen en el archivo META-Añadir diferentes nombres de archivos de canal en el archivo INF, y así determinar diferentes canales, luego lo que hay que hacer es directamente ir a este archivo cuando necesitemos los parámetros de canal, lo que perfectamente salta el proceso de empacado. Entonces, ¿cuánto tiempo lleva este esquema? Solo se basa en la copia y la inserción de un archivo en el archivo Apk, este tipo de acción en una computadora de alta configuración se puede hacer en un minuto900 veces. Por lo tanto, en este momento, hacer un paquete de canal necesita4minuto, hacer100 paquetes de canales también solo toma cuatro minutos y un poco más, por supuesto, esto no es el límite, si hay900 canales, cada paquete de canal necesita900x4minuto, el esquema de Meituan solo necesita5minuto, aumentando la eficiencia en cientos de veces, se puede decir que el esquema de Meituan es muy perfecto bajo la firma antigua.

El impacto del nuevo método de firma en las soluciones existentes

En Android 7Después de .0, Google para aumentar la seguridad de la firma, adoptó nuevas reglas de verificación de firma, no se realiza la codificación numérica para cada archivo, como se muestra en la imagen:

El nuevo método de firma es firmar según la estructura del archivo zip, el archivo Apk en esencia es un archivo .zip, como se muestra en la imagen, antes de ser firmado se puede dividir en tres partes de contenido.

  1. Datos de la entidad del archivo comprimido Contiene los datos específicos de todos los elementos
  2. Datos del directorio central Contiene la posición de desplazamiento relativa de todos los metadatos
  3. Marca de finalización del directorio Contiene la posición de desplazamiento de los datos del directorio y los detalles del registro del directorio relacionados

En la imagen siguiente, la parte azul representa el contenido de las entradas de ZIP, y la parte rosa representa el directorio central.

File Entry representa una entidad de archivo, en un archivo comprimido hay múltiples entidades de archivos.

La entidad de archivo se compone de una cabecera y los datos del archivo (comprimidos, el algoritmo de compresión se describe en la cabecera)}

El Central Directory está compuesto por varios File header, cada uno de los cuales guarda el desplazamiento de una entidad de archivo.

El archivo se termina con una estructura llamada End of central directory.

Vamos a ver el papel del End of Central Directory, que registra la posición de desplazamiento del Central Directory con respecto a la cabecera, y luego veamos nuestros nuevos datos de firma Apk Signing Block, que se colocan entre el Contents of ZIP entries y el Central Directory. Es un conjunto de datos único producido después de codificar y firmar los tres módulos de contenido del archivo ZIP sin firmar. Puede entenderse según el código numérico mencionado anteriormente. Cualquier cambio en estos tres bloques de contenido produce un conjunto de datos diferente. Por lo tanto, no se puede modificar ningún contenido del Apk después de la firma. Sin embargo, también no hemos modificado el contenido fuera de la firma del Apk anteriormente, por lo que en este momento, ¿no podemos considerar modificar este contenido de Apk Signing Block y agregar una pequeña cola al final? Obviamente, este método también no funciona. Se ha dicho anteriormente que hay una parte llamada End of Central Direcotry, que registra la posición de desplazamiento del Central Directory con respecto al inicio del archivo ZIP. Justo antes del Apk Signing Block, si cambia la longitud del Apk Signing Block, cambia la posición de desplazamiento del Central Directory con respecto a la cabecera, y el contenido no coincidirá con el registro en el End of Central Directory. Todo el paquete de Apk se dañará. ¿Puede modificar esta posición de desplazamiento? Obviamente no, después de modificar esta posición de desplazamiento, el Apk Signing Block también cambiará, y solo los desarrolladores que poseen el archivo de firma pueden obtener los datos correctos del Apk Signing Block. Aquellos que deseen manipularlo solo pueden mirar a la distancia. Esto es el principio de funcionamiento del nuevo mecanismo de firma. Bajo este nuevo mecanismo, es posible que nuestra firma antigua deba realizarse una modificación adecuada.

La idea de mejora del plan

Se ha dicho anteriormente, nuestra nueva solución de empaquetado vuelve a estar en aprietos bajo el nuevo mecanismo de firma (por supuesto, si aún utiliza la firma antigua, no es necesario considerar este problema), sin embargo, Google tiene un plan, y nosotros también tenemos una escalera para saltar las murallas~

Se ha dicho anteriormente que hay varias formas de agregar paquetes de canales:

  1. Modificar directamente el código, modificar el código de un paquete de canal una vez y luego empacar
  2. No modificar directamente el código, coloque un parámetro de canal antes de empacar, cambie dinámicamente y empacar después
  3. Modifique los archivos empacados完成后通过跳过签名校验添加渠道号
  4. Ahora, estos tres métodos ya no funcionan, no importa, aún tenemos una cuarta opción.

Se ha analizado anteriormente, si se modifican cualquier módulo de contenido del archivo zip, el bloque de firma de APK cambiará, lo que impedirá que se evite el mecanismo de firma.

Sin embargo, esto no es un problema, el mecanismo de firma es solo para garantizar la seguridad de nuestro Apk, obviamente no queremos modificar maliciosamente la aplicación, somos desarrolladores, tenemos las claves privadas y públicas del archivo de firma, ya que no podemos evitar el mecanismo de firma, simplemente modificamos el paquete Apk y volvemos a firmarlo. Aunque esta eficiencia no es tan alta como evitar el mecanismo de firma, comparada con el proceso de empacado que lleva varios minutos, este tiempo también es aceptable. Generalmente, la firma nueva toma unos tres o cuatro segundos, en comparación con nuestro proceso de empacado de cuatro minutos, obviamente es aceptable y puede continuar siendo utilizado.

Por supuesto, esto es solo una propuesta basada en nuestro mecanismo de firma, antes hemos analizado todo el proceso y mecanismo de empacado y firma, tal vez haya mejores formas de extraerlas, esto requiere que todos trabajemos juntos, analicemos y pensemos cuidadosamente estos procesos y principios, tal vez puedas encontrar mejores soluciones para continuar optimizando nuestra estrategia de empacado~

Resumen

Esto es todo sobre Android7.0 nueva firma afecta a todo el contenido relacionado con el empacado de múltiples canales17238;, espero que el contenido de este artículo pueda proporcionar cierta ayuda a los desarrolladores de Android, si tienen alguna pregunta, pueden dejar comentarios para intercambiar

Declaración: el contenido de este artículo se obtiene de la red, el derecho de autor pertenece al propietario original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano y no asume la responsabilidad de las responsabilidades legales relacionadas. Si encuentra contenido sospechoso de violación de derechos de autor, le invitamos a enviar un correo electrónico a: notice#w para informar, y proporcionar evidencia relevante.3Declaración: el contenido de este artículo se obtiene de la red, el derecho de autor pertenece al propietario original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano y no asume la responsabilidad de las responsabilidades legales relacionadas. Si encuentra contenido sospechoso de violación de derechos de autor, le invitamos a enviar un correo electrónico a: notice#w para informar, y proporcionar evidencia relevante. Una vez que se compruebe, este sitio web eliminará inmediatamente el contenido sospechoso de violación de derechos de autor.

Te gustará