有没有办法查看内部并修改adb备份创建的文件? -- backup 领域 和 adb 领域 android 相关 的问题

Is there a way to look inside and modify an adb backup created file?


43
vote

问题

中文

我创建了我的Galaxy Nexus的备份,其中 adb backup 。生成的文件名为backup.db,它是某种方式加密。

我想恢复备份,但它在恢复 com.android.providers.contacts 时停止。我使用 adb logcat ,了解正在发生的事情,并发现 com.android.acore 在还原过程中崩溃。

我想访问备份中的数据并删除联系人数据库以将所有内容恢复到手机。是否有任何其他方法从备份中恢复数据?

英文原文

I created a backup of my Galaxy Nexus with adb backup. The resulting file is named backup.db and it's somehow encrypted.

I wanted to restore the backup, but it stops when it comes to restoring com.android.providers.contacts. I used adb logcat to find out what's going on and found out that com.android.acore crashes during the restore process.

I'd like to gain access to the data in the backup and remove the contacts database to restore everything back to my phone. Are there any other ways restoring the data from the backup?

     
 
 

回答列表

57
 
vote

我开始工作了。我到目前为止发布了我的结果,这是一个原因的"社区维基" 答案:首先,如果其他人想加入,那么有一个谈话的地方;其次,如果我从这个项目中拉开了,那么别人就会有暗示开始工作。

主机上的备份逻辑完全包含在 https:// github.com/android/platform_system_core/blob/master/adb/commandline.cpp ,在命名为 backup 中的函数中。该功能是非常简单:它验证了命令行选项,将命令发送到手机上的adb守护程序,并将手机的输出写入文件。甚至没有错误检查:例如,如果您在手机上拒绝备份, adb 只写了一个空文件。

在手机上,备份逻辑在 service_to_fd() 中启动 https://github.com/android/platform_system_core/blob/master/adb/services.cpp 。该函数标识来自主机的命令是 "backup" ,并将unparsed命令传递给 /system/bin/bu ,它是 trivial shell脚本启动 com.android.commands.bu.Backup 作为新的Android应用程序进程的主类。调用 ServiceManager.getService("backup") 以将备份服务作为 abcdefghijklmn10 ,并调用 adb uninstall com.google.android.apps.maps 1 ,将其传递它仍然未使用的文件描述符(非常间接)连接到主机上的 adb uninstall com.google.android.apps.maps 2 文件。

控制传递到 adb uninstall com.google.android.apps.maps 3 在 com.android.server.backup.backupmanagerservice ,弹出GUI要求用户确认/拒绝备份。当用户这样做时, adb uninstall com.google.android.apps.maps 4 (相同的文件)被调用。如果用户批准请求,则 adb uninstall com.google.android.apps.maps 5 据备份是加密的,并将消息传递给 adb uninstall com.google.android.apps.maps 6 (相同的文件)。 adb uninstall com.google.android.apps.maps 7 然后实例化和踢掉 adb uninstall com.google.android.apps.maps 8 (相同的文件,行4004 as写入时间)

我们最终开始生成输出,在 adb uninstall com.google.android.apps.maps 9 中,行4151 和 line 4330 。

首先, restore0 写入标题,由4或9个ASCII行组成:

  1. restore1
  2. 备份格式版本:当前 restore2
  3. restore3 如果备份是未压缩的或 restore4 如果它
  4. 加密方法:目前 restore5 restore6
  5. (如果加密),在十六进制中编码的"用户密码盐" ,所有帽子
  6. (如果加密),则在十六进制中编码的"主密钥校验盐" ,所有帽子
  7. (如果加密),"使用的pbkdf2轮数" 作为十进制数:当前 restore7
  8. (如果加密),在十六进制中编码的"用户键的IV" ,所有帽子
  9. (如果加密),在十六进制中编码的"Master IV +键Blob,由用户键加密" ,所有帽子

实际备份数据如下(取决于压缩和加密) restore8 backup0 ,或 backup1

todo :写上生成tar输出的代码路径 - 只要条目处于正确的顺序,您就可以简单地使用焦油(见下文)。

tar归档格式

应用程序数据存储在app /目录下,以_manifest文件,f /,数据库中的a /,app文件中的apk(如果请求)在sp / sp /。如果请求外部存储备份(使用-shared选项),还将存在包含外部存储文件的存档中的共享/目录。

  backup2  

加密详细信息

  1. AES 256密钥使用10000次PBKDF2从备份加密密码导出,随机生成的512位盐。
  2. AES 256主键随机生成
  3. 通过使用10000轮PBKDF2运行Master键生成主键"校验和" ,其中包含新的随机生成的512位盐。
  4. 生成随机备份加密IV。
  5. iv,master键和校验和通过派生的键连接和加密。结果blob在标题中保存为十六进制字符串。
  6. 使用主键加密实际备份数据,并附在文件的末尾。

