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>
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/ .
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.
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”:
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!
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)
©2022-2024 Sebastian Barrenechea. Alle Rechte vorbehalten.
Erstellt mit Astro v4.16.13.