copy db file with adb pull results in 'permission denied' error

前端 未结 15 776
执笔经年
执笔经年 2020-12-13 17:13

I just rooted my Nexus 5 using this method: http://www.phonearena.com/news/How-to-root-Google-Nexus-5_id49014

I also enabled USB debugging in the developer options.<

相关标签:
15条回答
  • 2020-12-13 17:49

    I had the same problem. My work around is to use adb shell and su. Next, copy the file to /sdcard/Download

    Then, I can use adb pull to get the file.

    0 讨论(0)
  • 2020-12-13 17:51

    You can use run-as shell command to access private application data.

    If you only want to copy database you can use this snippet, provided in 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
    
    0 讨论(0)
  • 2020-12-13 17:51

    This is a bit late, but installing adbd Insecure worked for me. It makes adb run in root mode on production ("secure") devices, which is what you likely have.

    A paid version is also available on Google Play if you want to support the developer.

    0 讨论(0)
  • 2020-12-13 17:52

    Since I've updated to Android Oreo, I had to use this script to fix 'permission denied' issue.

    This script on Mac OS X will copy your db file to Desktop. Just change it to match your ADB_PATH, DESTINATION_PATH and 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
    
    0 讨论(0)
  • 2020-12-13 17:52

    I had a similar problem to yours on windows as the following.

    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
    

    My solution:

    At first I also made an attempt to use cat as ansi_lumen answered, but I got into trouble about CR and LR (\r\n) characters. And then I just had to change those file permisions by chmod and pulled again to this problem was solved without introducing other problems. After that, may we need to restore their original permissions as Goran Devs answered.

    So just pay a little attention.

    TL;DR

    My story:

    Firstly, I used the cat to download all files from android to my 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
    

    However, those downloaded dex files were broken because of CR and LR (\r\n) characters on windows. We can use hexdump to inspect its content in Hex+ASCII form (or Notepad++ with "View > Show Symbol > Show All Characters" checked). Note, the 5th and 6th byte (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
    

    Versions

    • adb version // to check adb client version in your desktop
    • adb shell adbd --version // to check adbd's version in your Android. Please note that some users reported error with this if executed without root access.
    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
    

    Even if restarting adbd as root, it was still the shell user after .

    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
    

    So I first viewed its file permision,

    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
    

    then, changed its permision,

    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
    

    As a result, I made it.

    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)
    

    Now, jadx-gui-dev.exe or sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk could properly enjoy them.

    0 讨论(0)
  • 2020-12-13 17:55

    @guest-418 tips works well:

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

    However, if you want to use a GUI, use Android Studio's Device File Explorer.

    1. Launch Android Studio

    2. Click on Device File Explorer at bottom right-side Navigate to your app's file:

      /data/data/path.to.package/databases/data

    3. Right-mouse click select Save As and save to a local folder

    I have been having Android Monitor hang on me lately on macOS. Device File Explorer works well for this purpose.

    0 讨论(0)
提交回复
热议问题