Stellen Sie sicher, dass eine APK aus dem angegebenen Quellcode erstellt wurde


10

Für die gleiche App habe ich:

  • eine APK aus einem App Store,
  • Was soll der Quellcode für die gleiche Version sein. Mit einem ziemlich üblichen Gradle-Build-Skript und einer Struktur.

Ich möchte überprüfen, ob die APK wirklich aus diesem Quellcode erstellt wurde oder nicht.
Wie überprüfe ich das?

Anmerkungen:

  • Die APK ist nicht verschleiert.
  • Ich habe keinen Grund, jemandes Unterschrift zu vertrauen. Ich vertraue nur dem Quellcode.
  • Ich habe die App bereits für mich selbst erstellt, aber jetzt möchte ich wissen, ob die APK in Ordnung war oder nicht.
  • Am besten mit Linux-Befehlszeilentools, aber jedes Tool ist in Ordnung.

2
Ich habe das nicht versucht, aber Sie sollten Apktool für diesen Zweck verwenden können: Reverse Engineering beider .apkDateien, dann führen Sie einen Diff für die resultierenden Verzeichnisse aus. Einziger Unterschied sollte dann die Signatur sein (die aus offensichtlichen Gründen nicht übereinstimmen kann). Denken Sie darüber nach: Das einfache Entpacken der .apkDateien und das Ausführen eines binären Diff sollten dasselbe tun. Beide würden natürlich erfordern, dass sie beim Kompilieren die gleichen Bibliotheksversionen usw. verwendet haben :)
Izzy

@Izzy: " gleiche Bibliotheksversionen ": Die API-Version ist im Manifest und die Bibliotheksversion im Gradle-Skript geschrieben, daher sollte dieser Teil in Ordnung sein, denke ich. Eine Liste von Dateien / Ordnern, die ignoriert werden können, wäre eine gute Antwort (Bonus für die eigentlichen Befehlszeilen).
Nicolas Raoul

1
Ich könnte das tun, wenn ich zu Hause an meinem Computer wäre, was ich derzeit nicht bin. Aber damit das eine "ehrenwerte Antwort" ist, müsste ich es zuerst selbst ausprobieren :) Falls ich es vergesse (und niemand anderes es vor mir getan hat), zögern Sie nicht, mir einen weiteren Ping (z. B. im Chat) zu senden 8..10h :)
Izzy

@Izzy Die diffMethode scheint ordentlich zu sein ... aber was ist, wenn die Leute vom App Store die APK beim Kompilieren verschleiert haben?
Grimoire

IMHO kommt hier Apktool ins Spiel. Hast du den Link überprüft? Schauen Sie sich auch LibRadar an, das dies verwendet. AFAIR hilft es bei der Verschleierung (etwas muss, oder LibRadar würde es schwer haben, diese Bibliotheken zu erkennen).
Izzy

Antworten:


2

Sie können dies nur mit reproduzierbaren Builds tun :

"Ein Build ist reproduzierbar, wenn bei gleichem Quellcode, derselben Build-Umgebung und denselben Build-Anweisungen jede Partei nach und nach identische Kopien aller angegebenen Artefakte erstellen kann."

Der App-Entwickler oder der App Store muss also an Bord sein, damit es funktioniert.
Andernfalls können Sie es nur selbst erstellen.

Ein Beispiel für einen Entwickler, der dies derzeit tut, ist Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds


Sehr interessant! Sind Sie sicher, dass ein Vergleich nicht möglich ist, ohne dass der Entwickler an Bord ist? Leider (aber verständlicherweise) verwenden die meisten Open Source-Apps Docker oder ähnliches nicht für Builds. Sie basieren lediglich auf dem System, das der Betreuer gerade ausführt.
Nicolas Raoul

Muss nicht der Entwickler sein, solange derjenige, der die App aus dem Quellcode erstellt, es ermöglicht, seine Build-Umgebung genau neu zu erstellen. Abhängigkeiten können beim Einrichten dieser Art von Builds sehr schmerzhaft sein.
andDevW

"Erstellen Sie ihre Build-Umgebung genau neu": Ist es möglich zu raten? Wenn zum Beispiel aus irgendeinem Grund das Erstellen auf Mac oder Linux eine andere APK erzeugt, kann ich dann erraten, ob die APK des App Stores auf Mac oder Linux erstellt wurde?
Nicolas Raoul

Es ist nicht möglich, aussagekräftige Ergebnisse zu erraten und zu erzielen. Letztendlich wird dies einfacher zu implementieren sein und Sie werden immer mehr Open Source-Projekte sehen, die dies tun.
andDevW

1

Eine großartige Sache bei Java und APKs ist, dass Sie die APK vollständig in Java-Quellcode dekompilieren können.

Der resultierende Quellcode ist jedoch nicht garantiert identisch.

Eine gute Möglichkeit, den resultierenden Quellcode mit einer bekannten Revision abzugleichen, besteht darin, zu überprüfen, welche Änderungen direkt vor und nach dem bekannten Commit im Repository vorgenommen wurden, und festzustellen, ob diese Änderungen auch in der dekompilierten Quelle vorhanden sind.

Verwenden Sie zum Dekompilieren dex2jar und JD-Gui .

bearbeiten Ich habe gerade bemerkt, dass Sie Linux-Tools wollten. Meine einzige Erfahrung ist mit Windows, aber ich bin sicher, dass es ähnliche Tools für Linux gibt.


Wenn ich das richtig verstehe, besteht Ihre Methode darin, die letzte Änderung im Repository des Quellcodes zu überprüfen, dann die APK zu dekompilieren und manuell zu überprüfen, ob die letzte Änderung auch im dekompilierten Code gefunden wird, oder? Interessanter Ansatz, aber das sagt mir nicht, ob der APK-Version eine Call-Home- oder eingebettete Anzeige hinzugefügt wurde, oder?
Nicolas Raoul

1
Dies ist ein Ansatz, den ich im Büro verwendet habe, um zu versuchen, eine unbekannte APK mit einer Quellrevision abzugleichen. Dies war gut genug, wenn Sie wissen, dass Sie den Entwicklern vertrauen können. Aber wie Sie sagen, ist es wahrscheinlich immer noch möglich, dass sich eine nicht vertrauenswürdige Partei einschleicht. Ich hoffe, dass jemand eine endgültigere Antwort gibt, was auch für mich nützlich wäre.
Mark Ch

Wie wäre es, wenn Sie die Quelle selbst in die APK kompilieren, sie dann wieder in den Quellcode dekompilieren und diese mit der dekompilierten Quelle aus der Play Store APK vergleichen? Hat jemand das versucht?
Sergiy Belozorov

1
@SergiyBelozorov Entschuldigung, ich kann das nicht beantworten, ich arbeite nicht mehr wirklich mit Android, aber es klingt nach einer sehr guten Idee.
Mark Ch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.