11 votes

Vérifiez qu'un APK a été construit à partir du code source donné

Pour la même application, j'ai:

  • un APK provenant d'un magasin d'applications,
  • ce qui est prétendument le code source de la même version. Avec un script de construction Gradle et une structure assez habituelle.

Je veux vérifier si l'APK a vraiment été construit à partir de ce code source ou non.
Comment vérifier cela?

Remarques:

  • L'APK n'est pas obfusqué.
  • Je n'ai aucune raison de faire confiance à la signature de quelqu'un. Je ne fais confiance qu'au code source.
  • J'ai déjà construit l'application pour moi, mais maintenant je veux savoir si l'APK était correct ou non.
  • De préférence avec des outils en ligne de commande Linux, mais tout outil est acceptable.

2 votes

Je n'ai pas essayé cela, mais vous devriez pouvoir utiliser Apktool à cette fin : Désassemblez deux fichiers .apk, puis exécutez une différence entre les répertoires résultants. La seule différence devrait être la signature (qui ne peut pas correspondre pour des raisons évidentes). En y réfléchissant : simplement dézipper les fichiers .apk et faire une différence binaire devrait faire la même chose. Les deux méthodes nécessiteraient bien sûr d'avoir utilisé les mêmes versions de bibliothèques, etc., lors de la compilation initiale :)

0 votes

@Izzy : "mêmes versions de bibliothèque" : la version de l'API est mentionnée dans le manifeste et les versions des bibliothèques dans le script Gradle, donc cette partie devrait être correcte, je suppose. Une liste de fichiers/dossiers pouvant être ignorés ferait de cela une excellente réponse (bonus pour les lignes de commande réelles).

1 votes

Je pourrais le faire si j'étais sur mon ordinateur à la maison, ce qui n'est pas le cas actuellement. Mais pour que cela soit une "réponse honorable", je devrais d'abord l'essayer moi-même :) Au cas où j'oublierais (et que personne d'autre ne l'ait fait avant moi), n'hésitez pas à me renvoyer un autre ping (par exemple, en discussion) dans environ 8..10h :)

2voto

andDevW Points 596

Vous ne pouvez le faire qu'avec des constructions reproductibles :

"Une construction est reproductible si, étant donné le même code source, l'environnement de construction et les instructions de construction, toute partie peut recréer des copies identiques, bit par bit, de tous les artefacts spécifiés."

Donc, le développeur de l'application ou le magasin d'applications doit être impliqué pour que cela fonctionne.
Sinon, votre seule option est de le construire vous-même.

Un exemple de développeur qui le fait actuellement est Open Whisper Systems : https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds

0 votes

Très intéressant! Alors, êtes-vous sûr que la comparaison ne peut pas être faite sans que le développeur soit impliqué? Malheureusement (mais compréhensible), la plupart des applications open source n'utilisent pas Docker ou des technologies similaires pour les builds, elles sont simplement construites sur le système sur lequel le gestionnaire se trouve.

0 votes

Ne doit pas nécessairement être le développeur, tant que la personne qui construit l'application à partir de la source rend possible de recréer exactement leur environnement de construction. Les dépendances peuvent être très pénibles lors de la configuration de ce type de construction.

0 votes

"recréer leur environnement de construction exactement": Est-il possible de deviner? Par exemple, si pour une raison quelconque, la construction sur Mac ou Linux produit un APK différent, puis-je deviner si l'APK du magasin d'applications a été construit sur Mac ou Linux?

1voto

Mark Ch Points 225

Une grande chose à propos de Java et des APK est que vous pouvez décompiler complètement l'APK en code source Java.

Cependant, le code source résultant n'est pas garanti d'être identique.

Une bonne façon d'essayer de faire correspondre le code source résultant à une révision connue est de vérifier quelles modifications ont été apportées directement avant et après le commit connu dans le référentiel, et de voir si ces modifications sont également présentes dans le code source décompilé.

Pour décompiler, utilisez dex2jar et JD-Gui.

éditer Je viens de remarquer que vous vouliez des outils Linux. Mon expérience est seulement avec Windows, mais je suis sûr que des outils similaires existent pour Linux.

0 votes

Si je comprends bien, votre méthode consiste à vérifier quelle a été la dernière modification dans le référentiel du code source, puis à décompiler l'APK, et à vérifier manuellement si la dernière modification se trouve également dans le code décompilé, n'est-ce pas? Approche intéressante, mais cela ne me dira pas si un appel à domicile ou une publicité intégrée ont été ajoutés à la version de l'APK, n'est-ce pas?

1 votes

Ceci est une approche que j'ai utilisée au bureau pour essayer d'associer un APK inconnu à une révision source, ce qui a été suffisant si vous savez que vous pouvez faire confiance aux développeurs. Mais comme vous le dites, il est probablement encore possible pour une partie peu fiable d'insérer quelque chose. J'espère que quelqu'un fournira une réponse plus définitive, ce serait utile pour moi aussi.

0 votes

Comment compiler vous-même la source en APK, puis la décompiler pour retrouver le code source et le comparer à la source décomplilée de l'APK du Play Store ? Est-ce que quelqu'un a essayé cela ?

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X