11 votos

Verificar que se ha creado un APK a partir del código fuente dado

Para la misma aplicación, tengo:

  • un APK de una tienda de aplicaciones,
  • lo que se afirma que es el código fuente de la misma versión. Con un script de construcción Gradle y estructura bastante habitual.

Quiero verificar si el APK fue realmente construido a partir de ese código fuente o no.
¿Cómo puedo verificar eso?

Notas:

  • El APK no está obfuscado.
  • No tengo motivo para confiar en la firma de nadie. Solo confío en el código fuente.
  • Ya construí la aplicación para mí mismo, pero ahora quiero saber si el APK estaba bien o no.
  • Preferiblemente con herramientas de línea de comandos de Linux, pero cualquier herramienta está bien.

2 votos

No he probado eso, pero deberías poder usar Apktool para este propósito: Ingeniería inversa de ambos archivos .apk, luego ejecutar una diferencia contra los directorios resultantes. La única diferencia entonces debería ser la firma (que no puede coincidir por razones obvias). Pensándolo bien: simplemente descomprimir los archivos .apk y hacer una diferencia binaria debería hacer lo mismo. Ambos requerirían, por supuesto, haber usado las mismas versiones de biblioteca, etc. al compilar en primer lugar :)

0 votos

@Izzy: "mismas versiones de bibliotecas": La versión de la API está escrita en el manifiesto y las versiones de las bibliotecas en el script Gradle, así que esa parte debería estar bien, supongo. Una lista de archivos/carpetas que se pueden ignorar haría que esa sea una gran respuesta (bono por las líneas de comando reales).

1 votos

Podría hacer eso si estuviera en mi computadora en casa, lo cual no es el caso actualmente. Pero para que sea una "respuesta honrosa", necesitaría probarlo por mí mismo primero :) En caso de que me olvide (y nadie más lo haya hecho antes que yo), siéntete libre de enviarme otro ping (por ejemplo, en el chat) en unas 8..10 horas :)

2voto

andDevW Puntos 91

Solo puedes hacer esto con compilaciones reproducibles:

"Una compilación es reproducible si dado el mismo código fuente, entorno de compilación e instrucciones de compilación, cualquier parte puede recrear copias idénticas de bits de todos los artefactos especificados."

Entonces el desarrollador de la aplicación o la tienda de aplicaciones necesita estar a bordo para que funcione.
De lo contrario, tu única opción es compilarlo tú mismo.

Un ejemplo de un desarrollador que actualmente hace esto es Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds

0 votos

¡Muy interesante! Entonces, ¿estás seguro de que la comparación no se puede hacer sin la participación del desarrollador? Desafortunadamente (pero comprensiblemente) la mayoría de las aplicaciones de código abierto no utilizan Docker ni similares para las compilaciones, solo se construyen en el sistema en el que el mantenedor trabaja.

0 votos

No tiene por qué ser el desarrollador, simplemente con tal de que la persona que construye la aplicación a partir del código fuente haga posible recrear exactamente su entorno de construcción. Las dependencias pueden resultar muy problemáticas al configurar este tipo de construcciones.

0 votos

"recrear su entorno de compilación exactamente": ¿Es posible adivinar? Por ejemplo, si por alguna razón la compilación en Mac o Linux produce un APK diferente, ¿puedo adivinar si el APK de la tienda de aplicaciones se ha construido en Mac o Linux?

1voto

Mark Ch Puntos 136

Una gran cosa sobre Java y APKs es que puedes descompilar completamente el APK a código fuente de Java.

Sin embargo, el código fuente resultante no está garantizado de ser idéntico.

Una buena forma de intentar hacer coincidir el código fuente resultante con una revisión conocida es verificar qué modificaciones se hicieron justo antes y después del commit conocido en el repositorio, y ver si esas modificaciones también están presentes en el código fuente descompilado.

Para descompilar, utiliza dex2jar y JD-Gui.

editar Acabo de notar que querías herramientas de Linux. Mi única experiencia es con Windows, pero estoy seguro de que existen herramientas similares para Linux.

0 votos

Si entiendo correctamente, tu método es revisar cuál fue el último cambio en el repositorio del código fuente, luego descompilar el APK y verificar manualmente si el último cambio también se encuentra en el código descompilado, ¿verdad? Un enfoque interesante, pero eso no me dirá si se ha agregado una llamada a casa o un anuncio incrustado a la versión del APK, ¿cierto?

1 votos

Esta es un enfoque que he utilizado en la oficina para intentar relacionar un APK desconocido con una revisión de origen, lo cual ha sido suficiente si sabes que puedes confiar en los desarrolladores. Pero como dices, probablemente aún sea posible que una parte no confiable introduzca algo. Estoy esperando que alguien proporcione una respuesta más definitiva, también sería útil para mí.

0 votos

¿Qué tal compilar el origen en el APK tu mismo, luego descompilarlo de nuevo en código fuente y compararlo con el código fuente descompilado del APK de la Play Store? ¿Alguien ha intentado esto?

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X