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 guión y estructura de construcción de Gradle bastante habitual.
Quiero verificar si el APK realmente se creó a partir de ese código fuente o no.
¿Cómo verificar eso?
Notas:
- El APK no está ofuscado.
- No tengo motivos para confiar en la firma de nadie. Solo confío en el código fuente.
- Ya construí la aplicación para mí, 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.
.apk
archivos, luego ejecute un diff contra los directorios resultantes. La única diferencia debería ser la firma (que no puede coincidir por razones obvias). Pensando en ello: simplemente descomprimir los.apk
archivos y hacer una diferencia binaria debería hacer lo mismo. Por supuesto, ambos requerirían haber usado las mismas versiones de biblioteca, etc. al compilar en primer lugar :)diff
método parece ordenado ... pero ¿qué pasa si los chicos de la tienda de aplicaciones ofuscaron el APK mientras lo compilaban?Respuestas:
Solo puede hacer esto con compilaciones reproducibles:
Por lo tanto, el desarrollador de la aplicación o la tienda de aplicaciones deben estar a bordo para que funcione.
De lo contrario, su única opción es construirlo usted mismo.
Un ejemplo de un desarrollador que actualmente hace esto es Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds
fuente
Una gran cosa acerca de Java y APK es que puedes descompilar completamente el código fuente de APK a Java.
Sin embargo, no se garantiza que el código fuente resultante sea idéntico.
Una buena forma de intentar hacer coincidir el código fuente resultante con una revisión conocida es verificar qué modificaciones se realizaron directamente antes y después de la confirmación conocida en el repositorio, y ver si esas modificaciones también están presentes en la fuente descompilada.
Para descompilar, use 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.
fuente