fl3xbl0w Projektlogo

Sichern des Inhalts Ihrer Konsole - fl3xbl0w

Veröffentlicht am 28. Mai 2022

Reverse-Engineering-Projekt. Es begann mit dem Bowflex Laufband 22, wurde aber verallgemeinert für jede von Nautilus Inc. (Nautilus, Bowflex, Schwinn) verkaufte Android-Maschine.

Nachdem Sie vom AppMonitorService freigegeben wurden (oder nach Erhalt eines OTA-Updates), ist das Erste, was zu tun ist, so viele Daten wie möglich zu sichern.

Stellen Sie sicher, dass Sie bereits mit der Konsole verbunden sind:

> adb connect <IP-Adresse der Konsole>

Sicherung des Inhalts von /sdcard

Es kann einige für das ordnungsgemäße Funktionieren der Maschine nach einem Werksreset notwendige Dateien enthalten (hauptsächlich in den Ordnern /sdcard/Android und /sdcard/Nautilus). Wir werden alles mit folgendem Befehl sichern:

> adb pull /sdcard/ .

APK-Sicherung

Zuerst, holen Sie sich die Liste aller auf der Konsole installierten Pakete (nur damit Sie eine Referenz haben):

> adb shell pm list packages -f

Sie werden im folgenden Format erscheinen: package:<APK-Standort>=<Paketname>

Sie müssen die Anwendungen finden, die Sie sichern möchten. NICHT ALLE ANWENDUNGEN SIND NOTWENDIG, die meisten sind Standard-Android-Anwendungen, also werden wir nur nach “nicht standardmäßigen Anwendungen” mit einigen Filtern suchen:

> adb shell pm list packages -f | grep -wviE 'com.android|com.google|framework-res|/vendor/overlay'

Sie werden Einträge von Anwendungen von com.nautilus, com.redbend, com.netflix, com.amazon, com.disney und vielleicht einigen mehr in der Zukunft sehen. Wir werden alles sichern wollen, was wir auf dieser Liste sehen (versteckte eindeutige IDs, verwenden Sie Ihre eigenen Ergebnisse):

> adb shell pm list packages -f | grep -wviE 'com.android|com.google|framework-res|/vendor/overlay'
package:/data/app/com.nautilus.sbctest-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.sbctest
package:/data/app/com.redbend.client-XXXXXXXXXXXXXXXX/base.apk=com.redbend.client
package:/data/app/com.nautilus.nlssbcsystemsettings-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.nlssbcsystemsettings
package:/system/priv-app/RBDualPartService/RBDualPartService.apk=com.redbend.dualpart.service.app
package:/data/app/com.netflix.mediaclient-XXXXXXXXXXXXXXXX/base.apk=com.netflix.mediaclient
package:/data/app/com.nautilus.nautiluslauncher-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.nautiluslauncher
package:/data/app/com.amazon.avod.thirdpartyclient-XXXXXXXXXXXXXXXX/base.apk=com.amazon.avod.thirdpartyclient
package:/data/app/com.nautilus.sbc_demo_app-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.sbc_demo_app
package:/data/app/com.nautilus.UtilityApp-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.UtilityApp
package:/data/app/com.nautilus.g4assetmanager-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.g4assetmanager
package:/data/app/com.nautilus.platform_hardwaretest-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.platform_hardwaretest
package:/data/app/com.nautilus.webviewer-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.webviewer
package:/data/app/com.nautilus.bowflex.usb-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.bowflex.usb
package:/data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk=com.disney.disneyplus

HINWEIS: com.redbend.dualpart.service.app stammt aus /system/priv-app/, was bedeutet, dass es auch nach einem Werksreset installiert bleibt. Wir können es trotzdem sichern, falls Sie an Reverse Engineering der Anwendungen interessiert sind.

Nehmen wir Disney Plus als Beispiel (versteckte eindeutige ID)

package:/data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk=com.disney.disneyplus

Diese Zeile, basierend auf dem von mir erwähnten Format, wäre:

Paketstandort: /data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk
Paketname: com.disney.disneyplus

Wir werden nachsehen, welche Version der Anwendung wir mit diesen Informationen haben. Verwenden wir den gerade identifizierten Paketnamen und führen aus:

> adb shell dumpsys package com.disney.disneyplus | grep versionName

In meinem Fall habe ich erhalten:

> adb shell dumpsys package com.disney.disneyplus | grep versionName
    versionName=2.4.2-rc2

Nun, um ein Backup für das Disney Plus Paket zu erstellen, wäre das Verfahren:

> adb pull /data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk .

Gleich nachdem es fertig ist, gehen Sie zu Ihrem Datei-Explorer und benennen Sie die neu gesicherte base.apk Datei um in com.disney.disneyplus-2.4.2-rc2.apk.

Das Format, das ich für APKs vorschlage, anhand dieses Beispiels, ist: <Paketname>-<Version>.apk

Wiederholen Sie den Prozess nun für den Rest der Anwendungen.

AppData-Sicherung

Es scheint möglich zu sein, einige (ich bin mir nicht sicher, ob alle) Anwendungsdaten zu sichern.

