Verifica che un APK sia stato creato da un determinato codice sorgente


10

Per la stessa app, ho:

  • un APK da un app store,
  • quello che si dice essere il codice sorgente per la stessa versione. Con uno script e una struttura del solito Gradle build.

Voglio verificare se l'APK è stato davvero creato da quel codice sorgente o meno.
Come controllarlo?

Appunti:

  • L'APK non è offuscato.
  • Non ho motivo di fidarmi della firma di nessuno. Mi fido solo del codice sorgente.
  • Ho già creato l'app per me stesso, ma ora voglio sapere se l'APK era OK o meno.
  • Preferibilmente con gli strumenti da riga di comando di Linux, ma qualsiasi strumento è OK.

2
Non l'ho provato, ma dovresti essere in grado di utilizzare Apktool per questo scopo: retroingegnerizzare entrambi i .apkfile, quindi eseguire un diff rispetto alle directory risultanti. L'unica differenza quindi dovrebbe essere la firma (che non può corrispondere per ovvi motivi). Pensandoci: semplicemente decomprimere i .apkfile e fare un diff binario dovrebbe fare lo stesso. Entrambi ovviamente richiederebbero di usare le stesse versioni della libreria ecc. Quando si compila in primo luogo :)
Izzy

@Izzy: " stesse versioni di librerie ": la versione API è scritta nella versione manifest e librerie nello script Gradle, quindi quella parte dovrebbe essere OK, immagino. Un elenco di file / cartelle che può essere ignorato sarebbe un'ottima risposta (bonus per le righe di comando effettive).
Nicolas Raoul,

1
Potrei farlo se fossi sul mio computer a casa, cosa che attualmente non sono. Ma per essere una "risposta onorevole", dovrei prima provarlo io stesso :) Nel caso in cui lo dimentico (e nessuno lo ha fatto prima di me), sentiti libero di inviarmi un altro ping (ad esempio in chat) 8..10h :)
Izzy

@Izzy Il diffmetodo sembra pulito ... ma cosa succede se i ragazzi di app store offuscano l'APK durante la compilazione?
Grimoire,

IMHO è qui che entra in gioco Apktool. Hai controllato il link? Dai un'occhiata anche a LibRadar che lo utilizza. AFAIR aiuta a de-offuscare (qualcosa deve o LibRadar farebbe fatica a rilevare quelle librerie).
Izzy

Risposte:


2

Puoi farlo solo con build riproducibili:

"Una build è riproducibile se viene fornito lo stesso codice sorgente, l'ambiente di build e le istruzioni di build, qualsiasi parte può ricreare copie identiche bit per bit di tutti gli artefatti specificati."

Pertanto, lo sviluppatore dell'app o l'app store deve essere integrato affinché funzioni.
Altrimenti la tua unica opzione è costruirla tu stesso.

Un esempio di uno sviluppatore che attualmente fa questo è Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds


Molto interessante! Quindi, sei sicuro che il confronto non possa essere fatto senza che lo sviluppatore sia a bordo? Sfortunatamente (ma comprensibilmente) la maggior parte delle app open source non usano Docker o simili per build, sono solo costruite su qualunque sistema il manutentore esegua.
Nicolas Raoul,

Non deve essere lo sviluppatore, basta che chi compila l'app dalla fonte renda possibile ricreare esattamente l'ambiente di compilazione. Le dipendenze possono essere un dolore enorme quando si impostano questi tipi di build.
Dev

"ricrea esattamente il loro ambiente di costruzione": è possibile indovinarlo? Ad esempio, se per qualche motivo la creazione su Mac o Linux produce un APK diverso, posso indovinare se l'APK dell'app store è stato creato su Mac o Linux?
Nicolas Raoul,

Non è possibile indovinare e ottenere risultati significativi. Alla fine questo sarà più facile da implementare e vedrai sempre più progetti open source farlo.
Dev

1

Una cosa grandiosa di java e APK è che puoi decompilare completamente l'APK in codice sorgente java.

Tuttavia, il codice sorgente risultante non è garantito per essere identico.

Un buon modo per provare ad abbinare il codice sorgente risultante con una revisione nota è verificare quali modifiche sono state apportate direttamente prima e dopo il commit noto nel repository e vedere se tali modifiche sono presenti anche nella fonte decompilata.

Per decompilare, utilizzare dex2jar e JD-Gui .

modifica Ho appena notato che volevi strumenti Linux. La mia unica esperienza è con Windows, ma sono sicuro che esistono strumenti simili per Linux.


Se ho capito bene, il tuo metodo è verificare quale fosse l'ultima modifica nel repository del codice sorgente, quindi decompilare l'APK e verificare manualmente se anche l'ultima modifica si trova anche nel codice decompilato, giusto? Approccio interessante, ma ciò non mi dirà se un annuncio call-home o incorporato è stato aggiunto alla versione APK, giusto?
Nicolas Raoul,

1
Questo è un approccio che ho usato in ufficio per cercare di abbinare un APK sconosciuto a una revisione del codice sorgente, che è stato abbastanza buono se sai che puoi fidarti degli sviluppatori. Ma come dici tu, probabilmente è ancora possibile per una festa inaffidabile intrufolarsi in qualcosa. Spero che qualcuno fornirà una risposta più definitiva, sarebbe utile anche per me.
Mark Ch

Che ne dici di compilare tu stesso il sorgente nell'APK, quindi decompilarlo nuovamente nel codice sorgente e confrontarlo con il sorgente decompilato dal Play Store APK? Qualcuno ha provato questo?
Sergiy Belozorov,

1
@SergiyBelozorov scusami non posso rispondere, non lavoro più con Android, ma sembra un'ottima idea.
Mark Ch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.