样本包/解压缩代码实现(生成/使用)tar归档: https://github.com/nelenkov/android-backup-extractor

这里有一些更多详细信息: http://nelenkov.blogspot.com / 2012/06/unpacking-android-backups.html

perl脚本用于包装/打开包装和修复损坏的档案:

http://forum.xda-developers.com/showthread。 php?p = 27840175#post27840175

 

I started working on this. I'm posting my results so far here as a "community wiki" answer for two reasons: first, if someone else wants to join in, there's a place to talk; second, if I get pulled away from this project, there'll be hints for someone else to start working.

xc2xa0

The backup logic on the host is entirely contained within https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp, in the function named backup. The function is very simple: it validates the command line options, sends the command mostly as-is to the adb daemon on the phone, and writes the phone's output to the file. There isn't even error-checking: if, for example, you refuse the backup on the phone, adb just writes out an empty file.

On the phone, the backup logic starts in service_to_fd() in https://github.com/android/platform_system_core/blob/master/adb/services.cpp. The function identifies that the command from the host is "backup", and passes the unparsed command to /system/bin/bu, which is a trivial shell script to launch com.android.commands.bu.Backup as the main-class of a new Android app process. That calls ServiceManager.getService("backup") to get the backup service as an IBackupManager, and calls IBackupManager.fullBackup(), passing it the still-unused file descriptor (very indirectly) connected to the backup.ab file on the host.

Control passes to fullBackup() in com.android.server.backup.BackupManagerService, which pops up the GUI asking the user to confirm/reject the backup. When the user do so, acknowledgeFullBackupOrRestore() (same file) is called. If the user approved the request, acknowledgeFullBackupOrRestore() figures out if the backup is encrypted, and passes a message to BackupHandler (same file.) BackupHandler then instantiates and kicks off a PerformAdbBackupTask (same file, line 4004 as of time of writing)

We finally start generating output there, in PerformAdbBackupTask.run(), between line 4151 and line 4330.

First, run() writes a header, which consists of either 4 or 9 ASCII lines:

  1. "ANDROID BACKUP"
  2. the backup format version: currently "4"
  3. either "0" if the backup is uncompressed or "1" if it is
  4. the encryption method: currently either "none" or "AES-256"
  5. (if encrypted), the "user password salt" encoded in hex, all caps
  6. (if encrypted), the "master key checksum salt" encoded in hex, all caps
  7. (if encrypted), the "number of PBKDF2 rounds used" as a decimal number: currently "10000"
  8. (if encrypted), the "IV of the user key" encoded in hex, all caps
  9. (if encrypted), the "master IV + key blob, encrypted by the user key" encoded in hex, all caps

The actual backup data follows, either as (depending on compression and encryption) tar, deflate(tar), encrypt(tar), or encrypt(deflate(tar)).

xc2xa0

TODO: write up the code path that generates the tar output -- you can simply use tar as long as entries are in the proper order (see below).

Tar archive format

App data is stored under the app/ directory, starting with a _manifest file, the APK (if requested) in a/, app files in f/, databases in db/ and shared preferences in sp/. If you requested external storage backup (using the -shared option), there will also be a shared/ directory in the archive containing external storage files.

$ tar tvf mybackup.tar -rw------- 1000/1000      1019 2012-06-04 16:44 apps/org.myapp/_manifest -rw-r--r-- 1000/1000   1412208 2012-06-02 23:53 apps/org.myapp/a/org.myapp-1.apk -rw-rw---- 10091/10091     231 2012-06-02 23:41 apps/org.myapp/f/share_history.xml -rw-rw---- 10091/10091       0 2012-06-02 23:41 apps/org.myapp/db/myapp.db-journal -rw-rw---- 10091/10091    5120 2012-06-02 23:41 apps/org.myapp/db/myapp.db -rw-rw---- 10091/10091    1110 2012-06-03 01:29 apps/org.myapp/sp/org.myapp_preferences.xml 

Encryption details

  1. An AES 256 key is derived from the backup encryption password using 10000 rounds of PBKDF2 with a randomly generated 512 bit salt.
  2. An AES 256 master key is randomly generated
  3. A master key 'checksum' is generated by running the master key through 10000 rounds of PBKDF2 with a new randomly generated 512 bit salt.
  4. A random backup encryption IV is generated.
  5. The IV, master key, and checksum are concatenated and encrypted with the key derived in 1. The resulting blob is saved in the header as a hex string.
  6. The actual backup data is encrypted with the master key and appended to end of the file.

