Bagaimana seseorang dapat menarik data (pribadi) dari aplikasi Androidnya sendiri?

97

Mencoba menarik satu file menggunakan

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

gagal dengan

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

meskipun debugging USB diaktifkan di perangkat.

Kita bisa mengatasi masalah ini melalui jalur kuno

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

tapi ini berat untuk lebih dari satu file.

Bagaimana cara menarik direktori /data/data/com.corp.appName/files ke MacBook saya?

Melakukan ini baik secara langsung atau melalui transit di `/ storage / sdcard0 / myDir (dari mana saya dapat melanjutkan dengan Android File Transfer) tidak masalah.

Komentar tambahan

Mungkin itu hanya berjalan

adb backup  -f myFiles com.corp.appName

akan menghasilkan file yang saya cari. Dalam hal ini, saya sedang mencari cara untuk mengurai / mengekstrak cadangan yang dihasilkan!

Calaf
sumber
5
Kecuali perangkat di-root, Anda tidak bisa melakukan itu.
323 pergi
Saya harap Anda salah, tetapi untuk berjaga-jaga, harap pindahkan komentar Anda untuk menjadi jawaban. Bisakah Anda menambahkan semacam referensi untuk mendukung mengapa Anda berpikir demikian? Saya ingin menyimpan semua file sampah yang telah disimpan oleh versi buggy dari program saya untuk memastikan bahwa program saya yang lebih dekat dengan rilis akan menangani semua jenis file input dengan baik.
Calaf
1
Apakah itu berarti seseorang dapat mengubah direktori dari world: - x ke world: rx cukup lama untuk dapat mengambil file?
Calaf
1
@Knossos Meskipun ini adalah aplikasi saya, apakah tidak sah bagi pengguna untuk dapat menyimpan salinan data pribadi yang disimpan oleh aplikasi di perangkat mereka? Bagaimanapun, data tersebut mungkin milik pemilik perangkat, bukan pembuat aplikasi.
Calaf
1
Masalahnya adalah bagaimana Anda membedakan antara pemilik, dan Aplikasi / program jahat, mencoba untuk berinteraksi dengan data pribadi Aplikasi Anda. (yang dapat memiliki data pribadi pengguna)
Knossos

Jawaban:

101

adb backup akan menulis arsip khusus Android:

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

Arsip ini dapat diubah menjadi format tar menggunakan:

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

Referensi:

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

Cari "Perbarui" di tautan itu.


Atau, gunakan ekstraktor cadangan Android untuk mengekstrak file dari file cadangan Android ( .ab).

Calaf
sumber
5
bs=24 skip=1jauh lebih cepat daripada bs=1 skip=24(di sistem saya, 38.6 MB / s vs 1.7 MB / s) :)
netvope
18
Alternatif Python untuk tempat openssl belum dikompilasi dengan zlib: dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -(dari sumber di atas)
OJFord
6
Saya tidak pernah berhasil dengan ddperintah di MacBook saya di tempat kerja. Sebagai gantinya, saya gunakan java -jar ./abe.jar unpack data.ab data.tar. Anda dapat mengunduh utilitas abe dari sourceforge.net/projects/adbextractor/files/?source=navbar
Someone Somewhere
3
Juga, saya perhatikan bahwa saya harus menutup paksa aplikasi yang datanya ingin saya cadangkan, jika tidak, cadangannya kosong! (Android 4.4.2) Yang merupakan efek yang sama seperti saat manifes menampilkanandroid:allowBackup="false"
Someone Somewhere
2
Lebih baik lagi, ekstrak file secara langsung ke direktori lokal:dd if=myAndroidBackup.ab bs=24 skip=1 | openssl zlib -d | tar -x
mreichelt
50

Saya memiliki masalah yang sama tetapi menyelesaikannya dengan berjalan berikut:

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

Setelah ini Anda bisa lari

$ adb pull /mnt/sdcard/{file}
Trunst
sumber
1
Terima kasih sobat! Anda juga perlu menggunakan "cp -r" untuk membuatnya menjadi salinan rekursif. stackoverflow.com/questions/39961621/…
朱 西西
31

Inilah yang berhasil untuk saya:

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

Saya mencetak database langsung ke file lokal.

Vinicius Avellar
sumber
3
Tepatnya perintah ini menyebabkan file db saya rusak. Tapi saya membuatnya bekerja dengan langkah-langkah berikut: ------ adb shell ------ di dalam shell run run-as com.example.test ------ di dalam shell run cat ...db > /mnt/sdcard/file.db------ adb pull /mnt/sdcard/file.db .------ end (maaf, jeda baris tidak berfungsi)
Kirill Oficerov
@KirillOficerov akan lebih baik jika perintah-perintah itu bisa ditulis dalam satu baris
emen
Bagus saat Anda membutuhkan 1 file. Telah menggunakan ini untuk database. Menghadapi kasus sekarang di mana saya membutuhkan banyak file.
Dave Thomas
Untuk beberapa alasan penggunaan adb shelltidak berhasil untuk saya, tetapi mengikuti jawaban ini dan menggunakannya adb exec-outberhasil!
EpicPandaForce
21

Di MacOSX, dengan menggabungkan jawaban dari Calaf dan Ollie Ford, berikut ini berhasil untuk saya.

Pada baris perintah (pastikan adb ada di jalur Anda, milik saya ada di ~ / Library / Android / sdk / platform-tools / adb) dan dengan perangkat android Anda dicolokkan dan dalam mode debugging USB, jalankan:

 adb backup -f backup com.mypackage.myapp

Perangkat android Anda akan meminta izin untuk membuat cadangan data Anda. Pilih "CADANGKAN DATA SAYA"

Tunggu beberapa saat.

File backup akan muncul di direktori tempat Anda menjalankan adb.

Sekarang jalankan:

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

Sekarang Anda akan memiliki file backup.tar yang dapat Anda urungkan seperti ini:

 tar xvf backup.tar

Dan lihat semua file yang disimpan oleh aplikasi Anda.

Eric Van Bezooijen
sumber
Versi Mac Anda berfungsi! CATATAN: baik adb backupdan ddlangkah konversi tar tidak memberikan status saat bekerja dan dapat memakan waktu beberapa menit jika Anda memiliki banyak data. Sabar!
MechEthan
2
Saya mendapatkan: "zlib.error: Kesalahan -3 saat mendekompresi data: pemeriksaan header salah" Namun, cadangan saya meminta kata sandi untuk dienkripsi. Metode python ini tidak meminta kata sandi untuk mendekripsi cadangan. Abe.jar dalam komentar di contoh di atas meminta kata sandi, tetapi saya tidak mendapatkan semua file setelah membatalkan penggunaan metode itu.
Dave Thomas
Upaya kedua saya dengan abe.jar pada cadangan terenkripsi berhasil.
Dave Thomas
7

Versi Android Studio yang lebih baru menyertakan Device File Explorer yang menurut saya merupakan metode GUI yang berguna untuk mengunduh file dari pengembangan saya, Nexus 7.

Anda Harus memastikan Anda telah mengaktifkan USB Debugging pada perangkat

  1. Klik View> Tool Windows> Device File Explorer atau klik tombol Device File Explorer di bilah jendela alat untuk membuka Device File Explorer.
  2. Pilih perangkat dari daftar drop-down.
  3. Berinteraksi dengan konten perangkat di jendela file explorer. Klik kanan pada file atau direktori untuk membuat file atau direktori baru, simpan file atau direktori yang dipilih ke mesin Anda, unggah, hapus, atau sinkronkan. Klik dua kali file untuk membukanya di Android Studio.

    Android Studio menyimpan file yang Anda buka dengan cara ini dalam direktori sementara di luar proyek Anda. Jika Anda membuat modifikasi pada file yang Anda buka menggunakan Device File Explorer, dan ingin menyimpan perubahan Anda kembali ke perangkat, Anda harus mengunggah versi modifikasi file tersebut ke perangkat secara manual.

file explorer

Dokumentasi Lengkap

Jon
sumber
6

Anda dapat menggunakan skrip shell di bawah ini. Itu dapat menarik file dari cache aplikasi juga, tidak seperti adb backupalat:

#!/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'"

Kemudian Anda bisa menggunakannya seperti ini:

./pull.sh files/myFile.txt
./pull.sh cache/someCachedData.txt
Tamas
sumber
10
Bagian terbaiknya adalah ketika Anda tidak memberikan argumen dan kemudian rm /sdcard/menggantinya, untungnya tidak -rf.
TWiStErRob
3
Anda dapat langsung memasukkan ke file di host: "adb shell run-as com.whatever.Fnord cat /data/data/com.whatever.Fnord/databases/logging.db> / tmp / foo" (di mana / tmp / foo adalah file di mesin host, bukan perangkat android)
James Moore
Baru saja menyadari @ dave-thomas memperbaiki masalah beberapa waktu yang lalu. Menghapus suara negatif saya.
Don Hatch
Atau tidak :-( "Suara Anda sekarang terkunci kecuali jawaban ini diedit."
Don Hatch
TBH Saya tidak mengerti keributan tentang ini. Skrip (asli) tidak akan pernah menghapus direktori (tidak ada tombol -rf), kecuali jika direktori tersebut kosong. Saya belum memeriksa tetapi bahkan jika direktori kosong maka saya ragu bahwa skrip menghapus direktori karena itu adalah titik mount. Skripnya terlihat berbahaya, tapi tidak pernah ...
Tamas
5

Jika Anda menggunakan mesin Mac dan ponsel Samsung, inilah yang harus Anda lakukan (karena run-as tidak berfungsi di Samsung dan zlib tidak berfungsi di Mac)

  1. Buat cadangan direktori data aplikasi Anda adb backup -f /Users/username/Desktop/data.ab com.example

  2. Anda akan dimintai kata sandi untuk dienkripsi di Ponsel Anda, jangan masukkan apa pun. Cukup ketuk "Cadangkan data saya". Lihat Bagaimana cara melakukan BackUp?

  3. Setelah berhasil dicadangkan, Anda akan melihat data.abfile di Desktop Anda. Sekarang kita perlu mengubah ini menjadi tarformat.

  4. Gunakan Android Backup Extractor untuk ini. Unduh | Kode sumber

  5. Unduh dan Anda akan melihat abe.jarfile. Tambahkan ini ke variabel PATH Anda.

  6. Jalankan ini untuk menghasilkan file tar :java -jar abe.jar unpack /Users/username/Desktop/data.ab /Users/username/Desktop/data.tar

  7. Ekstrak file data.tar untuk mengakses semua file

Henry
sumber
2
Mengikuti ini persis dan data.tarhanya mengekstrak ke data.tar.cpgz@henry
pengguna-44651
2

Jawaban ini berdasarkan pengalaman saya dengan jawaban lain, dan komentar di jawaban tersebut. Harapan saya adalah saya dapat membantu seseorang dalam situasi serupa.

Saya melakukan ini di OSX melalui terminal.

Sebelumnya jawaban Vinicius Avellar bekerja sangat baik untuk saya. Saya hanya sebagian besar waktu membutuhkan database dari perangkat dari aplikasi debug.

Hari ini saya memiliki kasus penggunaan di mana saya membutuhkan banyak file pribadi . Saya berakhir dengan dua solusi yang bekerja dengan baik untuk kasus ini.

  1. Gunakan jawaban yang diterima bersama dengan komentar spesifik OSX dari Seseorang Di suatu tempat. Buat cadangan dan gunakan solusi pihak ketiga, sourceforge.net/projects/adbextractor/files/?source=navbar untuk mengekstraknya menjadi tar. Saya akan menulis lebih banyak tentang pengalaman saya dengan solusi ini di bagian bawah jawaban ini. Gulir ke bawah jika ini yang Anda cari.

  2. Solusi yang lebih cepat yang saya selesaikan. Saya membuat skrip untuk menarik banyak file yang mirip dengan jawaban Tamas. Saya dapat melakukannya dengan cara ini karena aplikasi saya adalah aplikasi debug dan saya memiliki akses ke run-as di perangkat saya. Jika Anda tidak memiliki akses ke run-as, metode ini tidak akan berfungsi untuk Anda di OSX.

Berikut ini skrip saya untuk menarik beberapa file pribadi yang akan saya bagikan dengan Anda, pembaca, yang juga menyelidiki pertanyaan mengagumkan ini;):

#!/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"`"

