quitar - ¿Cómo se pueden extraer los datos(privados) de la propia aplicación de Android?
permisos android manifest (14)
¿Eso significa que uno podría modificar el directorio del mundo: - x al mundo: rx lo suficiente como para poder buscar los archivos?
Sí exactamente. Extrañamente, también necesitas el archivo para tener el bit x
establecido. (al menos en Android 2.3)
chmod 755
hasta el final funcionó para copiar un archivo (pero debes revertir los permisos después, si planeas continuar usando el dispositivo).
Intentando tirar un solo archivo usando
adb pull /data/data/com.corp.appName/files/myFile.txt myFile.txt
falla con
failed to copy ''/data/data/com.corp.appName/files/myFile.txt myFile.txt'' to ''myFile.txt'': Permission denied
a pesar de que la depuración de USB está habilitada en el dispositivo.
Podemos sortear el problema a través de la ruta arcaica
adb shell
run-as com.corp.appName
cat files/myFile.txt > myFile.txt
pero esto es difícil de manejar para más de un archivo.
¿Cómo puedo obtener el directorio /data/data/com.corp.appName/files en mi MacBook?
Hacer esto directamente o mediante un tránsito en `/ storage / sdcard0 / myDir (desde donde puedo continuar con Android File Transfer) está bien.
Comentario adicional
Puede ser que solo se esté ejecutando
adb backup -f myFiles com.corp.appName
generaré los archivos que estoy buscando. En ese caso, estoy buscando una manera de descomprimir / descomprimir la copia de seguridad resultante.
A partir de la secuencia de comandos de Dave Thomas, he podido escribir mi propia solución para superar 2 problemas:
- mi copia de seguridad contenía solo el archivo de manifiesto
- archivos binarios consiguieron con Dave Thomas donde ilegible
Este es mi script, que copia los datos de la aplicación en una tarjeta SD y luego la extrae
#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
De forma similar a la respuesta de Tamas , aquí hay una línea para que Mac OS X obtenga todos los archivos de la aplicación con su your.app.id
desde su dispositivo y los guarde en (en este caso) ~/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
)
- Excluir el
-d
para extraer del emulador - No pisotea tus variables de sesión
- Puede pegar todo el bloque en Terminal.app (o eliminar las nuevas líneas si lo desea)
Después de configurar los permisos correctos agregando el siguiente código:
File myFile = ...;
myFile.setReadable(true, false); // readable, not only for the owner
adb pull
funciona como se desee.
En MacOSX, al combinar las respuestas de Calaf y Ollie Ford, lo siguiente funcionó para mí.
En la línea de comandos (asegúrese de que adb esté en su ruta, la mía estaba en ~ / Library / Android / sdk / platform-tools / adb) y con su dispositivo Android enchufado y en el modo de depuración de USB, ejecute:
adb backup -f backup com.mypackage.myapp
Su dispositivo Android le pedirá permiso para hacer una copia de seguridad de sus datos. Selecciona "RESPALDAR MIS DATOS"
Espera unos momentos.
La copia de seguridad del archivo aparecerá en el directorio donde ejecutó adb.
Ahora ejecuta:
dd if=backup bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > backup.tar
Ahora tendrá un archivo backup.tar que puede descomprimir de esta manera:
tar xvf backup.tar
Y vea todos los archivos almacenados por su aplicación.
Esta respuesta se basa en mi experiencia con otras respuestas y comentarios en las respuestas. Mi esperanza es que pueda ayudar a alguien en una situación similar.
Estoy haciendo esto en OSX a través del terminal.
Previamente, la respuesta de Vinicius Avellar fue excelente para mí. La mayor parte del tiempo solo necesitaba la base de datos del dispositivo desde una aplicación de depuración.
Hoy tuve un caso de uso en el que necesitaba varios archivos privados . Terminé con dos soluciones que funcionaron bien para este caso.
Use la respuesta aceptada junto con los comentarios específicos de SomeX Someone SomeX. Cree una copia de seguridad y use la solución de terceros, sourceforge.net/projects/adbextractor/files/?source=navbar para descomprimir en un tar. Escribiré más sobre mi experiencia con esta solución en la parte inferior de esta respuesta. Desplácese hacia abajo si esto es lo que está buscando.
Una solución más rápida con la que me instalé. Creé un script para extraer varios archivos similares a la respuesta de Tamas. Puedo hacerlo de esta manera porque mi aplicación es una aplicación de depuración y tengo acceso para ejecutarla, como en mi dispositivo. Si no tiene acceso a la ejecución, ya que este método no funcionará para usted en OSX.
Aquí está mi script para extraer varios archivos privados que compartiré contigo, el lector, que también está investigando esta pregunta asombrosa;):
#!/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://.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"`"
Gist: https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4
Volver al método 1 , descifrar una copia de seguridad con sourceforge.net/projects/adbextractor/files/?source=navbar
Estos son los pasos que tomé en mi Mac y los problemas que encontré:
Primero puse en cola una copia de seguridad (y establecí una contraseña para cifrar mi copia de seguridad, mi dispositivo lo requería):
adb backup -f myAndroidBackup.ab com.corp.appName
Segundo, descargué solo abe.jar desde aquí: https://sourceforge.net/projects/adbextractor/files/abe.jar/download
Luego corrí:
java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar
En este punto, recibí un mensaje de error. Debido a que mi archivo está encriptado, java me dio un error que necesitaba para instalar algunas bibliotecas de políticas de seguridad.
- Así que fui a http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html y descargué los archivos jar de política de seguridad que necesitaba. Ahora en mi caso, las instrucciones de instalación me indicaron la ubicación incorrecta para poner los archivos jar. Dice que la ubicación correcta es <java-home> / lib / security . Los puse allí primero y aún recibí el mensaje de error. Así que investigué y en mi Mac con Java 1.8 el lugar correcto para ponerlos fue: <java-home> / jre / lib / security . Me aseguré de hacer una copia de seguridad de los archivos de política originales y ponerlos allí. Vola pude ingresar una contraseña con abe.jar y descifrarla en un archivo tar.
Por último, acabo de ejecutar ( después de ejecutar el comando anterior de nuevo )
tar xvf myAndroidBackup.tar
Ahora es importante tener en cuenta que si solo puedes ejecutar-as y cat, es mucho más rápido. Primero, solo obtiene los archivos que desea y no toda la aplicación. Dos, más archivos (+ cifrado para mí) hacen que la transferencia sea más lenta. Por lo tanto, saber hacer de esta manera es importante si no tiene run-as en OSX, pero la secuencia de comandos debe ser primero para una aplicación de depuración.
Eso sí, lo escribí hoy y lo probé varias veces, así que ¡por favor avísenme de cualquier error!
Esto es lo que funcionó para mí:
adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db
Estoy imprimiendo la base de datos directamente en el archivo local.
La copia de seguridad de adb escribirá un archivo específico de Android:
adb backup -f myAndroidBackup.ab com.corp.appName
Este archivo se puede convertir a formato tar utilizando:
dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myAndroidBackup.tar
Referencia:
http://nelenkov.blogspot.ca/2012/06/unpacking-android-backups.html
Busque "Actualizar" en ese enlace.
Alternativamente, utilice el extractor de copia de seguridad de Android para extraer archivos del archivo de copia de seguridad de Android ( .ab
).
Las versiones más nuevas de Android Studio incluyen el Device File Explorer, que he encontrado que es un práctico método de GUI para descargar archivos de mi Nexus 7 de desarrollo.
Debes asegurarte de haber habilitado la depuración de USB en el dispositivo
- Haga clic en Ver> Herramientas de Windows> Explorador de archivos de dispositivo o haga clic en el botón Explorador de archivos de dispositivo en la barra de la ventana de herramientas para abrir el Explorador de archivos de dispositivo.
- Seleccione un dispositivo de la lista desplegable.
Interactúe con el contenido del dispositivo en la ventana del explorador de archivos. Haga clic derecho en un archivo o directorio para crear un nuevo archivo o directorio, guarde el archivo o directorio seleccionado en su máquina, cargue, elimine o sincronice. Haga doble clic en un archivo para abrirlo en Android Studio.
Android Studio guarda los archivos que abre de esta manera en un directorio temporal fuera de su proyecto. Si realiza modificaciones en un archivo que abrió con el Explorador de archivos del dispositivo y desea guardar los cambios nuevamente en el dispositivo, debe cargar manualmente la versión modificada del archivo en el dispositivo.
Puede usar este script de shell a continuación. También es capaz de extraer archivos de la memoria caché de la aplicación, no como la herramienta de 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''"
Entonces puedes usarlo así:
./pull.sh files/myFile.txt
./pull.sh cache/someCachedData.txt
Si está utilizando una máquina Mac y un teléfono Samsung, esto es lo que tiene que hacer (ya que run-as
que no funciona en Samsung y zlib
no funciona en Mac)
Haga una copia de seguridad del directorio de datos de su aplicación copia de
adb backup -f /Users/username/Desktop/data.ab com.example
Se le pedirá una contraseña para encriptar en su teléfono, no ingrese ninguna. Solo toca "Hacer una copia de seguridad de mis datos". Vea cómo realizar una copia de seguridad?
Una vez que haya realizado la copia de seguridad, verá el archivo
data.ab
en su Escritorio. Ahora tenemos que convertir esto a formatotar
.Use Android Backup Extractor para esto. Download | Código fuente
Descárguelo y verá el archivo
abe.jar
. Agregue esto a su variable PATH.Ejecute esto para generar el archivo tar :
java -jar abe.jar unpack /Users/username/Desktop/data.ab /Users/username/Desktop/data.tar
Extraiga el archivo data.tar para acceder a todos los archivos
Tuve el mismo problema pero lo solucioné corriendo a continuación:
$ adb shell
$ run-as {app-package-name}
$ cd /data/data/{app-package-name}
$ chmod 777 {file}
$ cp {file} /mnt/sdcard/
Después de esto puedes correr
$ adb pull /mnt/sdcard/{file}
tu puedes hacer:
adb pull / storage / emulated / 0 / Android / data //
Copia de seguridad de los datos del juego con apk . Nougat Oneplus 2.
**adb backup "-apk com.nekki.shadowfight" -f "c:/myapk/samsung2.ab"**