
Il framework di strumentazione binaria Redexer per il bytecode Dalvik
Redexer è uno strumento di reingegnerizzazione che manipola i binari delle app Android. Questo strumento è in grado di analizzare un file DEX in una struttura dati in memoria; di dedurre con quali parametri l'app utilizza determinati permessi (chiamiamo questa funzionalità RefineDroid); di modificare e de-analizzare quella struttura dati per produrre un file DEX in output (chiamiamo queste funzionalità Dr. Android, che sta per Dalvik Rewriting for Android).
Questo strumento è testato con OCaml 4.09.0 e Ruby 1.8.6(7), quindi è necessario installarli (o versioni successive).
Per manipolare una firma SHA-1 (hash) nel formato DEX, utilizziamo la libreria OCaml SHA tramite ocamlfind/findlib, un gestore di librerie OCaml. Il modo più semplice per installare entrambi è usare OPAM, un gestore di pacchetti OCaml, che ha entrambi i pacchetti: OPAM ocamlfind e OPAM sha.
Puoi anche compilare e/o installare entrambi i pacchetti direttamente. Se utilizzi una macchina Linux, puoi facilmente trovare le distribuzioni.
In caso contrario, ad esempio su Mac, devi compilarli da solo.
Puoi trovare i codici sorgente originali qui.
Compilali eseguendo make, e collega la directory risultante nella directory
root site-lib di ocamlfind; oppure sudo make install.
Se usi un PC, devi installare prima ocamlfind/findlib e FlexDLL. Assicurati che le variabili d'ambiente siano impostate correttamente come segue:
OCAMLLIB=C:\OCaml\lib
CAML_LD_LIBRARY_PATH=%OCAMLLIB%\stublibs
FLEXLINKFLAGS=-L%MinGW%\lib -L%MinGW%\lib\gcc\mingw32\N.N.N
Pacchetti OPAM:
Android SDK (o sorgenti)
Per decomprimere e ricomprimere i file apk, utilizziamo apktool, uno strumento
open source di reingegnerizzazione degli APK. Poiché utilizza aapt, Android Asset Packaging Tool,
è necessario installare Android SDK o i sorgenti. Inoltre, utilizziamo
zipalign, che proviene anch'esso da Android SDK, per ottimizzare le app riscritte.
Puoi impostare i percorsi degli strumenti base di Android aggiungendo quanto segue al tuo profilo:
ANDROID_HOME=$HOME/android-sdk # il tuo percorso personale qui!
export ANDROID_HOME
PATH=$PATH:$ANDROID_HOME/tools
PATH=$PATH:$ANDROID_HOME/platform-tools
PATH=$PATH:$ANDROID_HOME/build-tools/19.0.0 # numero di versione installato
export PATH
Gli script principali sono scritti in Ruby e richiedono RubyGems, un gestore di pacchetti Ruby, e Nokogiri, una libreria XML per manipolare i file manifest.
Se vuoi visualizzare grafici (es. grafico delle chiamate, grafico del flusso di controllo, albero dei dominatori, ecc.), devi installare graphviz dot.
Per compilare redexer, basta make! Puoi vedere il binario redexer al livello superiore.
$ make (clean)
Prima di usare lo strumento, l'installazione del file della piattaforma più recente per apktool è a carico dell'utente. Ad esempio, è necessario eseguire
$ java -jar tools/apktool.jar if [file piattaforma appropriato]
Puoi anche generare documenti API in formato html.
$ make api
Puoi vedere tutte le opzioni fornite dallo strumento:
$ ruby scripts/cmd.rb -h
$ ruby scripts/cmd.rb --help
Come dexdump in Android SDK, redexer ti permette di visualizzare i dettagli interni del file dex fornito in formato YAML.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd unparse [--to blah.yml]
Questa opzione scarica le istruzioni per un metodo specificato.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dump_method --mtd cls.mtd
Questa funzionalità serve per testare i moduli di parsing e dumping di redexer. Probabilmente genera un file dex identico.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd id [--to blah.dex]
Puoi anche vedere statistiche di base sul file dex, ad esempio # instr.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd info
Questa opzione stampa tutti i nomi delle classi definiti nel file dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes
Può essere utile per cercare librerie di terze parti specifiche, ad esempio:
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes | egrep 'apache'
Questa opzione stampa l'utilizzo delle API nel file dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api [--sdk android.]
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api --sdk com.facebook.
Non sei curioso di sapere quanto raramente alcuni opcode vengono usati nei bytecode Dalvik? Mostrerà l'istogramma di tutti gli opcode, oppure puoi cercare quanto spesso l'opcode esatto viene utilizzato nell'app data.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd opstat [--op opcode1,opcode2,...]
Ad esempio:
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat --op div-int/lit16,nop
Questa opzione esegue un'analisi di risoluzione degli Intent basata sulla propagazione, e stampa le transizioni tra le classi Activity.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd intent
Questa opzione genera un file pdf che rappresenta un grafico delle chiamate del file dato. Se non specifichi il nome del pdf, verrà usato cg.pdf.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cg [--to blah.pdf] [--no-pdf]
Questa opzione genera un file pdf che mostra un grafico del flusso di controllo del metodo specificato. Aggiungi un nome di metodo a un nome di classe con un punto: nome_classe.nome_metodo
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cfg --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Questa opzione è simile alla precedente, tranne che rappresenta l'albero dei dominatori (post).
$ ruby scripts/cmd.rb target.(apk|dex) --cmd (p)dom --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Questa opzione esegue una classica analisi del flusso dei dati all'indietro.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd live --mtd cls.mtd
Questa opzione esegue una classica analisi del flusso dei dati in avanti.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd const --mtd cls.mtd
Questa opzione esegue una classica analisi del flusso dei dati in avanti.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd reach --mtd cls.mtd
Questa opzione trova la dipendenza tra classi.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dependants --mtd cls.mtd
Questa opzione stampa il nome dell'activity di avvio dell'apk dato.
$ ruby scripts/cmd.rb target.apk --cmd launcher
Questa opzione ti fa sapere quali componenti sono esposti all'esterno.
$ ruby scripts/cmd.rb target.apk --cmd exported
Queste opzioni stampano i componenti Android di base dichiarati nel manifest.
$ ruby scripts/cmd.rb target.apk --cmd [activity | service | provider | receiver]
Questa opzione esplora le definizioni di layout nelle risorse e stampa le viste personalizzate.
$ ruby scripts/cmd.rb target.apk --cmd custom_views
Questa opzione esplora le definizioni di layout nelle risorse e stampa gli elementi Fragment.
$ ruby scripts/cmd.rb target.apk --cmd fragments
Questa opzione esplora le definizioni di layout nelle risorse e stampa i pulsanti, insieme al loro id (o testo) e al metodo di callback (se presente).
$ ruby scripts/cmd.rb target.apk --cmd buttons
Questa opzione stampa i permessi che l'apk utilizza.
$ ruby scripts/cmd.rb target.apk --cmd permissions
Questa opzione stampa quale versione SDK richiede l'apk.
$ ruby scripts/cmd.rb target.apk --cmd sdk
Se non vuoi decomprimere il file apk, in realtà puoi fare lo stesso con una combinazione di comandi:
$ aapt dump badging target.apk | grep 'targetSdkVersion' | tr -dc 0-9.\\n
Questa opzione genera un file dex che stampa un semplice messaggio. Questo file dex è realizzato solo usando le API di redexer.
$ ruby scripts/cmd.rb --cmd hello
Controlla il suo interno.
$ dexdump -d results/classes.dex
Se sei interessato, puoi testare quel file dex come segue. Presupponendo che il percorso verso ANDROID_SDK sia impostato.
// crea un jar temporaneo adatto per la VM dalvik
$ aapt add temp.jar results/classes.dex
// (opzionale) se non hai creato un avd, crealo.
$ android create avd -n myAVD1 -t android-8
// avvia il tuo emulatore
$ emulator -avd myAVD1 &
// carica il jar temporaneo
$ adb push temp.jar /data
// connettiti alla shell adb
$ adb shell
// finalmente, esegui il dex
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar \
-classpath /data/temp.jar Hello
Hello, DEX
#
Questa è una variante della funzionalità di riscrittura. Usando questa funzionalità, puoi registrare
il comportamento dell'app da punti di vista specifici. Il file dex precompilato
per la libreria di logging è fornito: data/logging.dex. Se vuoi aggiungere
più funzionalità o utilità, compilalo come segue:
$ cd logging
$ gradle copyDex
$ cd ..
Quindi, usa il seguente comando:
$ ruby scripts/cmd.rb target.apk --cmd logging
trim.py può catturare le sequenze di chiamata-ritorno dell'app strumentata. (Devi prima strumentare l'app in test usando redexer.)
Se questi log sono abbastanza brevi, cioè il telefono (o emulatore) può contenere tutte le informazioni in memoria, puoi usare la modalità offline dello script:
$ ./scripts/trim.py -d
Nota che tutti i parametri della riga di comando saranno passati a adb logcat, e
per impostazione predefinita, org.umd.logging:I *:S viene passato per filtrare i log irrilevanti.
Se i log traboccano, dovresti usare la modalità online:
$ ./scripts/trim.py
Lo script intercetta l'interruzione da tastiera, quindi puoi terminare il logging con Ctrl+C.
In entrambe le modalità, i log vengono salvati in log.txt e mostrati a schermo contemporaneamente. Pertanto, dopo aver raccolto i log, potrebbe essere necessario spostare quel file, ad esempio:
$ mv log.txt app.scenario.txt
La funzionalità di logging sopra è generica in quanto puoi specificare cosa registrare
a livello di metodo. (Vedi il modulo logging per maggiori dettagli.)
Tuttavia, a volte è troppo verbosa e può causare un degrado delle prestazioni.
Questa funzionalità è progettata per registrare solo le interazioni utente. Usando questa funzionalità,
puoi catturare solo gli eventi relativi all'interfaccia utente. Allo stesso modo, il file dex precompilato
per la libreria di logging è fornito: data/logging-ui.dex. Se vuoi modificare
la verbosità delle informazioni dell'interfaccia utente, compilalo come segue:
$ cd logging-ui
$ gradle copyDex
$ cd ..
Quindi, usa il seguente comando:
$ ruby scripts/cmd.rb target.apk --cmd logging_ui
La libreria di logging è ereditata dal servizio android a11y, che richiede
il consenso esplicito dell'utente. Pertanto, dopo aver installato l'apk riscritto, vai su
Impostazioni/Accessibilità e attiva il servizio UI Logging.
(Questo passaggio può essere visto come simile all'attivazione della modalità di debug del dispositivo.)
In logcat, i messaggi con tag org.umd.logging_ui.* sono interazioni
tra l'utente e l'app in test.
Questa opzione trova i percorsi di transizione dei componenti verso le chiamate ai metodi target.
$ ruby scripts/cmd.rb target.apk --cmd directed
Puoi specificare i metodi target da invocare in data/directed.txt
Questi percorsi di transizione dei componenti vengono utilizzati per guidare le app al fine di testare le vulnerabilità di sicurezza nelle librerie di terze parti. Maggiori dettagli sono descritti nel seguente articolo:
* Brahmastra: Driving Apps to Test the Security of Third-Party Components.
R. Bhoraskar, et al., In 23rd Usenix Security Symposium (Security '14).
withTimeout.rb può costruire automaticamente un file di salto per un'app. Questo script
esegue cmd.rb con un timeout specifico, usato per limitare il tempo speso
nell'instrumentazione di una singola classe. Questa è una soluzione temporanea per
la classe occasionale che si blocca in un ciclo durante l'instrumentazione. Quando
questo script trova una classe che si blocca, la aggiunge al file di salto e
continua da dove si era interrotto. Una volta che withTimeout è terminato, ci sarà
un file chiamato [nome apk]-skip.txt nella directory data, che
può essere usato per costruire un'app completamente instrumentata per quell'apk. Per usare
withTimeout, basta chiamare
$ ruby scripts/withTimeout.rb TIMEOUT COMANDI
Dove TIMEOUT è la durata del timeout desiderato in secondi (300 è consigliato) e COMANDI sono tutti i normali input della riga di comando che passeresti a scripts/cmd.rb per l'apk.