Beachten Sie, dass nicht alle installierten Anwendungen Anwendungsdaten generieren oder wir als shell-Benutzer möglicherweise keine Berechtigungen haben, alles zu sichern.

Erstellen Sie ein vollständiges Backup aller benutzerinstallierten Anwendungen:

> adb backup -f appdata.adb -all -noapk -nosystem

Alternativ können Sie das gleiche Ergebnis mit einem alternativen Befehl erzielen:

> adb shell 'bu backup -all -noapk -nosystem' > appdata.adb

Beide Befehle werden eine “Bildschirmbestätigung” anfordern, dass Sie ein Backup erstellen möchten. Tippen Sie auf “BACK UP MY DATA”:

Backup-Bestätigungsbildschirm

Wenn Sie den Inhalt extrahieren möchten (unter Linux, macOS), benötigen Sie zlib-flate von qpdf und führen aus:

> dd if=appdata.adb bs=24 skip=1 | zlib-flate -uncompress | tar xf -

Es gibt einige faszinierende Daten für com.nautilus.bowflex.usb. Dort befinden sich personenbezogene Daten (PII), also stellen Sie sicher, dass Sie gut prüfen, welche Dateien Sie teilen.

Diese Backup- und Extraktionsmethoden stammen von diesem Gist. Ich habe nur die dort aufgeführten Backup-Methoden getestet, die sicher zu verwenden sind. Wenn Sie mit der Wiederherstellung aus dem Gist experimentieren, sind Sie auf sich allein gestellt. Lassen Sie uns wissen, ob es funktioniert!

Skript

Ich habe ein schnelles und schmutziges Python-Skript entwickelt, um einige Inhalte zu sichern (es beinhaltet derzeit keine AppData). Nur getestet auf macOS mit android-platform-tools installiert über brew. Lesen Sie das Skript und stellen Sie sicher, dass es für Sie Sinn macht, bevor Sie es ausführen.

import sys
import os
import subprocess
from datetime import datetime

# überprüfen, ob ein Argument gegeben wurde
if len(sys.argv) != 2:
    print("Verwendung: python3 dump.py <IP-Adresse der Konsole>")
    sys.exit(1)

ipaddr = sys.argv[1]

# überprüfen, ob adb für die Shell verfügbar ist
adb_path = subprocess.check_output(["which", "adb"]).decode("utf-8").strip()
if not os.path.exists(adb_path):
    print("adb nicht gefunden")
    exit()

# Backup-Ordner mit aktuellem Datum und Uhrzeit einrichten
dump_folder = os.path.join(
    os.environ["HOME"],
    "Desktop",
    "nautilus_dump",
    "{}".format(datetime.now().strftime("%Y-%m-%d_%H-%M-%S")),
)
if not os.path.exists(dump_folder):
    os.makedirs(dump_folder)

# adb verbinden
print("Verbindung zu {}...".format(ipaddr))
subprocess.call(["adb connect {}".format(ipaddr)], shell=True)

# Inhalt von /sdcard sichern
print("Sicherung des Inhalts von /sdcard...")
subprocess.call(["adb pull /sdcard/ {}".format(dump_folder)], shell=True)

# APK-Informationen holen
print("APKs sichern...")
packages = (
    subprocess.check_output(["adb shell pm list packages -f"], shell=True)
    .decode("utf-8")
    .split("\n")
)

# leere Zeilen herausfiltern
packages = [x for x in packages if x.strip()]

# Zeilen herausfiltern, die "com.android", "com.google", "framework-res" enthalten
packages = [package for package in packages if package.find("com.android") == -1]
packages = [package for package in packages if package.find("com.google") == -1]
packages = [package for package in packages if package.find("framework-res") == -1]

print("Gefunden {} APKs".format(len(packages)))

for package in packages:
    package_name = package.split("=")
    package_name = package_name[len(package_name) - 1].strip()
    package_version = (
        subprocess.check_output(
            ["adb shell dumpsys package {} | grep versionName".format(package_name)],
            shell=True,
        )
        .decode("utf-8")
        .split("=")[1]
        .strip()
    )

    package_path = package.split(":")[1].split(".apk=")[0].strip()
    package_path = "{}.apk".format(package_path)
    print("Sicherung von {} v{}...".format(package_name, package_version))

    subprocess.call(["adb pull {} {}".format(package_path, dump_folder)], shell=True)

    os.rename(
        os.path.join(dump_folder, os.path.basename(package_path)),
        os.path.join(dump_folder, "{}-{}.apk".format(package_name, package_version)),
    )

# Appdata sichern
print("Sicherung von appdata.adb ...")
print('TIPPEN SIE JETZT AUF DEN "BACK UP MY DATA" KNOPF AUF DEM BILDSCHIRM !!!')
subprocess.call(
    ["adb backup -f {}/appdata.adb -all -noapk -nosystem".format(dump_folder)],
    shell=True,
)

# adb trennen
print("Trennung...")
subprocess.check_output(["adb disconnect"], shell=True)
Inhalt übersetzt von gpt-4-1106-preview

©2022-2024 Sebastian Barrenechea. Alle Rechte vorbehalten.

Erstellt mit Astro v4.16.13.