Inti: https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4


Kembali ke metode 1 , mendekripsi cadangan menggunakan Android Backup Extractor

Berikut adalah langkah-langkah yang saya ambil di Mac saya, dan masalah yang saya temui:

Pertama, saya mengantri cadangan (dan menyetel kata sandi untuk mengenkripsi cadangan saya, perangkat saya memerlukannya):

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

Kedua saya unduh hanya abe.jar dari sini: https://sourceforge.net/projects/adbextractor/files/abe.jar/download

Selanjutnya saya berlari:

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

Pada titik ini saya mendapat pesan kesalahan. Karena arsip saya dienkripsi, java memberi saya kesalahan sehingga saya perlu menginstal beberapa pustaka kebijakan keamanan.

  • Jadi saya pergi ke http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html dan mengunduh toples kebijakan keamanan yang saya butuhkan. Sekarang dalam kasus saya, instruksi penginstalan memberi tahu saya lokasi yang salah untuk meletakkan file jar. Dikatakan bahwa lokasi yang tepat adalah <java-home> / lib / security . Saya menempatkannya di sana terlebih dahulu dan masih mendapat pesan kesalahan. Jadi saya menyelidiki dan di Mac saya dengan Java 1.8 tempat yang benar untuk meletakkannya adalah: <java-home> / jre / lib / security . Saya memastikan untuk membuat cadangan toples kebijakan asli, dan menaruhnya di sana. Vola Saya bisa memasukkan kata sandi dengan abe.jar dan mendekripsi ke file tar.

