我刚刚使用此方法植根了我的Nexus 5:http://www.phonearena.com/news/How-to-root-Google-Nexus-5_id49014
我还在开发者选项中启用了USB调试。
然后我尝试使用此命令从我的设备中提取数据库文件:
adb pull /data/data/path.to.package/databases/data /sdcard/test
我收到permission denied
错误。
我没有在我尝试访问的应用中设置调试标志。这是我无法访问该文件的原因吗?如果是,是否有任何变通方法可以访问应用程序文件?
答案 0 :(得分:64)
您可以使用run-as
shell命令访问私有应用程序数据。
如果您只想复制数据库,可以使用此提供的代码段 https://stackoverflow.com/a/31504263/998157
adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db
答案 1 :(得分:21)
我遇到了同样的问题。我的工作是使用adb shell和su。接下来,将文件复制到/ sdcard / Download
然后,我可以使用adb pull来获取文件。
答案 2 :(得分:19)
在给予adb remount
之后您是否尝试adb root
了?
答案 3 :(得分:7)
我遇到了同样的问题,这里有解决方法:
之前有人提到过类似的东西。
感谢下面的评论。
答案 4 :(得分:7)
如果你得到无法复制和权限是正确的禁用selinux。
检查是否启用了selinux。
$ adb shell
$su
# getenforce
Enforcing
启用了Selinux并阻止/强制执行。 禁用selinux
# setenforce 0
做你的事情并设置selinux来强制执行。
# setenforce 1
答案 5 :(得分:6)
此通用解决方案应适用于所有有根设备:
adb shell "su -c cat /data/data/com.android.providers.contacts/databases/contacts2.db" > contacts2.d
该命令以shell身份连接,然后以root身份执行cat
并将输出收集到本地文件中。
与@ guest-418的解决方案相反,人们不必为有问题的用户挖掘。
加号如果你贪婪并且想要同时拥有所有数据库(例如备份)
for i in `adb shell "su -c find /data -name '*.db'"`; do
mkdir -p ".`dirname $i`"
adb shell "su -c cat $i" > ".$i"
done
这会在文件名的末尾添加一个神秘的问号,但它仍然可读。
答案 6 :(得分:3)
这个答案最终为我工作:https://stackoverflow.com/a/15559278/53001
备份到文件,拉取备份,然后将其转换为tarball并将其解压缩。
adb backup -f myAndroidBackup.ab com.corp.appName
dd if=myAndroidBackup.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -
答案 7 :(得分:1)
执行adb
命令时,默认情况下,使用有限权限用户,分配给应用程序的同类有限权限用户,并且您已请求所有privelages使用设备的所有功能
这种有限的用户通过限制应用和系统之间的访问来帮助保护您的手机免受恶意软件的侵害。这是您无法在无根电话上访问应用数据和系统数据的原因。 rooting
的行为意味着成为用户0
,系统的超级用户,能够执行任何操作,并且是最高权限。但是,您的应用仍然是安全的,因为他们无法互相交谈。
现在,在访问安全文件时,请注意您 希望在访问文件时更改文件的权限,这可能会导致漏洞。
您可以使用的选项是在sdcard上以root身份制作文件的副本,将其作为标准用户进行修改,然后以root身份将其移回文件系统,同时保留文件的权限。原始文件。
答案 8 :(得分:1)
这有点晚了,但安装adbd Insecure对我有用。它使adb在生产(“安全”)设备上以root模式运行,这是你可能拥有的。
如果您想支持开发人员,Google Play也可以使用付费版本。
答案 9 :(得分:1)
自从我更新到Android Oreo后,我不得不使用此脚本修复“权限被拒绝”问题。
Mac OS X上的此脚本会将您的db文件复制到桌面。只需更改它以匹配您的ADB_PATH,DESTINATION_PATH和PACKAGE NAME。
#!/bin/sh
ADB_PATH="/Users/xyz/Library/Android/sdk/platform-tools"
PACKAGE_NAME="com.example.android"
DB_NAME="default.realm"
DESTINATION_PATH="/Users/xyz/Desktop/${DB_NAME}"
NOT_PRESENT="List of devices attached"
ADB_FOUND=`${ADB_PATH}/adb devices | tail -2 | head -1 | cut -f 1 | sed 's/ *$//g'`
if [[ ${ADB_FOUND} == ${NOT_PRESENT} ]]; then
echo "Make sure a device is connected"
else
${ADB_PATH}/adb exec-out run-as ${PACKAGE_NAME} cat files/${DB_NAME} > ${DESTINATION_PATH}
fi
答案 10 :(得分:1)
$ adb shell
$su
# getenforce
Enforcing
现在尝试
adb shell
su
chmod 777 /path/to/yout_file
从外壳退出
打开新的CMD并尝试adb pull /path/to/yout_file
现在可以正常工作。
您将遇到安全问题,因此任何应用程序都可以访问您的数据库。
答案 11 :(得分:0)
以下是我在Windows上遇到的类似问题。
D:\ProgramFiles\Android> adb pull /data/local/tmp/com.packagename_dumped_1766.dex D:\ProgramFiles\Android\com.packagename_dumped_1766.dex
adb: error: failed to copy '/data/local/tmp/com.packagename_dumped_1766.dex' to 'D:\ProgramFiles\Android\com.packagename_dumped_1766.dex': remote Permission denied
我的解决方案:
起初,我还尝试将cat
用作ansi_lumen answered,但是我遇到了CR和LR(\r\n
)字符的麻烦。
然后,我只需要通过chmod
更改那些文件权限,然后再次解决该问题即可,而不会引入其他问题。之后,可能
我们需要将其原始权限恢复为Goran Devs answered。
所以请稍加注意。
TL; DR
我的故事:
首先,我使用cat
将所有文件从android下载到我的Windows,
@echo off
cd /d %~dp0
:: %~dp0 = D:\ProgramFiles\Android\
SET ThisBatDir=%~dp0
:: adb shell ls /data/local/tmp/com.packagename_dumped_* > %~dp0\dump_file_list.txt
FOR /f "delims=" %%a in ('adb shell ls /data/local/tmp/com.packagename_dumped_*') do call :processline %%a %%~nxa
goto :eof
:: https://stackoverflow.com/questions/232651/why-the-system-cannot-find-the-batch-label-specified-is-thrown-even-if-label-e
:processline
SET RemoteFullPath=%1
set FileName=%2
:: echo "%RemoteFullPath%|%ThisBatDir%|%FileName%"
call adb shell su -c cat %RemoteFullPath% > %ThisBatDir%%FileName%
goto :eof
:eof
但是,由于Windows上的CR和LR(dex
)字符,那些下载的\r\n
文件被破坏了。
我们可以使用hexdump
以Hex + ASCII格式检查其内容(或在Notepad ++中选中“查看>显示符号>显示所有字符”)。请注意,第5和第6个字节(0d 0a)。
ssfang@MONITO ~
$ hexdump -C -n32 /cygdrive/d/ProgramFiles/Android/com.packagename_dumped_1448.dex # a bad dex
00000000 64 65 78 0d 0d 0a 30 33 35 00 f7 8e e4 b5 03 c6 |dex...035.......|
00000010 29 22 98 55 21 e9 70 49 fe c8 e4 cc fa 94 cd 63 |)".U!.pI.......c|
00000020
ssfang@MONITO ~
$ hexdump -C -n32 /cygdrive/d/ProgramFiles/Android/classes.dex # a normal dex
00000000 64 65 78 0a 30 33 35 00 b5 73 03 3a 0b 9d a2 47 |dex.035..s.:...G|
00000010 a8 78 a4 f0 bb e1 64 3f e5 b9 cb a0 bd 1b e2 71 |.x....d?.......q|
00000020
D:\ProgramFiles\Android>adb version
Android Debug Bridge version 1.0.41
Version 29.0.6-6198805
Installed as D:\ProgramFiles\Android\Sdk\platform-tools\adb.exe
D:\ProgramFiles\Android>adb shell adb version
Android Debug Bridge version 1.0.32
即使以root身份重新启动adbd,也仍然是Shell用户。
D:\ProgramFiles\Android> adb root
restarting adbd as root
D:\ProgramFiles\Android> adb shell id
uid=2000(shell) gid=2000(shell) groups=1003(graphics),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:shell:s0
所以我首先查看了它的文件性能,
D:\ProgramFiles\Android> adb shell ls -l /data/local/tmp
-rwsr-sr-x shell shell 589588 2017-09-14 15:08 android_server
-rwsr-sr-x shell shell 1243456 2017-09-14 15:08 android_server64
-rw-rw-rw- shell shell 1536 2020-03-28 17:15 com.packagename.tar.gz
-rw-r----- root root 57344 2020-03-28 17:45 com.packagename_dumped_1766.dex
drwxrwxr-x shell shell 2018-08-12 09:48 device-explorer
-rwsrwsr-x shell shell 13592 2019-02-04 17:44 drizzleDumper
-rwxrwxrwx shell shell 5512504 2018-05-06 01:27 lldb-server
-rwxr-xr-x shell shell 12808 2020-03-26 22:16 mprop
然后,更改其渗透性,
D:\ProgramFiles\Android> adb shell su -c chmod 777 /data/local/tmp/com.packagename_dumped_*
D:\ProgramFiles\Android> adb shell ls -l /data/local/tmp
-rwxrwxrwx root root 57344 2020-03-28 17:45 com.packagename_dumped_1766.dex
结果,我做到了。
D:\ProgramFiles\Android> adb pull /data/local/tmp/com.packagename_dumped_1766.dex D:\ProgramFiles\Android\com.packagename_dumped_1766.dex
/data/local/tmp/com.packagename_dumped_1766.de... 1 file pulled, 0 skipped. 3.6 MB/s (57344 bytes in 0.015s)
现在,jadx-gui-dev.exe
或sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
可以正常享用它们。
答案 12 :(得分:0)
@ guest-418提示效果很好:
adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db
但是,如果要使用GUI,请使用 Android Studio的设备文件资源管理器。
启动 Android Studio
点击右下角的设备文件浏览器 导航到您应用的文件:
/data/data/path.to.package/databases/data
右键单击并选择另存为,然后保存到本地文件夹
我最近在macOS上挂了 Android Monitor 。 设备文件资源管理器可很好地用于此目的。
答案 13 :(得分:0)
interactive_shell
adb shell "su 0 mkdir /sdcard/com.test"
adb shell "su 0 mv -F /data/data/com.test/files/ /sdcard/com.test/"
答案 14 :(得分:-5)
pull
命令是:
adb pull source dest
当你写:
adb pull /data/data/path.to.package/databases/data /sdcard/test
这意味着您将从/data/data/path.to.package/databases/data
拉出来并将其复制到/sdcard/test
,但目标必须是本地目录。您可以改为编写C:\Users\YourName\temp
。
例如:
adb pull /data/data/path.to.package/databases/data c:\Users\YourName\temp