Sample pack/unpack code implementation (produces/uses) tar archives: https://github.com/nelenkov/android-backup-extractor

Some more details here: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

Perl scripts for packing/unpacking and fixing broken archives:

http://forum.xda-developers.com/showthread.php?p=27840175#post27840175

 
 
         
         
15
 
vote
vote
最佳答案
 

文件未加密,除非您在创建备份时指定如此。然而,压缩(使用放气)。您可以通过查看Android源(COM / Android / Server / BackupManagManAgerService.java)代码来了解确切的格式,并且在技术上,应该能够从中提取特定数据。但是,IIRC,有一些文件完整性检查到位,所以如果您只删除了一堆数据,它可能不会起作用。不幸的是<代码> restore 命令似乎没有一个选项来恢复特定的app /包或排除包。

 

The file is not encrypted, unless your specify so when creating the backup. It is however compressed (using deflate). You can find out the exact format by looking at Android source (com/android/server/BackupManagerService.java) code, and, technically, should be able to extract specific data from it. However, IIRC, there are some file integrity checks in place, so it most probably won't work if you just delete a bunch of data from it. Unfortunately the restore command doesn't seem to have an option to restore a particular app/package only or exclude a package.

 
 
         
         
7
 
vote

从 Nikolay Elenkov 。但是,我应该补充说,有人已经开发了一个这样做的软件并在这里​​打包它: http:// sourceforge。网/项目/ adbextractor /

包包含Java和Perl工具。我自己在任何一天都更喜欢java,所以我提取了perl代码,确保它们是可执行的,安装了所需的perl库,并运行 backup3 对阵adb备份文件,它将它转换为没有任何问题的焦油或谷拓的tar文件。

我甚至在bash 3中形成了一个衬垫,允许我直接将adb备份做到zzipped tar文件:

  backup4  

希望它有所帮助。

 

Great and detailed answer from Nikolay Elenkov. However I should added that somebody already develop a software that do just that and package it here: http://sourceforge.net/projects/adbextractor/

The package contains both Java and Perl tool. I myself prefer Perl over Java any day, so I extracted the Perl codes, make sure they are executable, installed the required Perl library, and run the backupdecrypt.pl against an adb backup file, and it convert it into a tar or gzipped tar file without any issue.

I even formed a one liner in Bash 3 that allow me to do adb backup directly to gzipped tar file:

adb backup -f >(backupdecrypt.pl -D -z - backup.tgz) -all 

Hope it helps.

 
 
   
   
-4
 
vote

for浏览现有备份文件,请尝试 http://www.adb-backup.com 页面,没有"DD" ,"tar" ,...

数据未存储在此服务器上。我已经开发了这个在线服务,让您更轻松地查看备份而无需使用DD / Tar操作或安装其他软件。我是www.adb-backup.com

 

For explore existing backup file, try http://www.adb-backup.com page, it is simple without "dd", "tar", ...

Data is not stored on this server. I've developed this online service to make it easier to view backups without manipulating with dd / tar or installing additional software. I'm author www.adb-backup.com

 
 
       
       

相关问题

0  恢复WhatsApp聊天和数据  ( Restore whatsapp chat and data ) 
我最近闪过我的xperia z2,在闪烁之前,我拍摄了手机​​内部内存的备份,留下了一种令人印象来自动恢复WhatsApp数据。但在闪烁的过程完成后,我再次安装WhatsApp,我没有看到以前的消息或数据。 有人对此有任何想法。 任何帮助将非常感激。 ...

0  如何将我的所有联系人从旧的HTC WildFifre Android 2.1转移到LG Optimus Vu  ( How can i transfer my all contacts from old htc wildfifre android 2 1 to lg opti ) 
我只想用Android版本2.1与Android版本为4.0的新LG Optimus Vu转移所有联系人。我使用了不同的应用,但我仍然无法传输联系人和意外错误发生。另一个问题是我无法将联系人移动到SD卡,因为LG Optimus Vu不支持SD卡。请推荐一个简单且简单的方法或应用程序,有助于将联系人从HTC Wild...

1  使用Skydrive或Dropbox将我的Android设备备份到云端,同样有效地使用专用备份应用程序?  ( Is backing up my android device to the cloud using skydrive or dropbox equally a ) 
与使用MS Skydrive或Dropbox备份我的Android智能手机(无根)备份我的应用程序,照片,联系人,短信文本等,与使用Google Play商店的专用备份应用程序,例如我的备份亲吗?情况是,如果使用专用应用程序,则该情况如此有效,但过程更简单,耗时较少,耗费耗时。 这适用于一般备份和备份,以便在升级到新...