Terakhir saya baru saja berlari ( setelah menjalankan perintah sebelumnya lagi )

tar xvf myAndroidBackup.tar

Sekarang penting untuk dicatat bahwa jika Anda bisa berlari-sebagai dan kucing, itu jauh lebih cepat. Pertama, Anda hanya mendapatkan file yang Anda inginkan dan bukan seluruh aplikasi. Dua, semakin banyak file (+ enkripsi untuk saya) membuatnya lebih lambat untuk ditransfer. Jadi mengetahui cara ini penting jika Anda tidak memiliki run-as di OSX, tetapi skrip harus menjadi yang pertama untuk aplikasi debug.

Pikiran Anda, saya baru saja menulisnya hari ini dan mengujinya beberapa kali, jadi tolong beri tahu saya jika ada bug!

Dave Thomas
sumber
1
Berkat tanggapan Anda dengan metode # 1, saya bisa mendapatkan dan menjelajahi cadangan paket dari aplikasi target debug yang diinstal pada perangkat produksi yang tidak di-rooting, tetapi cadangan tersebut hanya berisi file manifes. Dengan metode # 2 saya mengunduh semua data aplikasi, tetapi binari (yaitu file SQLite) tidak dapat dibaca. Saya menambahkan solusi berdasarkan skrip Anda yang berhasil untuk saya.
Paolone
1

