คุณดึงข้อมูลของแอพจากการสำรองข้อมูลเต็มรูปแบบที่ทำผ่าน“ การสำรองข้อมูล adb” ได้อย่างไร?


117

ฉันสำรองข้อมูล Nexus 7 ของฉันด้วยadb backupเพื่อสำรองไฟล์ทั้งหมดเป็นข้อมูลสำรองที่เข้ารหัส ฉันเห็นว่าคุณสามารถกู้คืนจากข้อมูลสำรองด้วยadb restoreแต่จะลบข้อมูลที่มีอยู่ทั้งหมดของฉันบนอุปกรณ์

ฉันจะแยกข้อมูลของแอพหนึ่งออกจากไฟล์สำรองที่เข้ารหัสนี้ได้อย่างไร


คำตอบ:


113

เพียงเพื่อการอ้างอิงของผู้อื่นนี่คือพื้นหลังบางส่วนในรูปแบบไฟล์. ab

ไฟล์ Android Backup (* .ab) เป็นไฟล์TAR ที่ถูกบีบอัด มันถูกบีบอัดโดยใช้อัลกอริทึมDEFLATE ยิ่งไปกว่านั้นสามารถใช้การเข้ารหัส AESได้ สิ่งนี้จะถูกกำหนดเมื่อคุณสร้างการสำรองข้อมูลหากคุณป้อนรหัสผ่านการสำรองข้อมูลจะถูกเข้ารหัสมิฉะนั้น ไม่มีการเข้ารหัสมันถูกบีบอัดเท่านั้น

HEADER ของไฟล์แตกต่างจากไฟล์ DEFLATE ปกติเล็กน้อย มันมีข้อมูลเกี่ยวกับการสำรองข้อมูลและมีลักษณะดังต่อไปนี้:

ANDROID BACKUP
1
1
none

บรรทัดแรกเป็น"เวทมนตร์" บรรทัด บรรทัดถัดไปเป็นเวอร์ชันของรูปแบบไฟล์สำรองของ Android บรรทัดถัดไปคือบูลีน (จริงหรือเท็จ, 1 หรือ 0) เพื่อระบุว่าไฟล์ถูกบีบอัดหรือไม่ บรรทัดสุดท้ายคือประเภทของการเข้ารหัส ตัวอย่างนี้ไม่ได้ใช้การเข้ารหัสใด ๆ หากมีรหัสผ่านบรรทัดจะอ่าน "AES-256" หลังจากนั้นเป็นรหัสการเข้ารหัส หากไม่มีรหัสผ่าน DEFLATE "เก็บถาวร" จะเริ่มต้นขึ้น