4  备份联系人,照片,应用程序,删除Google帐户,并替换为虚拟帐户  ( Backup contacts photos apps remove google account and replace with dummy acc ) 
我想从手机上取消我的主要Google帐户,而不是使用虚拟帐户。我并不真正使用Google,语音等的任何谷歌的服务,以获得安全性,丢失原因,防止谷歌自动为我提供"功能" 和同步,最终以我没有的方式合并数据想要,我宁愿将我的在线谷歌帐户与我的手机分开。我一直在阅读一些关于如何备份或删除帐户的帖子,但我想在前进之前了解一些...

1  如何在SIM卡上备份联系人到我的电脑?  ( How can i backup contacts on a sim card to my computer ) 
我的兄弟要我在他的SIM卡中备份数据。如何将此复制到我的计算机而不弄乱我自己的联系人? ...

1  如何通过adb备份和恢复APN设置?  ( How to backup and restore apn setting via adb ) 
如何通过adb备份和恢复APN设置? 我在没有root的Android 6.0上。 ...

31  通过adb备份和恢复Android设置和应用程序  ( Backup and restore android settings and application through adb ) 
我想询问是否有可能通过adb备份和恢复所有Android设置和应用程序。 我试过: adb backup -all adb: unable to connect for backup 它不起作用,而所有其他命令都在工作。 是可以使用这个 bmgr ...

1  Android 5.1 adb备份与Android 6.0不兼容吗?  ( Is an android 5 1 adb backup incompatible with android 6 0 ) 
我最近在我的nexus 4上加载了cyanogenmod 13.在闪烁之前,我做了一个完整的adb备份和com.king.candycrushsaga的app数据备份。似乎需要恢复的唯一仍然是烛台数据,但亚行恢复似乎没有做这项工作。它只是在/ sdcard / android / data中创建一个空文件夹。 我使用...

6  如何使用Yaffs2访问.img文件?  ( How do i access img files with yaffs2 ) 
我已经尝试在Ubuntu中安装它们,没有运气, mount 无法识别Yaffs2文件系统。我尝试了 yaffs2utils 和 ./unyaffs2 但它实际上并没有解压缩IMG文件,我在Google代码页 here 。 IMG文件是由CWM恢复为备份创建的,我正在尝试挖掘文件系统以查找旧联系人,如果我可以获得.d...

5  恢复rom备份  ( Restore a rom back up ) 
我要在我的手机上试试yananogenmod。然而,在我这样做之前,我对一件事很好奇。我执行了一个NANDROID备份,每个我在本网站上收到的指令(谢谢BRYAN),以及所有我的应用程序和数据的钛备份。我对的是 - 说我真的搞砸了在Cyanogenmod过程中的东西吗?我该如何从中恢复?从我自己的研究来看,它看起来像...

2  适用于Android手机(无计算机)建议使用哪些备份/同步应用程序? [关闭]  ( What backup sync app is recommended for android phones without computer ) 
关闭。这个问题是 off-topic 。它目前不接受答案。 想要改进这个问题?更新这个问题,所以它是关于android爱好者堆栈交换的主题。 关闭 ...

3  为什么我的手机在执行备份时会陷入困境?  ( Why does my phone keep getting stuck when performing a backup ) 
我扎根了我的手机,目前在My Sprint HTC Hero上有一个较旧版本的紫花底mod。当我尝试使用ROM管理器执行备份时,手机尝试重新启动,但它永远不会完成启动。任何导致它以及如何备份手机的想法,以便升级到最新版本的紫绀? ...

50  adb backup创建0字节文件;即使我从未设置为一个,也会提示当前备份密码; “无法设置密码”桌面备份密码  ( Adb backup creates 0 byte file prompts for current backup password even though ) 
问题: 每次运行adb备份时,我会在主屏幕底部附近的消息说 Backup starting... ,后跟一条消息,然后是一条消息,然后是一条消息 Backup finished 几秒钟后来尽管我正在使用17 GB的设备内存,并且使用0个字节的大小创建生成的备份文件。我没有收到错误消息,没有反馈,无论是什么都是错误的...

23  新手机:如何转让游戏进展?  ( New phone how to transfer game progress ) 
我打算买一个新的Android手机,我希望能够转移我在几款游戏中的进展到新设备,所以我不必再次从头开始播放所有级别。 我目前有一个htc欲望,并将购买HTC EVO 3D。 可能没有简单/一般的解决方案。 但我想知道是否有人做了类似的事情,可以提供一些建议(例如,在哪里寻找可能保存游戏进度信息的文件)。 ...

1  将WhatsApp历史转移到人员身上  ( Transferring whatsapp history from person to person ) 
我用人x删除了我的whatsapp历史,但对话历史仍然存在于x的手机上。所以我可以从X的手机上恢复历史吗? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.