Як можна отримати (приватні) дані власної програми для Android?


97

Спроба витягнути один файл за допомогою

adb pull /data/data/com.corp.appName/files/myFile.txt myFile.txt

не вдається з

failed to copy '/data/data/com.corp.appName/files/myFile.txt myFile.txt' to 'myFile.txt': Permission denied

незважаючи на те, що налагодження USB включено на пристрої.

Ми можемо подолати проблему архаїчним шляхом

adb shell
run-as com.corp.appName
cat files/myFile.txt > myFile.txt

але це нелегко для декількох файлів.

Як я можу перетягнути каталог /data/data/com.corp.appName/files до свого MacBook?

Робити це безпосередньо або через транзит в `/ storage / sdcard0 / myDir (звідки я можу продовжувати передачу файлів Android), це добре.

Додатковий коментар

Може бути, що просто біг

adb backup  -f myFiles com.corp.appName

генерує файли, які я шукаю. У такому випадку я шукаю спосіб зняти / розпакувати отриману резервну копію!


5
Якщо пристрій не вкорінено, ви просто не можете цього зробити.
323,

Сподіваюсь, ви помиляєтесь, але про всяк випадок, будь ласка, перенесіть свій коментар, щоб він відповів. Не могли б ви додати якесь посилання, щоб підтвердити, чому ви так думаєте? Я хотів би зберегти всі непотрібні файли, які зберегли помилкові версії моєї програми, щоб переконатися, що моя програма, яка наближається до випуску, витончено оброблятиме всі види вхідних файлів.
Калаф

1
Чи означає це, що можна було б chmod каталог з world: - x to world: rx досить довго, щоб мати можливість отримати файли?
Калаф

1
@Knossos Незважаючи на те, що це мій додаток, чи не є законним для користувачів можливість зберігати копію приватних даних, які програма зберігає на своїх пристроях? Зрештою, дані, імовірно, належать власнику пристрою, а не автору програми.
Калаф,

1
Проблема полягає в тому, як розрізнити власника та шкідливий додаток / програму, намагаючись взаємодіяти з приватними даними ваших програм. (в якому можуть бути особисті дані користувачів)
Кнос,

Відповіді:


101

Резервна копія adb напише архів для Android:

adb backup  -f myAndroidBackup.ab  com.corp.appName

Цей архів можна перетворити у формат tar, використовуючи:

dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myAndroidBackup.tar

Довідка:

http://nelenkov.blogspot.ca/2012/06/unpacking-android-backups.html

Шукайте "Оновити" за цим посиланням.


Крім того, використовуйте екстрактор резервного копіювання Android, щоб витягти файли з .abфайлу резервної копії Android ( ).


5
bs=24 skip=1набагато швидше, ніж bs=1 skip=24(у моїй системі, 38,6 МБ / с проти 1,7 МБ / с) :)
netvope

18
Альтернатива Python, де opensl не був складений з zlib: dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -(з вищезгаданого джерела)
OJFord,

6
Я ніколи не мав успіху з ddкомандою на своєму MacBook на роботі. Натомість я використовую java -jar ./abe.jar unpack data.ab data.tar. Ви можете завантажити утиліту abe з sourceforge.net/projects/adbextractor/files/?source=navbar
Хтось десь

3
Крім того, я помітив, що мені довелося примусово закрити програму, дані якої я хочу зробити для резервної копії, інакше резервна копія порожня! (Android 4.4.2) Це такий же ефект, як і коли показується маніфестandroid:allowBackup="false"
Хтось десь

2
Ще краще, безпосередньо витягти файли в локальний каталог:dd if=myAndroidBackup.ab bs=24 skip=1 | openssl zlib -d | tar -x
mreichelt

50

У мене була така ж проблема, але я вирішив її за допомогою наступного:

$ adb shell
$ run-as {app-package-name}
$ cd /data/data/{app-package-name}
$ chmod 777 {file}
$ cp {file} /mnt/sdcard/

Після цього ви можете бігати

$ adb pull /mnt/sdcard/{file}

1
дякую людино! Вам також потрібно використовувати "cp -r", щоб зробити його рекурсивною копією. stackoverflow.com/questions/39961621 / ...
朱西西

31

Ось, що мені вдалося:

adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db

Я друкую базу даних безпосередньо у локальний файл.


3
Саме ця команда спричинила пошкодження мого файлу db. Але я змусив це працювати з наступними кроками: ------ adb shell ------ всередині запуску оболонки run-as com.example.test ------ всередині запуску оболонки cat ...db > /mnt/sdcard/file.db------ adb pull /mnt/sdcard/file.db .------ кінець (вибачте, розриви рядків не працюють)
Кирило Офіцеров

@KirillOficerov, було б добре, якби ці команди можна було писати в один рядок
emen

Чудово, коли вам потрібно 1 файл. Використовували це для бази даних. Зустрічаючи справу тепер, коли мені потрібно кілька файлів.
Dave Thomas

З якихось причин використання adb shellне працювало для мене, але слідування цій відповіді та adb exec-outйого використання спрацювало!
EpicPandaForce

21

На MacOSX, поєднавши відповіді Калафа та Оллі Форда, мені допомогло наступне.

У командному рядку (переконайтеся, що adb стоїть на вашому шляху, мій знаходився за адресою ~ / Library / Android / sdk / platform-tools / adb) та за допомогою підключеного до вас пристрою Android та в режимі налагодження через USB:

 adb backup -f backup com.mypackage.myapp

Ваш андроїд-пристрій попросить дозволу на резервну копію даних. Виберіть "РЕЗЕРВУВАТИ МОЇ ДАНІ"

Почекайте кілька моментів.

Резервна копія файлу з'явиться в каталозі, де ви запускали adb.

Тепер запустіть:

dd if=backup bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > backup.tar

Тепер у вас буде файл backup.tar, який ви зможете зняти так:

 tar xvf backup.tar

І перегляньте всі файли, що зберігаються у вашій програмі.


Ваша версія для Mac працює! Примітка: як adb backupі ddкроки конверсії дьогтю не дають ніякого статусу в час роботи і може зайняти кілька хвилин , якщо у вас є багато даних. Наберіться терпіння!
MechEthan

2
Я отримую: "zlib.error: Помилка -3 під час розпакування даних: неправильна перевірка заголовка" Моя резервна копія запитує пароль для шифрування, хоча. Цей метод python не вимагає пароля для дешифрування резервної копії. Abe.jar у коментарях у наведеному вище прикладі запитує пароль, але я не отримав усі файли після розпакування з використанням цього методу.
Дейв Томас

Моя друга спроба з abe.jar зашифрованої резервної копії спрацювала.
Дейв Томас

7

Новіші версії Android Studio включають Провідник файлів пристроїв, який, як я вважав, є зручним методом завантаження графічного інтерфейсу для завантаження файлів з моєї розробки Nexus 7.

Ви повинні переконатися, що увімкнули налагодження USB на пристрої

  1. Клацніть Перегляд> Інструмент Windows> Провідник файлів пристроїв або натисніть кнопку Провідник файлів пристроїв на панелі вікон інструментів, щоб відкрити Провідник файлів пристроїв.
  2. Виберіть пристрій зі спадного списку.
  3. Взаємодійте із вмістом пристрою у вікні провідника файлів. Клацніть правою кнопкою миші на файл або каталог, щоб створити новий файл або каталог, збережіть вибраний файл або каталог на своєму пристрої, завантажте, видаліть або синхронізуйте. Двічі клацніть файл, щоб відкрити його в Android Studio.

    Android Studio зберігає файли, які ви відкриваєте таким чином, у тимчасовому каталозі поза вашим проектом. Якщо ви вносите зміни до файлу, який ви відкрили за допомогою Провідника файлів пристрою, і хочете зберегти зміни на пристрої, вам потрібно вручну завантажити змінену версію файлу на пристрій.

файловий провідник

Повна документація


6

Ви можете використовувати цей сценарій оболонки нижче. Він також може витягувати файли з кешу додатків, не як adb backupінструмент:

#!/bin/sh

if [ -z "$1" ]; then 
    echo "Sorry script requires an argument for the file you want to pull."
    exit 1
fi

adb shell "run-as com.corp.appName cat '/data/data/com.corp.appNamepp/$1' > '/sdcard/$1'"
adb pull "/sdcard/$1"
adb shell "rm '/sdcard/$1'"

Тоді ви можете використовувати його так:

./pull.sh files/myFile.txt
./pull.sh cache/someCachedData.txt

10
Найкраще, коли ти не наводиш аргументів, а потім rm /sdcard/замінюєш, щастить, що це не так -rf.
TWiStErRob

3
Ви можете просто котитися безпосередньо до файлу на хості: "adb shell run-as com.whatever.Fnord cat /data/data/com.whatever.Fnord/databases/logging.db> / tmp / foo" (де / tmp / foo - це файл на хост-машині, а не на пристрої Android)
Джеймс Мур,

Щойно зрозумів, що @ dave-thomas вирішив проблему деякий час тому. Видалення мого голосу проти.
Дон Хетч

Або ні :-( "Ваш голос зараз заблокований, якщо цю відповідь не відредаговано."
Дон Хетч,

TBH Я не розумію суєти з цього приводу. (Оригінальний) скрипт ніколи не видалив каталог (відсутній перемикач -rf), якщо він не був порожнім. Я не перевіряв, але навіть якщо каталог порожній, я сумніваюся, що сценарій видаляє каталог, оскільки це точка монтування. Сценарій виглядав небезпечно, але цього ніколи не було ...
Тамаш,

5

Якщо ви використовуєте машину Mac і телефон Samsung, це те, що вам потрібно зробити (оскільки run-as не працює на Samsung і zlib не працює на Mac)

  1. Створіть резервну копію каталогу даних вашого додатка adb backup -f /Users/username/Desktop/data.ab com.example

  2. Вам буде запропоновано ввести пароль для шифрування у вашому телефоні, не вводьте жодного. Просто натисніть "Резервне копіювання даних". Дивіться Як зробити резервне копіювання?

  3. Після успішного створення резервної копії ви побачите data.abфайл на робочому столі. Тепер нам потрібно перетворити це у tarформат.

  4. Використовуйте для цього резервну копію Android . Завантажити | SourceCode

  5. Завантажте його, і ви побачите abe.jarфайл. Додайте це до змінної PATH.

  6. Виконайте це, щоб створити файл tar :java -jar abe.jar unpack /Users/username/Desktop/data.ab /Users/username/Desktop/data.tar

  7. Витягніть файл data.tar, щоб отримати доступ до всіх файлів


2
Дотримувався цього точно і data.tarсправедливих витягів до data.tar.cpgz@henry
user-44651

2

Ця відповідь заснована на моєму досвіді інших відповідей та коментарях у відповідях. Я сподіваюся, що можу допомогти комусь у подібній ситуації.

Я роблю це на OSX через термінал.

Раніше відповідь Вінісія Авельяра спрацювала для мене чудово. Мені лише більшість часу була потрібна база даних з пристрою з програми налагодження.

Сьогодні у мене був випадок, коли мені потрібні були кілька приватних файлів . У підсумку я отримав два рішення, які добре працювали в цій справі.

  1. Використовуйте прийняту відповідь разом із конкретними коментарями OSX для когось десь. Створіть резервну копію та скористайтеся стороннім рішенням sourceforge.net/projects/adbextractor/files/?source=navbar для розпакування в тар. Я напишу більше про свій досвід використання цього рішення внизу цієї відповіді. Прокрутіть вниз, якщо це те, що ви шукаєте.

  2. Швидше рішення, з яким я вирішив. Я створив сценарій для витягування декількох файлів, подібних до відповіді Тамаша. Я можу це зробити так, оскільки моя програма - це програма налагодження, і я маю доступ до роботи на своєму пристрої. Якщо у вас немає доступу до запуску, оскільки цей спосіб не буде працювати для вас на OSX.

Ось мій сценарій для витягування декількох приватних файлів, якими я поділюсь з вами, читачем, який також розслідує це дивовижне питання;):

#!/bin/bash
#
# Strict mode: http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
IFS=$'\n\t'

# 
# Usage: script -f fileToPull -p packageName
# 

# This script is for pulling private files from an Android device
# using run-as. Note: not all devices have run-as access, and
# application must be a debug version for run-as to work.
# 
# If run-as is deactivated on your device use one of the
# alternative methods here:
# http://stackoverflow.com/questions/15558353/how-can-one-pull-the-private-data-of-ones-own-android-app
# 
# If you have encrypted backup files use:
# sourceforge.net/projects/adbextractor/files/?source=navbar 
# From comments in the accepted answer in the above SO question
# 
# If your files aren't encrypted use the accepted answer 
# ( see comments and other answers for OSX compatibility )
# 
# This script is open to expansions to allow selecting 
# device used. Currently first selected device from
# adb shell will be used.

#Check we have one connected device
adb devices -l | grep -e 'device\b' > /dev/null

if [ $? -gt 0 ]; then
    echo "No device connected to adb."
    exit 1
fi

# Set filename or directory to pull from device
# Set package name we will run as
while getopts f:p: opt; do
    case $opt in
        f)
            fileToPull=$OPTARG
            ;;
        p)
            packageName=$OPTARG
            ;;
    esac
done;

# Block file arg from being blank
if [ -z "$fileToPull" ]; then
    echo "Please specify file or folder to pull with -f argument"
    exit 1
fi

# Block package name arg from being blank
if [ -z "$packageName" ]; then
    echo "Please specify package name to run as when pulling file"
    exit 1
fi

# Check package exists
adb shell pm list packages | grep "$packageName" > /dev/null
if [ $? -gt 0 ]; then
    echo "Package name $packageName does not exist on device"
    exit 1
fi

# Check file exists and has permission with run-as
fileCheck=`adb shell "run-as $packageName ls $fileToPull"`
if [[ $fileCheck =~ "Permission denied" ]] || [[ $fileCheck =~ "No such file or directory" ]]; then
    echo "Error: $fileCheck"
    echo "With file -> $fileToPull"
    exit 1
fi

# Function to pull private file
#
# param 1 = package name
# param 2 = file to pull
# param 3 = output file
function pull_private_file () {

    mkdir -p `dirname $3`

    echo -e "\033[0;35m***" >&2
    echo -e "\033[0;36m Coping file $2 -> $3" >&2
    echo -e "\033[0;35m***\033[0m" >&2

    adb shell "run-as $1 cat $2" > $3
}

# Check if a file is a directory
# 
# param 1 = directory to check
function is_file_dir() {

    adb shell "if [ -d \"$1\" ]; then echo TRUE; fi"
}

# Check if a file is a symbolic link
# 
# param 1 = directory to check
function is_file_symlink() {

    adb shell "if [ -L \"$1\" ]; then echo TRUE; fi"
}

# recursively pull files from device connected to adb
# 
# param 1 = package name
# param 2 = file to pull
# param 3 = output file
function recurse_pull_private_files() {

    is_dir=`is_file_dir "$2"`
    is_symlink=`is_file_symlink "$2"`

    if [ -n "$is_dir" ]; then

        files=`adb shell "run-as $1 ls \"$2\""`

        # Handle the case where directory is a symbolic link
        if [ -n "$is_symlink" ]; then
            correctPath=`adb shell "run-as $1 ls -l \"$2\"" | sed 's/.*-> //' | tr -d '\r'`
            files=`adb shell "run-as $1 ls \"$correctPath\""`
        fi

        for i in $files; do

            # Android adds nasty carriage return that screws with bash vars
            # This removes it. Otherwise weird behavior happens
            fileName=`echo "$i" | tr -d '\r'` 

            nextFile="$2/$fileName"
            nextOutput="$3/$fileName"
            recurse_pull_private_files "$1" "$nextFile" "$nextOutput"
        done
    else

        pull_private_file "$1" "$2" "$3"
    fi
}

recurse_pull_private_files "$packageName" "$fileToPull" "`basename "$fileToPull"`"

Суть: https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4


Повернімось до методу 1 , дешифрування резервної копії за допомогою Android Backup Extractor

Ось кроки, які я зробив на своєму Mac, і проблеми, з якими я зіткнувся:

Спочатку я поставив у чергу резервну копію (і встановив пароль для шифрування резервної копії, це вимагав мій пристрій):

adb backup -f myAndroidBackup.ab  com.corp.appName

По-друге, я завантажив тільки abe.jar звідси: https://sourceforge.net/projects/adbextractor/files/abe.jar/download

Далі я побіг:

java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar

На цьому етапі я отримав повідомлення про помилку. Оскільки мій архів зашифрований, Java видала мені помилку, що мені потрібно встановити деякі бібліотеки політики безпеки.

  • Тож я зайшов на http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html і завантажив потрібні мені банки політики безпеки. Зараз у моєму випадку інструкція з встановлення сказала мені неправильне місце для розміщення файлів jar. Там сказано, що належним місцем розташування є <java-home> / lib / security . Я помістив їх туди першими і все-таки отримав повідомлення про помилку. Тому я дослідив, і на моєму Mac з Java 1.8 правильним місцем для їх розміщення було: <java-home> / jre / lib / security . Я обов’язково створив резервну копію оригінальних банок для політики та помістив їх туди. Vola Я зміг ввести пароль за допомогою abe.jar і розшифрувати файл tar.

Нарешті я просто побіг ( після повторного запуску попередньої команди )

tar xvf myAndroidBackup.tar

Тепер важливо відзначити, що якщо ви можете просто бігати як кота, це набагато швидше. По-перше, ви отримуєте лише потрібні файли, а не всю програму. По-друге, чим більше файлів (+ шифрування для мене), тим повільніше передається. Отже, знати, як це зробити, важливо, якщо у вас немає запуску як на OSX, але сценарій повинен спочатку перейти до програми для налагодження.

Зверніть увагу, я щойно написав його сьогодні і протестував кілька разів, тому, будь ласка, повідомте мене про будь-які помилки!


1
Завдяки вашій відповіді з методом №1 я зміг отримати та дослідити резервну копію пакета з налагодженої програми, встановленої на виробничому некоренованому пристрої, але резервна копія містить лише файл маніфесту. За допомогою методу №2 я завантажив усі дані програми, але двійкові файли (тобто файли SQLite) не читаються. Я додаю рішення на основі вашого сценарію, який працював для мене.
Паолоне

1

Після встановлення правильних дозволів, додавши такий код:

File myFile = ...;
myFile.setReadable(true, false); // readable, not only for the owner

adb pull працює за бажанням.

див. File.setReadable ()


Змінювати дозволи під час налагодження можна, але в певний момент, коли це вийде, це призведе до втрати захисту, запропонованої за замовчуванням (для запобігання доступу інших програм до файлів). Отже, більш бажаним є спосіб для розробника отримати доступ до файлів, хоча вони є просто читабельними / записаними користувачем.
Калаф,

1

Починаючи форму сценарію Дейва Томаса, я зміг написати власне рішення для подолання двох проблем:

  1. моя резервна копія містила лише файл маніфесту
  2. бінарні файли, отримані разом з Дейвом Томасом, де не читаються

Це мій сценарій, який копіює дані програми на sdcard, а потім витягує їх

#Check we have one connected device
adb devices -l | grep -e 'device\b' > /dev/null

if [ $? -gt 0 ]; then
    echo "No device connected to adb."
    exit 1
fi

# Set filename or directory to pull from device
# Set package name we will run as
while getopts f:p: opt; do
    case $opt in
        f)
            fileToPull=$OPTARG
            ;;
        p)
            packageName=$OPTARG
            ;;
    esac
done;

# Block package name arg from being blank
if [ -z "$packageName" ]; then
    echo "Please specify package name to run as when pulling file"
    exit 1
fi

# Check package exists
adb shell pm list packages | grep "$packageName" > /dev/null
if [ $? -gt 0 ]; then
    echo "Package name $packageName does not exist on device"
    exit 1
fi

    adb shell "run-as $packageName cp -r /data/data/$packageName/ /sdcard/$packageName"
    adb pull /sdcard/$packageName
    adb shell rm -rf /sdcard/$packageName

1

Подібно до відповіді Тамаша , ось Mac OS X одноразовий, щоб отримати всі файли програми з your.app.idвашого пристрою та зберегти їх у цьому випадку ~/Desktop/your.app.id:

(
    id=your.app.id &&
    dest=~/Desktop &&
    adb shell "run-as $id cp -r /data/data/$id /sdcard" &&
    adb -d pull "/sdcard/$id" "$dest" &&
    if [ -n "$id" ]; then adb shell "rm -rf /sdcard/$id"; fi
)
  • Виключіть функцію -dтягнути з емулятора
  • Не тупить ваші змінні сеансу
  • Ви можете вставити весь блок у Terminal.app (або при бажанні видалити нові рядки)

0

Резервне копіювання даних гри з apk . Нуга Oneplus 2.

**adb backup "-apk com.nekki.shadowfight" -f "c:\myapk\samsung2.ab"**

adb backup -f myapp.ab -apk com.myapp # backup on one device adb restore myapp.ab # restore to the same or any other device
Стівен Лінн

0

Чи означає це, що можна було б chmod каталог з world: - x to world: rx досить довго, щоб мати можливість отримати файли?

Так, саме так. Як не дивно, вам також потрібен файл, щоб встановити xбіт. (принаймні на Android 2.3)

chmod 755 весь час працював над копіюванням файлу (але згодом слід скасувати дозволи, якщо ви плануєте продовжувати користуватися пристроєм).


0

Ви можете зробити:

adb pull / storage / emulated / 0 / Android / data //


2
Не зрозумійте мене неправильно, але, чи правильно ви прочитали питання? ОП просить витягнути "приватні" дані НЕ "громадські"
бабурао
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.