มันถูกบีบอัดโดยใช้Java deflater ซึ่งจากมุมมองของนักพัฒนาทำให้เกิดปัญหาหากคุณต้องการใช้อะไรนอกเหนือจาก Java เพื่อแยกมันออก ฉันไม่สามารถค้นหาสิ่งใดที่สามารถทำให้ยุบได้โดยใช้อัลกอริทึมเดียวกันแม้ว่าสิ่งที่ฉันพบ (เช่น C #) ควรจะทำตาม "SPEC"

ด้วยที่กล่าวว่ามีโครงการโอเพนซอร์สภายใต้ใบอนุญาต Apache 2.0 เขียนโดยNikolay Elenkovที่จะช่วยให้คุณสามารถแยก. ab ในไฟล์ tar

การใช้งาน:

java -jar abe.jar unpack <backup.ab> <backup.tar> <password>

หากคุณไม่แน่ใจว่าจะใช้งานอย่างไร (ซึ่งเกินขอบเขตคำตอบนี้) รุ่นถัดไปของDroid Explorer v0.8.8.7 ( มีให้ที่นี่ ) จะช่วยให้คุณทำสิ่งนี้ได้อย่างถูกต้องและอีกมากจาก Explorer คุณสามารถอ่านเพิ่มเติมเกี่ยวกับฟีเจอร์ต่าง ๆ ในบล็อกของฉัน (ใช่ฉันรู้ปลั๊กไร้ยางอายฉันทำอย่างนั้นเมื่อมันเหมาะกับคำถาม)

แกะ


1
ฉันจะโหวตให้คุณถ้าฉันมีชื่อเสียงคนพระเจ้าของฉันขอบคุณ!

ยินดีต้อนรับ. ฉันรู้ข้อมูลทั้งหมดเพียงเพราะนี่เป็นคุณสมบัติที่ฉันเพิ่งเพิ่มไปยังฐานรหัส Droid Explorer ดังนั้นฉันจึงต้องทำการวิจัยเกี่ยวกับเรื่องนี้
Ryan Conrad

สวัสดี Ryan พยายามใช้ Droid Explorer แต่ล้มเหลวในการเริ่มบ่นเกี่ยวกับตำแหน่งของ Android SDK ถึงแม้ว่ามันจะได้รับการติดตั้งและฉันก็จัดหาเส้นทางที่ถูกต้อง
Umar Farooq Khawaja

@UmarFarooqKhawaja ลองดูคำถามที่พบบ่อยสำหรับ droid explorer Q / A ล่าสุดระบุปัญหาของคุณ
Ryan Conrad

ตกลงได้แยกโฟลเดอร์ 'com.app.name' ที่เกี่ยวข้องออกจาก tar แล้ว แต่ฉันจะใช้เพื่อเรียกคืนข้อมูลแอปได้อย่างไร เพียงคัดลอกโฟลเดอร์ไปยัง sdcard / Android / data / ดูเหมือนว่าจะไม่ทำงาน ...
pelms

91

หรือกับหนึ่งซับ:

( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) |  tar xfvz -

2
ดี! คุณมีเทียบเท่ากับ "แพ็ค" (ที่จะใช้ทรีไดเรกทอรีที่ไม่บีบอัดและสร้างไฟล์. db) หรือไม่
dailyglen

4
คุณสามารถเพิ่มคำอธิบายลงในคำตอบได้ไหม?
Lucky

2
นี่คือคำตอบที่ดีที่สุด: D ใช้งานได้ดีอย่างสมบูรณ์แบบ! แยกตอนนี้
xdevs23

16
คำอธิบาย: ผู้เขียนสร้างส่วนหัวไฟล์ Zlib มาตรฐานสำหรับ.tar.gzไฟล์ที่มีprintfคำสั่ง ( 0x1F 0x8Bเป็นลายเซ็น0x08เป็นวิธีการบีบอัด0x00คือแฟล็กและ 4 x 0x00เป็นเวลาประทับ) จากนั้นผนวกส่วนหัวของเนื้อหาของbackup.abไฟล์โดยเริ่มจาก offset 25d สตรีมดังกล่าวเป็น.tar.gzไฟล์ที่ถูกต้องและtar xfvzคำสั่งจะรับรู้เป็นเช่นนั้นดังนั้นจึงสามารถคลายการบีบอัดสตรีมได้สำเร็จ
antonone

3
ฉันได้สำรองข้อมูลด้วย adb 1.0.36 (แก้ไข 1.7.0.0 + r33-2) และวิธีนี้ทำให้เกิดข้อผิดพลาดจาก zgip:invalid compressed data--format violated
Rache

31

หนึ่งในตัวเลือกมากขึ้นคือการใช้bash, catและgunzip( gzip)

กระบวนการทั้งหมดอาจเป็นเช่นนี้ ( พร้อมการสำรองข้อมูลที่ไม่ได้เข้ารหัส ):

  1. สำรองข้อมูลของแอปหนึ่งตัว (เช่น " Override DNS for KitKat "):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. แยกข้อมูลที่บีบอัด

    $ dd if=net.mx17.overridedns.ab bs=1 skip=24 > compressed-data
    1285+0 records in
    1285+0 records out
    1285 bytes (1,3 kB) copied, 0,00745877 s, 172 kB/s
    
  3. ขยายขนาดข้อมูลที่บีบอัด

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
    
  4. "untar" ไฟล์ tar

    $ tar xf decompressed-data.tar
    

4
คาดหวังว่า "สิ้นไฟล์ที่ไม่คาดคิด" หรือไม่?
hft

การแตกไฟล์ใน 2 ทำงานอย่างน่าประหลาดใจกับไฟล์ที่เข้ารหัส เป็นไปได้อย่างไร? gzip: stdin: invalid compressed data--format violatedบีบอัดแล้วล้มเหลวด้วย ผมถือว่าประสบความสำเร็จในการสกัดเป็นรายงานdd 22763821+0 records in 22763821+0 records out
Tom Russell

4

อีกตัวเลือกหนึ่งคือการใช้ Perl AdbBackupRoutines จากเธรด XDAนี้ พวกเขามีความต้องการไม่กี่แม้ว่า: Perl เห็นได้ชัดบวกlibterm-readkey-perl, libcrypt-cbc-perlและlibcrypt-pbkdf2-perl(ถ้ามีการสำรองข้อมูลของคุณจะไม่ได้เข้ารหัสคุณสามารถข้ามการพึ่งพาที่ผ่านมาโดยเพียงแค่การแสดงความคิดเห็นออกบรรทัด 103 ของbackupdecrypt.plที่มันรวม - ทำงานดีสำหรับฉัน)

การใช้งานค่อนข้างง่าย:

./backupdecrypt.pl [options] <backupfile.ab> <outfile.tar>

.tarไฟล์ผลลัพธ์นั้นสามารถตรวจสอบได้เหมือนกับ tarball อื่น ๆ โครงสร้างของมันค่อนข้างน่าสนใจอย่างน้อยหนึ่งด้าน: มันไม่ได้สะท้อนถึงเส้นทางที่แท้จริงที่ไฟล์ถูกนำมา (เช่นไม่ใช่/data/data/com.app.name/databases/whatever.dbแต่แทนapps/com.app.name/db/whatever.db) - ซึ่งบ่งบอกว่าแอพสำรองในอุปกรณ์ / ROM หนึ่งอาจถูกคืนค่าเป็น อุปกรณ์ / ROM อื่น ๆ โดยไม่มีปัญหาตามที่adb restoreจะต้องทราบเส้นทางที่แท้จริงของตัวเอง


มีอีกเครื่องมือหนึ่ง (บำรุงรักษาดีขึ้นเล็กน้อย) ซึ่งทำสิ่งนี้: github.com/nelenkov/android-backup-extractor
ฝา

ขอบคุณ @lid! ฉันยังได้รวมเชลล์สคริปต์เล็กน้อย (เกือบหนึ่งซับเท่านั้น) ด้วยเครื่องมือAdebarของฉัน(Android อุปกรณ์สำรองและรายงาน) ซึ่งแปลงการสำรองข้อมูล ADB ( .ab) เป็น.tar.gzArchives :)
Izzy

