リバースエンジニアリングプロジェクト。Bowflex Treadmill 22から始まりましたが、最終的にはNautilus Inc.(Nautilus、Bowflex、Schwinn)が販売するすべてのAndroidマシンに汎用化されました。
AppMonitorService
から解放された後(またはOTAアップデートを受け取った後)、最初に行うべきことは、できるだけ多くのデータをバックアップすることです。
まず、コンソールに接続されていることを確認してください:
> adb connect <Console IP Address>
ファクトリーリセット後にマシンが正常に動作するために必要なファイルが含まれている可能性があります(主に/sdcard/Android
および/sdcard/Nautilus
フォルダ内)。すべてをバックアップするには、次のコマンドを使用します:
> adb pull /sdcard/ .
まず、コンソールにインストールされているすべてのパッケージのリストを取得します(参照用):
> adb shell pm list packages -f
次の形式で表示されます:package:<APKの場所>=<パッケージ名>
バックアップしたいアプリケーションを見つける必要があります。すべてのアプリケーションが必要なわけではなく、ほとんどは標準のAndroidアプリケーションです。そのため、いくつかのフィルターを使用して「非標準アプリケーション」のみを探します:
> adb shell pm list packages -f | grep -wviE 'com.android|com.google|framework-res|/vendor/overlay'
com.nautilus
、com.redbend
、com.netflix
、com.amazon
、com.disney
などのアプリケーションのレコードが表示されるでしょう。将来的にはさらに多くのアプリケーションが追加されるかもしれません。リストに表示されるすべてをバックアップします(ユニークIDは隠されていますので、結果に基づいて自分で確認してください):
> 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
注意:
com.redbend.dualpart.service.app
は/system/priv-app/
から来ているため、ファクトリーリセット後もインストールされたままになります。リバースエンジニアリングに興味がある場合は、バックアップしても構いません。
ディズニープラスを例にとってみましょう(ユニークIDは隠されています)
package:/data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk=com.disney.disneyplus
この行は、前述の形式に基づいて次のようになります:
パッケージの場所: /data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk
パッケージ名: com.disney.disneyplus
この情報を使用して、インストールされているアプリケーションのバージョンを確認します。先ほど特定したパッケージ名を使用して、次のコマンドを実行します:
> adb shell dumpsys package com.disney.disneyplus | grep versionName
私の場合、次の結果が得られました:
> adb shell dumpsys package com.disney.disneyplus | grep versionName
versionName=2.4.2-rc2
次に、ディズニープラスパッケージのバックアップを作成する手順は次のとおりです:
> adb pull /data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk .
バックアップが完了したら、ファイルエクスプローラーに移動し、新しくバックアップされたbase.apk
ファイルの名前をcom.disney.disneyplus-2.4.2-rc2.apk
に変更します。
APKの命名形式としては、次のようにすることをお勧めします:<パッケージ名>-<バージョン>.apk
他のアプリケーションについても同じ手順を繰り返します。
一部の(すべてではないかもしれませんが)アプリケーションデータをバックアップできるようです。
すべてのインストール済みアプリケーションがアプリケーションデータを生成するわけではなく、shell
ユーザーとしてすべてのデータをバックアップする権限がない場合もあります。
ユーザーがインストールしたすべてのアプリケーションの完全なバックアップを作成します:
> adb backup -f appdata.adb -all -noapk -nosystem
または、次の代替コマンドでも同じ結果が得られます:
> adb shell 'bu backup -all -noapk -nosystem' > appdata.adb
どちらのコマンドも、バックアップを行うかどうかの「画面上の確認」を要求します。「データをバックアップ」をタップします:
バックアップ内容を抽出したい場合(Linux、macOS)、zlib-flate
が必要です。qpdfから入手し、次のコマンドを実行します:
> dd if=appdata.adb bs=24 skip=1 | zlib-flate -uncompress | tar xf -
com.nautilus.bowflex.usb
には興味深いデータがあります。
個人を特定できる情報(PII)が含まれているため、共有するファイルをよく確認してください。
これらのバックアップおよび抽出方法はこのGistから引用しています。ここに記載されているバックアップ方法のみをテストしており、安全に試すことができます。Gistからの復元を試す場合は自己責任で行ってください。動作したら教えてください!
いくつかの内容をバックアップするための簡単なPythonスクリプトを作成しました(現時点ではAppDataは含まれていません)。 macOSでbrewを使用してandroid-platform-toolsをインストールした環境でのみテスト済みです。 スクリプトを読んで、実行する前に内容が理解できることを確認してください。
import sys
import os
import subprocess
from datetime import datetime
# 引数が与えられているか確認
if len(sys.argv) != 2:
print("使用方法: python3 dump.py <Console IP Address>")
sys.exit(1)
ipaddr = sys.argv[1]
# adbがシェルで利用可能か確認
adb_path = subprocess.check_output(["which", "adb"]).decode("utf-8").strip()
if not os.path.exists(adb_path):
print("adbが見つかりません")
exit()
# 現在の日付と時刻でバックアップフォルダを設定
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に接続
print("{}に接続中...".format(ipaddr))
subprocess.call(["adb connect {}".format(ipaddr)], shell=True)
# /sdcardの内容をバックアップ
print("/sdcardの内容をバックアップ中...")
subprocess.call(["adb pull /sdcard/ {}".format(dump_folder)], shell=True)
# APK情報を取得
print("APKをバックアップ中...")
packages = (
subprocess.check_output(["adb shell pm list packages -f"], shell=True)
.decode("utf-8")
.split("\n")
)
# 空行をフィルタリング
packages = [x for x in packages if x.strip()]
# "com.android"、"com.google"、"framework-res"を含む行をフィルタリング
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("{}個のAPKが見つかりました".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("{} 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をバックアップ
print("appdata.adbをバックアップ中...")
print('画面上の「データをバックアップ」ボタンをタップしてください!!!')
subprocess.call(
["adb backup -f {}/appdata.adb -all -noapk -nosystem".format(dump_folder)],
shell=True,
)
# adbを切断
print("切断中...")
subprocess.check_output(["adb disconnect"], shell=True)
©2022-2024 セバスティアン・バレネチェア. すべての権利を保有.
構築: Astro v4.16.13.