
O framework de instrumentação binária Redexer para bytecode Dalvik
Redexer é uma ferramenta de reengenharia que manipula binários de aplicativos Android. Essa ferramenta é capaz de analisar um arquivo DEX em uma estrutura de dados na memória; inferir com quais parâmetros o aplicativo usa certas permissões (nomeamos esse recurso de RefineDroid); modificar e desanalisar essa estrutura de dados para produzir um arquivo DEX de saída (nomeamos esses recursos de Dr. Android, que significa Dalvik Rewriting for Android).
Esta ferramenta é testada sob OCaml 4.09.0 e Ruby 1.8.6(7), então você precisa instalá-los (ou versões superiores).
Para manipular uma assinatura SHA-1 (hash) no formato DEX, utilizamos a biblioteca OCaml SHA via ocamlfind/findlib, um gerenciador de bibliotecas OCaml. A maneira mais fácil de instalar ambos é usando OPAM, um gerenciador de pacotes OCaml, que possui ambos os pacotes---OPAM ocamlfind e OPAM sha.
Você também pode compilar e/ou instalar ambos os pacotes diretamente. Se estiver usando uma máquina Linux, pode encontrar facilmente as distribuições.
Caso contrário, por exemplo, usando um Mac, você precisa compilá-los por conta própria.
Você pode encontrar os códigos-fonte originais aqui.
Compile executando make, e vincule o diretório resultante ao diretório raiz site-lib do ocamlfind; ou sudo make install.
Se estiver usando um PC, você precisa instalar ocamlfind/findlib e FlexDLL primeiro. Certifique-se de que suas variáveis de ambiente estejam configuradas corretamente da seguinte forma:
OCAMLLIB=C:\OCaml\lib
CAML_LD_LIBRARY_PATH=%OCAMLLIB%\stublibs
FLEXLINKFLAGS=-L%MinGW%\lib -L%MinGW%\lib\gcc\mingw32\N.N.N
Pacotes OPAM:
Android SDK (ou fontes)
Para desempacotar e reempacotar arquivos apk, usamos apktool, uma ferramenta de reengenharia APK de código aberto.
Como ele usa aapt, Android Asset Packaging Tool,
você precisa instalar o Android SDK ou as fontes. Além disso, usamos
zipalign, que também vem do Android SDK, para otimizar aplicativos reescritos.
Você pode definir caminhos para as ferramentas base do Android adicionando o seguinte ao seu perfil:
ANDROID_HOME=$HOME/android-sdk # seu próprio caminho aqui!
export ANDROID_HOME
PATH=$PATH:$ANDROID_HOME/tools
PATH=$PATH:$ANDROID_HOME/platform-tools
PATH=$PATH:$ANDROID_HOME/build-tools/19.0.0 # número da versão instalada
export PATH
Os scripts principais são escritos em Ruby e requerem RubyGems, um gerenciador de pacotes Ruby, e Nokogiri, uma biblioteca XML para manipular arquivos de manifesto.
Se você quiser ver gráficos (ex: grafo de chamadas, grafo de fluxo de controle, árvore de dominância, etc.), você precisa instalar graphviz dot.
Para compilar o redexer, basta make! Você pode ver o binário redexer no nível superior.
$ make (clean)
Antes de usar a ferramenta, cabe ao usuário instalar o arquivo de plataforma mais recente para o apktool. Por exemplo, você precisa fazer
$ java -jar tools/apktool.jar if [arquivo de plataforma adequado]
Você também pode gerar documentos de API em formato html.
$ make api
Você pode ver todas as opções que a ferramenta oferece:
$ ruby scripts/cmd.rb -h
$ ruby scripts/cmd.rb --help
Assim como o dexdump no Android SDK, o redexer permite visualizar o conteúdo interno do arquivo dex fornecido em formato YAML.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd unparse [--to blah.yml]
Esta opção despeja instruções para um método especificado.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dump_method --mtd cls.mtd
Este recurso serve para testar os módulos de análise e despejo do redexer. Ele provavelmente gera um arquivo dex idêntico.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd id [--to blah.dex]
Você também pode ver estatísticas básicas sobre o arquivo dex, por exemplo, # instr.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd info
Esta opção imprime todos os nomes de classes definidos no arquivo dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes
Pode ser útil para pesquisar bibliotecas de terceiros específicas, por exemplo,
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes | egrep 'apache'
Esta opção imprime o uso da API no arquivo dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api [--sdk android.]
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api --sdk com.facebook.
Você não tem curiosidade sobre como alguns opcodes são raramente usados em bytecodes Dalvik? Ele mostrará o histograma de todos os opcodes, ou você pode consultar com que frequência um opcode exato é usado no aplicativo fornecido.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd opstat [--op opcode1,opcode2,...]
Por exemplo,
$ 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
Esta opção realiza análise de resolução de Intent baseada em propagação, e imprime as transições entre classes Activity.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd intent
Esta opção gera um arquivo pdf que descreve um grafo de chamadas do arquivo fornecido. Se você não especificar o nome do pdf, cg.pdf será usado.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cg [--to blah.pdf] [--no-pdf]
Esta opção gera um arquivo pdf que mostra um grafo de fluxo de controle do método fornecido. Acrescente um nome de método a um nome de classe com ponto: class_name.method_name
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cfg --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Esta opção é semelhante ao recurso acima, exceto que descreve a árvore de dominância (post).
$ ruby scripts/cmd.rb target.(apk|dex) --cmd (p)dom --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Esta opção realiza uma análise clássica de fluxo de dados reverso.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd live --mtd cls.mtd
Esta opção realiza uma análise clássica de fluxo de dados direto.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd const --mtd cls.mtd
Esta opção realiza uma análise clássica de fluxo de dados direto.