我一直在使用 adb backup
備份Nexus 7,以將所有文件備份到加密備份中。我發現您可以使用 adb restore
從備份中進行還原,但是這會擦除設備上所有現有的數據。
我將如何精確地從加密後的數據中提取一個應用程序的數據備份文件?
我一直在使用 adb backup
備份Nexus 7,以將所有文件備份到加密備份中。我發現您可以使用 adb restore
從備份中進行還原,但是這會擦除設備上所有現有的數據。
我將如何精確地從加密後的數據中提取一個應用程序的數據備份文件?
僅供參考,以下是.ab文件格式的一些背景。
Android備份(* .ab)文件是壓縮的 TAR文件。使用 DEFLATE算法對其進行壓縮。最重要的是,可以使用 AES加密。這是在創建備份時確定的,如果輸入密碼,則備份將被加密,否則;
文件的HEADER與普通的DEFLATE存檔略有不同。它包含有關備份的信息,如下所示:
ANDROID BACKUP11none
第一行是“ Magic”行。下一行是Android備份文件格式的版本。下一行是布爾值(true或false,1或0),指示文件是否已壓縮。最後一行是加密類型。本示例未使用任何加密。如果有密碼,該行將顯示為“ AES-256”。之後是加密密碼。如果沒有密碼,則將啟動DEFLATE“歸檔”。
使用 Java Deflater對其進行壓縮。從開發人員的角度來看,如果您想使用Java以外的任何方式來提取它,則會導致問題。即使我發現的所有內容(例如C#)都應該遵循“ SPEC”,我也無法使用相同的算法找到任何可以縮小它的東西。
如此說,在Apache 2.0許可下有一個開源項目,由 Nikolay Elenkov編寫,可以將.ab提取到tar文件中。
用法:
java -jar abe.jar解壓<backup.ab> <backup.tar> <password>
如果您不確定如何真正使用它(超出此答案的範圍),則下一版的 Droid Explorer v0.8.8.7(在此處提供),您就可以直接在Explorer中執行此操作,甚至更多。您可以在我的博客上了解更多有關功能的信息(是的,我知道,無恥的插件。我會在適合問題時這樣做)
或者使用單行代碼:
(printf“ \ x1f \ x8b \ x08 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00”; tail -c +25 backup.ab) | tar xfvz-
另一種選擇是使用 bash
, cat
和 gunzip
( gzip
)。
完整的過程可能是這樣的(具有未加密的備份):
備份一個應用程序的數據(例如“ 覆蓋DNS以KitKat“):
$ adb備份-f net.mx17.overridedns.ab -noapk net.mx17.overridedns現在解鎖設備並確認備份操作。
提取壓縮數據
$ dd if = net.mx17.overridedns.ab bs = 1 skip = 24 > compression-data1285 + 0個記錄in1285 + 0個記錄輸出1285個字節(1,3 kB)已復制,0,00745877 s,172 kB / s
解壓縮壓縮數據
$ printf“ \ x1f \ x8b \ x08 \ x00 \ x00 \ x00 \ x00 \ x00” cat-壓縮數據| gunzip -c > decompressed-data.targzip:stdin:文件意外結束
“不保存” tar文件
$ tar xf decompressed-data.tar
同樣隱式的問題是,如何還原單個應用程序數據,我想提到這個漂亮的腳本,該腳本將給定的full-backup.ab拆分為single-app.ab文件:
https://sourceforge.net/projects/adb-split/
它需要jar文件:abe.jar和tar-bin-split.jar,可以在此處找到:
它至少對我的測試用例有效。
另一個選擇是使用此XDA線程的Perl AdbBackupRoutines。但是,它們有一些要求:Perl,加上 libterm-readkey-perl
, libcrypt-cbc-perl
和 libcrypt-pbkdf2-perl
(如果您的備份未加密,您可以通過簡單地註釋掉其中包含的 backupdecrypt.pl
的第103行來跳過最後一個依賴項-對我來說很好用)。
用法非常簡單:
./ backupdecrypt.pl [選項] <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
必須確定真實路徑本身。
基於其他人的信息,現在我知道備份文件只是前綴的Deflated(GZip)流,基於此信息,此簡單程序可以為您解壓縮該文件:
import java.io。*; import java.util.zip。*; / **執行命令javac unab.java && java unab backupfile.ab * / public class unab {private static final int BACKUP_HEADER_LENGTH = 24;公共靜態無效的main(String [] args)引發IOException {InputStream in = new FileInputStream(args [0]);嘗試{OutputStream out = new FileOutputStream(args [0] +“ .tar”);嘗試{如果(in.skip(BACKUP_HEADER_LENGTH)!= BACKUP_HEADER_LENGTH){拋出新IOException(“跳過備份頭時文件意外結束。”); } byte [] buffer = new byte [100 * 1024];整數計數InputStream zip = new InflaterInputStream(in); while((count = zip.read(buffer))> 0){out.write(buffer,0,count);複製代碼}}最後{out.close(); }}最後{in.close();我之所以這樣寫是因為我沒有上面提到的任何Unix工具,並且比安裝Cygwin或其他工具更容易。 優勢:
- 跨平台
- 簡單(無深奧參數)
- 不需要管道工具
缺點:
- 需要一個JDK(由於與Android SDK混淆,您可能已經有了它)
- 不支持加密備份
- 需要一些東西來提取生成的tar文件(我使用Total Commander)
要使其成為命令行工具,請創建 unab .bat
,其內容為: java -cp“%〜dp0”。 unab%*
和目錄 PATH
。
只需添加其他答案,我最終即可使用nelenkov的應用程序( https://github.com/nelenkov/android-backup-extractor)和說明進行操作此處: https://forum.xda-developers.com/showthread.php?t=2011811。我試圖避免為Java佔用額外的800mb磁盤空間。默認情況下,大多數電話都朝著加密邁進,我認為nelenkov的應用程序是唯一可與加密配合使用的解決方案。
這是nelenkov的jar發行版的直接鏈接。檢查其是否為最新版本: https://github.com/nelenkov/android-backup-extractor/releases/tag/20181012025725-d750899
然後按照鏈接中的以下說明進行操作以上。它具有有關氦氣以及將ab文件拆分為單個應用程序文件的更多信息。還有一種更改未設置為不使用root的adb備份的應用程序的方法。如果使用此發行版文件,請替換 abe-all.jar
。
1)將原始adb備份轉換為tar格式:
java -jar abe.jar解壓縮nexus7.ab nexus7.tar <password>
2)提取tar歸檔文件的內容。這應該在保留tar內部文件權限的文件系統上完成,例如使用linux,mac或bsd。最多可能會出現兩個文件夾(應用程序和共享文件夾):
tar -xvf nexus7.tar
現在您應該擁有新的文件夾了
順便說一句,Izzy的回答很好( https://android.stackexchange.com/a/42224/95893),但是他的腳本需要安裝幾個perl模塊,我無法輕易找到第三個。他的應用程序功能齊全,但可以在Adebar-master / tools /中找到adb2tar。同樣,它不適用於加密的ab文件。