Proyecto de ingeniería inversa. Comenzó con la trotadora Bowflex Treadmill 22 pero terminó generalizándose para cualquier máquina con Android vendida por Nautilus Inc. (Nautilus, Bowflex, Schwinn).
Este método depende de que las especificaciones del Bowflex Console sean demasiado lentas para el software de hoy en día (solo tiene 2Gb de RAM en la placa Android). Debido a eso, y si somos más rápidos que la tablet, podemos hacer jailbreak desde el AppMonitorService
de Nautilus.
¿Se podría llamar un ataque de fuerza bruta?
Puedes reiniciar la máquina en cualquier momento del proceso, y todo estará como debería. No hay riesgo en el lado del software por hacerlo. ¡Dale una prueba!
Yo usé un Logitech K600, pero cualquier teclado con esas teclas debería funcionar:
Los teclados Bluetooth parecen no poder emparejarse a través de JRNY.
Primero, vamos a encender la máquina y conectar el teclado USB a la Consola Bowflex. Lo puedes encontrar en el lado derecho:
Asegurémonos de que el teclado funciona presionando el botón “Home” en el teclado. Debería hacer que la app JRNY se reinicie.
Android tiene un atajo para cerrar la app actual a través del botón “Back” si lo mantienes presionado por un segundo o algo así. Juguemos un poco con el botón “Back” - vamos a cerrar continuamente la app JRNY tan pronto como la app se reabra hasta que comience a aparecer un nuevo diálogo:
Ok, ahora la parte divertida: Ese diálogo pertenece al “sistema de verificación de fallos” de Android stock. Acabamos de “forzar a Android a pensar” que NautilusLauncher está mal (¡bien!). Vamos a explotar a través de ese diálogo.
Tan pronto como aparezca, toca en “App info”. Al hacer clic en “App info” vamos a abrir la app de Configuración (que está en la lista de denegados de AppMonitorService
). Se cerrará en alrededor de un segundo, ¡así que tenemos que ser rápidos! Toca en el botón “FORCE STOP”, y luego toca en “OK”.
Tan pronto como puedas hacer clic en “OK”, puedes descansar (buen ejercicio, ¿eh?). Ahora procedamos con los hallazgos en Reddit. Vamos a habilitar adb haciendo clic en el icono de “lupa” en la esquina superior derecha y buscando “Developer options”:
Encuentra la dirección IP de la Consola. La forma más fácil es a través de la Configuración de Wi-Fi:
Ahora que adb está habilitado y tenemos la dirección IP, saltemos a un computador y conectemos con adb. Abre un terminal y ejecuta adb connect <Dirección IP>
(en mi caso 10.0.0.205):
> adb connect 10.0.0.205
connected to 10.0.0.205:5555
Te pedirá una confirmación en pantalla la primera vez que te conectes de forma remota a través de adb.
Creemos un archivo vacío dentro de /sdcard/Pictures/
llamado nautilus
. Puedes leer más sobre el “por qué” en Curiosidades de Bowflex.
> adb shell touch /sdcard/Pictures/nautilus
Ahora vamos a restaurar algunas funcionalidades. Envía los siguientes comandos a través de tu terminal:
> adb shell settings put secure ntls_launcher_preference 0
> adb shell settings put secure navigationbar_switch 1
> adb shell settings put secure notification_switch 1
> adb shell settings put secure statusbar_switch 1
Verás aparecer la UI:
Hay un paso final - cambiar el lanzador predeterminado. Busca “Default apps” y establece Quickstep como la app de inicio:
¡Ahora eres libre!
Este estado se mantendrá mientras NautilusLauncher esté forzado a detenerse. Persiste a través de reinicios.
Si quieres volver a “stock” solo abre la app NautilusLauncher
(te sugiero fuertemente que hayas creado el archivo /sdcard/Pictures/nautilus
de antemano):
NautilusLauncher
es el “lanzador de Android” predeterminado, lo que significa que si la app JRNY se cierra, inmediatamente “se reabrirá”.
También hay otro “bloqueo de seguridad”, un servicio en primer plano en el apk de NautilusLauncher
, llamado AppMonitorService
. Al descompilar el apk, puedes ver tres variables interesantes:
public static final int MonitorIntervalSeconds = 1;
// Some more variables
private static String[] TargtedAppsToKill = {"com.android.vending", "com.android.settings", "com.android.chrome", "com.google.android.gm", "com.google.android.youtube"};
private static String[] TargtedAppsToBackground = {"com.google.android.googlequicksearchbox:interactor", "com.google.android.googlequicksearchbox:search", "com.google.android.googlequicksearchbox", "com.android.launcher3", "com.google.android.inputmethod.latin"};
Y así ese servicio está “protegiendo activamente” el bloqueo. En cada cierre de la app (a través de mantener presionado el botón “Back”), habrá un intento de reabrir JRNY. Al forzar su cierre, también desactivamos todos los servicios en primer plano.
(los errores tipográficos que puedas ver en los respaldos de código provienen de los propios desarrolladores de Nautilus, no míos)
©2022-2024 Sebastián Barrenechea. Todos los derechos reservados.
Construido con Astro v4.16.13.