fl3xbl0wプロジェクトロゴ

コンソールの内容をバックアップする - fl3xbl0w

リリース日: 2022年5月28日

リバースエンジニアリングプロジェクト。Bowflex Treadmill 22から始まりましたが、最終的にはNautilus Inc.(Nautilus、Bowflex、Schwinn)が販売するすべてのAndroidマシンに汎用化されました。

AppMonitorServiceから解放された後(またはOTAアップデートを受け取った後)、最初に行うべきことは、できるだけ多くのデータをバックアップすることです。

まず、コンソールに接続されていることを確認してください:

> adb connect <Console IP Address>

/sdcardの内容のバックアップ

ファクトリーリセット後にマシンが正常に動作するために必要なファイルが含まれている可能性があります(主に/sdcard/Androidおよび/sdcard/Nautilusフォルダ内)。すべてをバックアップするには、次のコマンドを使用します:

> adb pull /sdcard/ .

APKのバックアップ

まず、コンソールにインストールされているすべてのパッケージのリストを取得します(参照用):

> 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.nautiluscom.redbendcom.netflixcom.amazoncom.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

他のアプリケーションについても同じ手順を繰り返します。

AppDataのバックアップ

一部の(すべてではないかもしれませんが)アプリケーションデータをバックアップできるようです。

すべてのインストール済みアプリケーションがアプリケーションデータを生成するわけではなく、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)
コンテンツの翻訳者: chatgpt-4o-latest

©2022-2024 セバスティアン・バレネチェア. すべての権利を保有.

構築: Astro v4.16.13.