
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