Setelah mengatur hak akses dengan menambahkan kode berikut:

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

adb pull bekerja sesuai keinginan.

lihat File.setReadable ()

18446744073709551615
sumber
Tidak apa-apa untuk mengubah izin saat men-debug, tetapi pada titik tertentu menjelang rilis, hal itu akan mengalahkan perlindungan yang ditawarkan secara default (untuk mencegah aplikasi lain mengakses / mengacaukan file). Oleh karena itu, cara bagi pengembang untuk mengakses file meskipun hanya dapat dibaca / ditulis oleh pengguna lebih diinginkan.
Calaf
1

Mulai dari skrip Dave Thomas Saya sudah bisa menulis solusi saya sendiri untuk mengatasi 2 masalah:

  1. cadangan saya hanya berisi file manifes
  2. file biner didapat dengan Dave Thomas di mana tidak dapat dibaca

Ini adalah skrip saya, yang menyalin data aplikasi ke sdcard dan kemudian menariknya

#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
Paolone
sumber
1

Mirip dengan jawaban Tamas , berikut adalah satu baris untuk Mac OS X untuk mengambil semua file untuk aplikasi dengan your.app.iddari perangkat Anda dan menyimpannya ke (dalam hal ini) ~/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
)
  • Kecualikan -duntuk menarik dari emulator
  • Tidak menginjak variabel sesi Anda
  • Anda dapat menempelkan seluruh blok ke Terminal.app (atau menghapus baris baru jika diinginkan)
Zack Morris
sumber
0

Data Game yang dicadangkan dengan apk . Nougat Oneplus 2.

**adb backup "-apk com.nekki.shadowfight" -f "c:\myapk\samsung2.ab"**
Samin
sumber
adb backup -f myapp.ab -apk com.myapp # backup on one device adb restore myapp.ab # restore to the same or any other device
Steven Linn
0

Apakah itu berarti seseorang dapat mengubah direktori dari world: - x ke world: rx cukup lama untuk dapat mengambil file?

Ya persis. Cukup aneh, Anda juga membutuhkan file tersebut untuk memiliki xbit set. (setidaknya di Android 2.3)

chmod 755 sepenuhnya bekerja untuk menyalin file (tetapi Anda harus mengembalikan izin setelah itu, jika Anda berencana untuk terus menggunakan perangkat).

serv-inc
sumber
0

Anda dapat melakukan:

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

Roi Bareket
sumber
2
Jangan salah paham tapi, sudahkah Anda membaca pertanyaan dengan benar? OP meminta untuk menarik data 'pribadi' BUKAN 'publik'
baburao