NinjaDroid es una herramienta sencilla para realizar ingeniería inversa de paquetes APK de Android.
$ snap install ninjadroid –channel = beta
visión de conjunto
NinjaDroid usa AXMLParser junto con una serie de scripts de Python basados en aapt
, keytool
, string
y aquellos para extraer una variedad de información de un paquete de APK específico, como:
- Lista de archivos en el APK: nombre de archivo, tamaño, MD5, SHA-1, SHA-256 y SHA-512
AndroidManifest.xml
Información: nombre de la aplicación, nombre del paquete, versión, SDK, autorizaciones, actividades, servicios, destinatarios de la transmisión, …CERT.RSA/DSA
Información sobre el certificado digital: número de serie, vigencia, huella dactilar, emisor y titular- Lista de URL, comandos de shell y otras cadenas genéricas que están codificadas en el
classes.dex
Archivos
Además, NinjaDroid usa apktool y dex2jar para extraer y guardar:
- Archivo de informe JSON que contiene toda la información extraída del APK
AndroidManifest.xml
Archivo (gracias aapktool
)CERT.RSA/DSA
archivo de certificado digitalclasses.dex
Archivos- traducido .Jarra Archivo (gracias a
dex2jar
) - archivos pequeños desmontados (gracias a
apktool
) assets/
yres/
Carpeta junto con su contenido (gracias aapktool
)
El primer paso es clonar el repositorio NinjaDroid o descargar su código fuente.
$ git clon https://github.com/rovellipaolo/NinjaDroid
$ cd NinjaDroid
NinjaDroid puede ejecutarse de varias formas: de forma nativa en su entorno local, en Docker, como Flatpak (experimental) y como Snap (experimental).
Para ejecutar NinjaDroid en su computadora local, debe instalar Python 3.5
o mas alto, Java 8
o superior y binutils
.
Si tiene el SDK de Android instalado localmente, opcionalmente puede descargar la versión del SDK de. usar aapt
en lugar del suministrado. Para hacer esto, necesita el aapt
Situado en ninjadroid/aapt/Aapt.py
(es decir __AAPT_EXEC_PATH = "ninjadroid/aapt/aapt"
).
Simplemente ejecute los comandos a continuación que instalarán todas las dependencias de Python (asegúrese de que aapt
, apktool
y dex2jar
tienen permisos ejecutables) y agregue un archivo. adicional ninjadroid
Enlace simbólico para /usr/local/bin/
.
$ make build-linux
$ hacer instalar
$ ninjadroid – ayuda
Mac OS
Simplemente ejecute los comandos a continuación que instalarán todas las dependencias de Python requeridas (asegúrese de que aapt
, apktool
y dex2jar
tienen permisos ejecutables) y agregue un archivo. adicional ninjadroid
Enlace simbólico a /usr/local/bin/
.
$ make build-macos
$ hacer instalar
$ ninjadroid – ayuda
estibador
Para ejecutar NinjaDroid en Docker, necesitará Docker
Configurar.
Para crear la imagen de Docker, ejecute los siguientes comandos:
Crear $ build-docker
$ docker run –name ninjadroid ninjadroid: ninjadroid más nuevo –help
Tenga en cuenta que debe vincular el directorio con el paquete APK de destino a la imagen de Docker:
$ mkdir apks
$ cp /path/to/your/package.apk apks / package.apk
$ docker run –name ninjadroid -it –rm -v $ (pwd) / apks: / apks ninjadroid: último ninjadroid /apks/package.apk -aj
Y lo mismo se aplica al directorio de salida cuando se usa el -e
/--extract
Opción para la que también necesita otorgar permisos:
$ mkdir salida
$ chmod 777
$ docker run –name ninjadroid –rm -v $ (pwd) / apks: / apks -v $ (pwd) / output: / output ninjadroid: último ninjadroid /apks/package.apk -ae / output
Flatpak (experimental)
Para ejecutar NinjaDroid como Flatpak necesitas Flatpak
y flatpak-builder
Configurar.
Simplemente ejecute los siguientes comandos que instalarán todas las dependencias de Flatpak necesarias:
$ Construir paquete plano
$ flatpak-builder – inicia flatpak / build flatpak / com.github.rovellipaolo.NinjaDroid.yaml ninjadroid –help
NOTA: los -e
/--extract
La opción actualmente no funciona correctamente (consulte: https://github.com/rovellipaolo/NinjaDroid/issues/21).
Para ejecutar NinjaDroid como Snap, necesita Snap
y snapcraft
Configurar.
Simplemente ejecute los siguientes comandos que instalarán todas las dependencias instantáneas requeridas:
Hacer $ build snap
$ make install-snap
$ ninjadroid – ayuda
NOTA: los -e
/--extract
La opción no funcionará correctamente si el complemento se instala sin el --devmode
(ver: https://github.com/rovellipaolo/NinjaDroid/issues/20).
Estilo de cuadros
Una vez que lo haya configurado (consulte el «Instalación» Sección), también puede ejecutar el estilo de verificación NinjaDroid de la siguiente manera.
Para ejecutar Checkstyle en su computadora local, inicie el siguiente comando:
Hacer $ Checkstyle
NOTA: Eso es con pylint
bajo el capó.
También puede ejecutar automáticamente el estilo de verificación en cada confirmación de Git ejecutando el siguiente comando:
$ make install-githooks
estibador
Para ejecutar el estilo de verificación en Docker, inicie el siguiente comando:
Hacer $ checkstyle-docker
Pruebas
Una vez que lo haya configurado (consulte el «Instalación» Sección), también puede ejecutar pruebas de NinjaDroid de la siguiente manera.
Para ejecutar pruebas unitarias y de regresión en su computadora local, ejecute los siguientes comandos:
hacer $ prueba
$ Ir hacia atrás
También puede ejecutar las pruebas con cobertura ejecutando el siguiente comando:
$ Crear cobertura de prueba
estibador
Para ejecutar pruebas unitarias y de regresión en Docker, inicie los siguientes comandos:
Hacer $ test-docker
Hacer $ regression-docker
Flatpak
Para ejecutar pruebas de regresión en Flatpak, ejecute el siguiente comando:
Hacer $ regression-flatpak
Quebrar
Para ejecutar pruebas de regresión en Snap, ejecute el siguiente comando:
Hacer $ regresión instantánea
propósito de uso
Los siguientes son ejemplos de ejecución de NinjaDroid con el paquete APK de muestra.
$ ninjadroid regression / data / Example.apk
Archivo: regression / data / Example.apk
Tamaño: 70058
md5: c9504f487c8b51412ba4980bfe3cc15d
sha1: 482a28812495b996a92191fbb3be1376193ca59b
sha256: 8773441a656b60c5e18481fd5ba9c1bf350d98789b975987cb3b2b57ee44ee51
sha512: 559eab9840ff2f8507842605e60bb0730442ddf9ee7ca4ab4f386f715c1a4707766065d6f0b977816886692bf88b400643979e2fd13e6999358a21cabdfb3071
Nombre: ejemplo
Certificado:
Archivo: META-INF / CERT.RSA
Tamaño: 906
md5: 860e19fa47d37d9510f1245c511a8578
sha1: 59a04084c0d5ef23fd05f0f429dab6267ccb3d0b
sha256: 0efa622919417adfa6eb77770fd33d3bcd93265ac7343695e246dab1a7b6bfee
sha512: 2a5befcc0bcb14e44d7b7cb4322a76933ad3e90e5e1ffbb87ba31ee7cc0172725dcc98e9d414fb3a207bc107b2a7ca7563b5f954cac641d77e4726 .c70a95a95abd3 .c70a95abd3 .c70a95abd3 .c70a95abd3 .c70a95abd3.
Manifiesto:
Archivo: AndroidManifest.xml
Tamaño: 6544
md5: 1f97f7e7ca62f39f8f81d79b1b540c37
sha1: 011316a011e5b8738c12c662cb0b0a6ffe04ca74
sha256: 7c8011a46191ecb368bf2e0104049abeb98bae8a7b1fa3328ff050aed85b1347
sha512: 8c7c1ede610f9c6613418b46a52a196ad6d5e8cc067c2f26b931738ad8087f998d9ea95e80ec4352c95fbdbb93a4f29c646973535068a3a3d584da95480ab45f
Paquete: com.example.app
Ejecución:
Codigo: 1
Nombre: 1.0
SDK:
min: 10
Objetivo: 20
máx: 20
Autorizaciones:
– android.permission.INTERNET
– android.permission.READ_EXTERNAL_STORAGE
– android.permission.RECEIVE_BOOT_COMPLETED
– android.permission.WRITE_EXTERNAL_STORAGE
dex:
Archivo: klassen.dex
Tamaño: 2132
md5: 7bc52ece5249ccd2d72c4360f9be2ca5
sha1: 89476799bf92798047ca026c922a5bc33983b008
sha256: 3f543c68c4c059548cec619a68f329010d797e5e4c00aa46cd34c0d19cabe056
sha512: 0725f961bc1bac47eb8dd045c2f0a0cf5475fd77089af7ddc3098e341a95d8b5624969b6fa47606a05d5a6adf9d74d0c52562ea41a376bd3d7d0a22 .3695ca .3695ca .3695ca.
Mostrar información ampliada del APK en formato JSON
$ ninjadroid regression / data / Example.apk –todos –json
{
«cert»:
«Archivo»: «META-INF / CERT.RSA»,
«Huella dactilar»:
«Md5»: «»,
«Sha1»: «5A: C0: 6C: 32: 63: 7F: 5D: BE: CA: F9: 38: 38: 4C: FA: FF: ED: 20: 52: 43: B6»,
«Sha256»: «E5: 15: CC: BC: 5E: BF: B2: 9D: A6: 13: 03: 63: CF: 19: 33: FA: CE: AF: DC: ED: 5D: 2F: F5 : 98: 7C: CE: 37: 13: 64: 4A: CF: 77 «,
«Firma»: «SHA1mitRSA»,
«Versión»: «3»
,
«Expositores»:
«Ciudad Ciudad»,
«País»: «XX»,
«Dominio»: «»,
«Correo electrónico»: «»,
«Nombre nombre»,
«Organización»: «Organización»,
«Estado»: «Estado»,
«Unidad»: «Unidad»
,
«Md5»: «860e19fa47d37d9510f1245c511a8578»,
«Dueño»:
«Ciudad Ciudad»,
«País»: «XX»,
«Dominio»: «»,
«Correo electrónico»: «»,
«Nombre nombre»,
«Organización»: «Organización»,
«Estado»: «Estado»,
«Unidad»: «Unidad»
,
«Número de serie»: «558e7595»,
«Sha1»: «59a04084c0d5ef23fd05f0f429dab6267ccb3d0b»,
«Sha256»: «0efa622919417adfa6eb77770fd33d3bcd93265ac7343695e246dab1a7b6bfee»,
«Sha512»: «2a5befcc0bcb14e44d7b7cb4322a76933ad3e90e5e1ffbb87ba31ee7cc0172725dcc98e9d414fb3a207bc107b2a7ca7563b5f954cac6bd41d77e4726c7095
«Tamaño»: 906,
«Validez»:
«De»: «2015-06-27 10: 06: 13Z»,
«Para»: «2515-02-26 10: 06: 13Z»
,
«dex»: [
“file”: “classes.dex”,
“md5”: “7bc52ece5249ccd2d72c4360f9be2ca5”,
“sha1”: “89476799bf92798047ca026c922a5bc33983b008”,
“sha256”: “3f543c68c4c059548cec619a68f329010d797e5e4c00aa46cd34c0d19cabe056”,
“sha512”: “0725f961bc1bac47eb8dd045c2f0a0cf5475fd77089af7ddc3098e341a95d8b5624969b6fa47606a05d5a6adf9d74d0c52562ea41a376bd3d7d0aa3695ca2e22”,
“shell_commands”: [
“set”
],
«Tamaño»: 2132,
«Instrumentos de cuerda»: [
“!Lcom/example/app/ExampleService2;”,
“!Lcom/example/app/ExampleService3;”,
“#Landroid/content/BroadcastReceiver;”,
“)Lcom/example/app/ExampleBrodcastReceiver;”,
“Lcom/example/app/ExampleBrodcastReceiver2;”, “Lcom/example/app/ExampleBrodcastReceiver3;”,
“*Lcom/example/app/ExampleBrodcastReceiver4;”,
“”,
“Landroid/app/Activity;”,
“Landroid/app/Service;”,
“Landroid/content/Context;”,
“Landroid/content/Intent;”,
“Landroid/os/Bundle;”,
“Landroid/os/IBinder;”,
“Lcom/example/app/ExampleService;”,
“Lcom/example/app/HomeActivity;”,
“Lcom/example/app/OtherActivity;”,
“onBind”,
“onCreate”,
“onReceive”,
“setContentView”
],
«URL»: []
],
«Archivo»: «Regresión / Daten / Example.apk»,
«Manifiesto»:
«Ocupaciones»: [
“intent-filter”: [
“action”: [
“android.intent.action.MAIN”
],
«Categoría»: [
“android.intent.category.LAUNCHER”
]
],
«Modo de inicio»: «1»,
«Nombre»: «com.example.app.HomeActivity»
,
«Filtro de intención»: [
“action”: [
“android.intent.action.VIEW”
],
«Categoría»: [
“android.intent.category.DEFAULT”
],
«Datos»: [
“scheme”: “content”
,
“scheme”: “file”
,
“mimeType”: “application/vnd.android.package-archive”
]
],
«Modo de inicio»: «1»,
«Metadatos»: [
“name”: “android.support.PARENT_ACTIVITY”,
“value”: “com.example.app.HomeActivity”
],
«Nombre»: «com.example.app.OtherActivity»,
«NoHistory»: «verdadero»,
«ParentActivityName»: «com.example.app.HomeActivity»
],
«Archivo»: «AndroidManifest.xml»,
«Md5»: «1f97f7e7ca62f39f8f81d79b1b540c37»,
«Paquete»: «com.example.app»,
«Autorizaciones»: [
“android.permission.INTERNET”,
“android.permission.READ_EXTERNAL_STORAGE”,
“android.permission.RECEIVE_BOOT_COMPLETED”,
“android.permission.WRITE_EXTERNAL_STORAGE”
],
«Recipiente»: [
“name”: “com.example.app.ExampleBrodcastReceiver”
,
“exported”: false,
“intent-filter”: [
“action”: [
“android.intent.action.BOOT_COMPLETED”,
“android.intent.action.MY_PACKAGE_REPLACED”
],
«Prioridad»: «1000»
],
«Nombre»: «com.example.app.ExampleBrodcastReceiver2»
,
«activado»: verdadero,
«exportado»: incorrecto,
«Filtro de intención»: [
“action”: [
“android.intent.action.BROADCAST_PACKAGE_REMOVED”,
“android.intent.action.PACKAGE_ADDED”,
“android.intent.action.PACKAGE_REPLACED”
],
«Datos»: [
“scheme”: “package”
],
«Prioridad»: «800»
],
«Nombre»: «com.example.app.ExampleBrodcastReceiver3»
,
«activado»: falso,
«exportado»: verdadero,
«Nombre»: «com.example.app.ExampleBrodcastReceiver4»
],
«Sdk»:
«Máx»: «20»,
«Min»: «10»,
«Objetivo»: «20»
,
«Servicios»: [
“name”: “com.example.app.ExampleService”
,
“enabled”: false,
“exported”: true,
“isolatedProcess”: true,
“name”: “com.example.app.ExampleService2”
,
“enabled”: true,
“exported”: false,
“isolatedProcess”: false,
“name”: “com.example.app.ExampleService3”
],
«Sha1»: «011316a011e5b8738c12c662cb0b0a6ffe04ca74»,
«Sha256»: «7c8011a46191ecb368bf2e0104049abeb98bae8a7b1fa3328ff050aed85b1347»,
«Sha512»: «8c7c1ede610f9c6613418b46a52a196ad6d5e8cc067c2f26b931738ad8087f998d9ea95e80ec4352c95fbdbb93a4f29c646973535068a3a3d584da95480ab45f»,
«Tamaño»: 6544,
«Ejecución»:
«Código»: 1,
«Nombre»: «1.0»
,
«Md5»: «c9504f487c8b51412ba4980bfe3cc15d»,
«Nombre»: «Ejemplo»,
«Diverso»: [
“file”: “res/drawable-hdpi-v4/ic_launcher.png”,
“md5”: “e74dbf28ebab4e1b7442a9c78067d1c2”,
“sha1”: “450d3d44325fdf259810a60e6afa36103e186b3d”,
“sha256”: “9b2639dbfdd60e0dab70e572f39660c8dfabd19b7987a7619d770824db342925”,
“sha512”: “44050c4db6d5275b70856050c0d58d3d9892ba09bd8cf1a8343a3c6d4f2e2af6eae1f8b687efb59b7f8122e5bea1a63e08546fee35124cc0faab40ef6274ab4f”,
“size”: 9193
,
“file”: “res/drawable-hdpi-v4/ic_launcher_logo.png”,
“md5”: “e74dbf28ebab4e1b7442a9c78067d1c2”,
“sha1”: “450d3d44325fdf259810a60e6afa36103e186b3d”,
“sha256”: “9b2639dbfdd60e0dab70e572f39660c8dfabd19b7987a7619d770824db342925”,
“sha512”: “44050c4db6d5275b70856050c0d58d3d9892ba09bd8cf1a8343a3c6d4f2e2af6eae1f8b687efb59b7f8122e5bea1a63e08546fee35124cc0faab40ef6274ab4f”,
“size”: 9193
,
“file”: “res/drawable-ldpi-v4/ic_launcher.png”,
“md5”: “58b9a42eeb99fad5321208fe02f24375”,
“sha1”: “09ea65885b4080e515ef7064e816c77991c0757b”,
“sha256”: “c4f061b2c758185371f39afcb166ba039e955d3be2619ab5469a1b873f952d0d”,
“sha512”: “415ed16de6fd335b24bd985d9152323d04fc02287acd3f26fa98722832cfecf89cf2c77ad8ae3f5588acc5cac401129ac3b3d714abbf8dcc492ab2fd98f106e5”,
“size”: 2658
,
“file”: “res/drawable-ldpi-v4/ic_launcher_logo.png”,
“md5”: “58b9a42eeb99fad5321208fe02f24375”,
“sha1”: “09ea65885b4080e515ef7064e816c77991c0757b”,
“sha256”: “c4f061b2c758185371f39afcb166ba039e955d3be2619ab5469a1b873f952d0d”,
“sha512”: “415ed16de6fd335b24bd985d9152323d04fc02287acd3f26fa98722832cfecf89cf2c77ad8ae3f5588acc5cac401129ac3b3d714abbf8dcc492ab2fd98f106e5”,
“size”: 2658
,
“file”: “res/drawable-mdpi-v4/ic_launcher.png”,
“md5”: “acefc1f320111a8d71bcdb8b4aa0656c”,
“sha1”: “23730fd0d5e720d1f719be1afc8c48fa7305da6c”,
“sha256”: “05346d62d4096537906928af523ef9d5997663707a1d48e08f20992584e1424d”,
“sha512”: “59896fc52679e86898dc09b56fb53270d4297c53adee26f864657c5ef4aff9e5f5922dfa9370c3d1748068aa7b1270e0fa8a1323ce3b69c7548a50ca221befc1”,
“size”: 5057
,
“file”: “res/drawable-mdpi-v4/ic_launcher_logo.png”,
“md5”: “acefc1f320111a8d71bcdb8b4aa0656c”,
“sha1”: “23730fd0d5e720d1f719be1afc8c48fa7305da6c”,
“sha256”: “05346d62d4096537906928af523ef9d5997663707a1d48e08f20992584e1424d”,
“sha512”: “59896fc52679e86898dc09b56fb53270d4297c53adee26f864657c5ef4aff9e5f5922dfa9370c3d1748068aa7b1270e0fa8a1323ce3b69c7548a50ca221befc1”,
“size”: 5057
,
“file”: “res/drawable-xhdpi-v4/ic_launcher.png”,
“md5”: “94f5591633218c0b469b65947fd8943b”,
“sha1”: “502cd84fa444f26d7ecfdf4a355064867977f236”,
“sha256”: “29d15992424b40757135f47fc8ddd15e30c7774646b37755608f7cfec1df7d8a”,
“sha512”: “d5b48e065a614c5a2400b6565dc36777d9923d8d5154487113dd1f46b05d36d1db3f28fb72f61a68fcbd225c93495541579574e6611f650fe2857767412c3b1f”,
“size”: 14068
,
“file”: “res/drawable-xhdpi-v4/ic_launcher_logo.png”,
“md5”: “94f5591633218c0b469b65947fd8943b”,
“sha1”: “502cd84fa444f26d7ecfdf4a355064867977f236”,
“sha256”: “29d15992424b40757135f47fc8ddd15e30c7774646b37755608f7cfec1df7d8a”,
“sha512”: “d5b48e065a614c5a2400b6565dc36777d9923d8d5154487113dd1f46b05d36d1db3f28fb72f61a68fcbd225c93495541579574e6611f650fe2857767412c3b1f”,
“size”: 14068
,
“file”: “res/layout/main.xml”,
“md5”: “8cdec0105448937475e45e22c80fd611”,
“sha1”: “51ebf14ed21238f7d147a6744cae18c0f55fcbe6”,
“sha256”: “e74db1ac37395ca9fd25b93261d3ab76ed7dfc9b355ea63d856afc7453313738”,
“sha512”: “2d2147365b8b00f2db7498b7f0ed8a360fc15bd43dfd3704b4b1cb912619d9ff1bc35837eb1e601ea6d1aa3a8c0d555f2105d6ed37de919fa128568527765d63”,
“size”: 552
,
“file”: “resources.arsc”,
“md5”: “2886f2825eef3b5c4478852935c68640”,
“sha1”: “1eff126288b4bea6fa78eb79832d6a7fa098695e”,
“sha256”: “ac46f54fa12dc20e94619465482186047505fb9f27508861220063c93f0c6c4e”,
“sha512”: “da8c41d0c27839ed89cb06a2f89f6993bd88f5179e97f3291f0e17348868b3e9c106e96f482ecd86f11808170937773e7599ccd338900908359e870ea5446169”,
“size”: 1640
,
“file”: “META-INF/MANIFEST.MF”,
“md5”: “6098a6409625f1c0d97cd33c13ad300c”,
“sha1”: “ccfe31190feb259a4a56599ad1403a956f6944b5”,
“sha256”: “8a18f285481346919f4df55f576ee504bf5abecb068a2d642fdef17f3b5cd631”,
“sha512”: “17a68bf605aff149aa31e1b0b81af3d3f74f939e1cb7a10f3eddf84775f901b09ba9722efad1265b0057cdfcd12c6fac701067993081620b00bbfcc4efff3599”,
“size”: 1061
,
“file”: “META-INF/CERT.SF”,
“md5”: “fb02917b68510e413a06e52873802bcd”,
“sha1”: “dfb7bbb487010b980152610fe7d669c1b4f626be”,
“sha256”: “e2fa373f8b065ef7c78387ab9242e98dd19bdeb2b768295506295f7beb0bfe3f”,
“sha512”: “3aa74603588ca5c563b6586d1216dc6cea3b8d2a1a47eb189197e8f20cd7508d3e652c7ff849261e95cff52451476b2993caadf051fdf66cc01f5e6e16b180fc”,
“size”: 1114
],
«Sha1»: «482a28812495b996a92191fbb3be1376193ca59b»,
«Sha256»: «8773441a656b60c5e18481fd5ba9c1bf350d98789b975987cb3b2b57ee44ee51»,
«Sha512»: «559eab9840ff2f8507842605e60bb0730442ddf9ee7ca4ab4f386f715c1a4707766065d6f0b977816886692bf88b400643979e2fd13e6999358a21cabdfb3071»,
«Tamaño»: 70058
}
Extraer y guardar entradas e información de APK
$ ninjadroid regression / data / Example.apk –todos –extraiga la salida /
NinjaDroid: [INFO] Apktool se está ejecutando …
NinjaDroid: [INFO] Problema / pequeño / … crear
NinjaDroid: [INFO] Crear salida / AndroidManifest.xml …
NinjaDroid: [INFO] Salida / resolución /… crear
NinjaDroid: [INFO] Salida / Activos /… crear
NinjaDroid: [INFO] Ejecutando dex2jar …
NinjaDroid: [INFO] Crear salida / Example.jar …
dex2jar regression / data / Example.apk -> Edition / Example.jar
NinjaDroid: [INFO] Se extrae el archivo de certificado …
NinjaDroid: [INFO] Crear salida / META-INF / CERT.RSA …
NinjaDroid: [INFO] Extrayendo archivos DEX …
NinjaDroid: [INFO] Problema / Klassen.dex crear …
NinjaDroid: [INFO] Se genera el archivo de informe JSON …
NinjaDroid: [INFO] Crear salida / informe-Example.json …
NOTA: sin especificar un directorio de salida, se crea uno con el nombre del paquete APK en el directorio de trabajo actual.