4

จากข้อมูลของผู้อื่นตอนนี้ฉันรู้แล้วว่าไฟล์สำรองข้อมูลเป็นเพียงสตรีม Deflated (GZip) ที่ขึ้นต้นด้วยข้อมูลนี้โปรแกรมง่ายๆนี้สามารถแยกไฟล์ให้คุณได้:

import java.io.*;
import java.util.zip.*;

/** Run: javac unab.java && java unab backupfile.ab */
public class unab {
    private static final int BACKUP_HEADER_LENGTH = 24;
    public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream(args[0]);
        try {
            OutputStream out = new FileOutputStream(args[0] + ".tar");
            try {
                if (in.skip(BACKUP_HEADER_LENGTH) != BACKUP_HEADER_LENGTH) {
                    throw new IOException("Unexpected end of file while skipping backup header.");
                }
                byte[] buffer = new byte[100 * 1024];
                int count;
                InputStream zip = new InflaterInputStream(in);
                while ((count = zip.read(buffer)) > 0) {
                    out.write(buffer, 0, count);
                }
            } finally {
                out.close();
            }
        } finally {
            in.close();
        }
    }
}

ฉันเขียนสิ่งนี้เพราะฉันไม่มีเครื่องมือ Unix ที่กล่าวถึงข้างต้นและมันง่ายกว่าการติดตั้ง Cygwin หรือเครื่องมืออื่น ๆ

ข้อดี :

  • ข้ามแพลตฟอร์ม
  • ง่าย (ไม่มีพารามิเตอร์ลึกลับ)
  • ไม่จำเป็นต้องใช้เครื่องมือท่อ

ข้อเสีย :

  • ต้องการ JDK (ซึ่งคุณน่าจะมีอยู่แล้วเพราะคุณล้อเล่นกับ Android SDK)
  • ไม่รองรับการสำรองข้อมูลที่เข้ารหัส
  • ต้องการบางสิ่งเพื่อแยกไฟล์ tar ที่ได้ (ฉันใช้ Total Commander)

จะทำให้มันเป็นเครื่องมือบรรทัดคำสั่งสร้างunab.batกับเนื้อหาและไดเรกทอรีที่จะjava -cp "%~dp0." unab %*PATH


4

เนื่องจากคำถามโดยนัยก็คือวิธีการกู้คืนข้อมูลแอพเดียวฉันต้องการพูดถึงสคริปต์ที่ดีนี้ซึ่งจะแยกการสำรองข้อมูลเต็มรูปแบบที่กำหนดในไฟล์ single-app.ab:

https://sourceforge.net/projects/adb-split/

มันต้องการไฟล์ jar: abe.jar และ tar-bin-split.jar ที่พบได้ที่นี่:

มันทำงานอย่างน้อยสำหรับ testcase ของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.