
El marco de instrumentación binaria Redexer para bytecode Dalvik
Redexer es una herramienta de reingeniería que manipula binarios de aplicaciones Android. Esta herramienta es capaz de analizar un archivo DEX en una estructura de datos en memoria; inferir con qué parámetros la aplicación usa ciertos permisos (nombramos esta característica RefineDroid); modificar y volcar esa estructura de datos para producir un archivo DEX de salida (nombramos estas características Dr. Android, que significa Dalvik Rewriting for Android).
Esta herramienta está probada bajo OCaml 4.09.0 y Ruby 1.8.6(7), así que necesitas instalarlos (o versiones superiores de ellos).
Para manipular una firma SHA-1 (hash) en el formato DEX, utilizamos la biblioteca OCaml SHA a través de ocamlfind/findlib, un gestor de bibliotecas de OCaml. La forma más fácil de instalar ambos es usando OPAM, un gestor de paquetes de OCaml, que tiene ambos paquetes: OPAM ocamlfind y OPAM sha.
También puedes compilar y/o instalar ambos paquetes directamente. Si usas una máquina Linux, puedes encontrar fácilmente distribuciones.
Si no, por ejemplo, usando una Mac, necesitas compilarlo por ti mismo.
Puedes encontrar los códigos fuente originales aquí.
Compílalo ejecutando make, y enlaza el directorio resultante en el directorio
root site-lib de ocamlfind; o sudo make install.
Si usas un PC, necesitas instalar ocamlfind/findlib y FlexDLL primero. Asegúrate de que tus variables de entorno estén configuradas correctamente de la siguiente manera:
OCAMLLIB=C:\OCaml\lib
CAML_LD_LIBRARY_PATH=%OCAMLLIB%\stublibs
FLEXLINKFLAGS=-L%MinGW%\lib -L%MinGW%\lib\gcc\mingw32\N.N.N
Paquetes OPAM:
Android SDK (o fuentes)
Para desempaquetar y reempaquetar archivos apk, usamos apktool, una herramienta
de reingeniería de APK de código abierto. Como usa aapt, Android Asset Packaging Tool,
necesitas instalar Android SDK o fuentes. Además, usamos
zipalign, que también viene de Android SDK, para optimizar aplicaciones reescritas.
Puedes establecer las rutas a las herramientas base de Android agregando lo siguiente a tu perfil:
ANDROID_HOME=$HOME/android-sdk # tu propia ruta aquí!
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 de versión instalada
export PATH
Los scripts principales están escritos en Ruby y requieren RubyGems, un gestor de paquetes de Ruby, y Nokogiri, una biblioteca XML para manipular archivos de manifiesto.
Si quieres ver gráficos (por ejemplo, grafo de llamadas, grafo de flujo de control, árbol de dominadores, etc.), necesitas instalar graphviz dot.
Para compilar redexer, ¡simplemente make! Puedes ver el binario redexer en el nivel superior.
$ make (clean)
Antes de usar la herramienta, la instalación del archivo de plataforma más reciente para apktool depende del usuario. Por ejemplo, necesitas hacer algo como
$ java -jar tools/apktool.jar if [archivo de plataforma adecuado]
También puedes generar documentos de la API en formato html.
$ make api
Puedes ver todas las opciones que proporciona la herramienta:
$ ruby scripts/cmd.rb -h
$ ruby scripts/cmd.rb --help
Al igual que dexdump en Android SDK, redexer te permite ver el interior del archivo dex dado en formato YAML.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd unparse [--to blah.yml]
Esta opción vuelca instrucciones para un método especificado.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dump_method --mtd cls.mtd
Esta característica sirve para probar los módulos de análisis y volcado de redexer. Probablemente genera un archivo dex idéntico.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd id [--to blah.dex]
También puedes ver estadísticas básicas sobre el archivo dex, por ejemplo, # instr.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd info
Esta opción imprime todos los nombres de clases definidos en el archivo dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes
Puede ser útil para buscar bibliotecas de terceros específicas, por ejemplo,
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes | egrep 'apache'
Esta opción imprime el uso de API en el archivo dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api [--sdk android.]
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api --sdk com.facebook.
¿No tienes curiosidad de cuán raramente se usan algunos opcodes en los bytecodes de Dalvik? Te mostrará el histograma de todos los opcodes, o puedes buscar con qué frecuencia se usa el opcode exacto en la aplicación dada.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd opstat [--op opcode1,opcode2,...]
Por ejemplo,
$ 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 opción realiza un análisis de resolución de intenciones basado en propagación, e imprime las transiciones entre clases Activity.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd intent
Esta opción genera un archivo pdf que representa un grafo de llamadas del archivo dado. Si no especificas el nombre del pdf, se usará cg.pdf.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cg [--to blah.pdf] [--no-pdf]
Esta opción genera un archivo pdf que muestra un grafo de flujo de control del método dado. Agrega un nombre de método a un nombre de clase con punto: nombre_clase.nombre_método
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cfg --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Esta opción es similar a la característica anterior, excepto que representa el árbol de dominadores (post).
$ ruby scripts/cmd.rb target.(apk|dex) --cmd (p)dom --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Esta opción realiza un análisis clásico de flujo de datos hacia atrás.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd live --mtd cls.mtd
Esta opción realiza un análisis clásico de flujo de datos hacia adelante.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd const --mtd cls.mtd