adb backup
创建了Galaxy Nexus的备份。生成的文件名为backup.db并以某种方式进行了加密。我想还原备份,但是在还原
com.android.providers.contacts
时它停止了。我使用adb logcat
找出正在发生的事情,并发现com.android.acore
在还原过程中崩溃。我想访问备份中的数据并删除通讯录数据库以恢复所有内容到我的手机。还有其他方法可以从备份还原数据吗?
#1 楼
除非您在创建备份时指定,否则文件不会加密。但是,它已压缩(使用放气)。您可以通过查看Android源代码(com / android / server / BackupManagerService.java)找出确切的格式,并且从技术上讲应该可以从中提取特定数据。但是,IIRC进行了一些文件完整性检查,因此,如果您仅从文件中删除一堆数据,则很可能无法使用。不幸的是,restore
命令似乎没有选择仅还原特定应用程序/软件包或排除软件包的选项。 评论
谢谢!这至少是查看文件内部的起点。如果我没有为备份提供密码,那会更容易。
– ingorichter
2012年5月23日5:44
如果您提供了密码,则它确实是加密的。 BackupManagerService包含有关实际加密算法的详细信息,并且密钥派生参数(盐,迭代计数等)写在文件头中。由于您知道密码,因此可以派生密钥并解密数据。因此它仍然可行,但并不是特别容易...
– Nikolay Elenkov
2012年5月23日下午5:57
是的,我目前正在从BackupManagerService中提取所有内容以读取备份文件的内容。这是一项艰巨的工作,但是我需要我的数据……
– ingorichter
2012年5月23日在6:20
@ingorichter有什么进展吗?
– jon
2012年5月29日下午16:38
@ingorichter我开始研究这个问题,并在下面的“社区Wiki”答案中发布了大量注释。随时添加。
– jon
2012年5月29日23:58
#2 楼
我开始研究这个。到目前为止,我将我的结果作为“社区Wiki”答案发布在这里,其原因有两个:第一,如果其他人想加入,那么有个交流的地方。第二,如果我退出该项目,那么会有其他人开始工作的提示。主机上的备份逻辑完全包含在https中://github.com/android/platform_system_core/blob/master/adb/commandline.cpp,位于名为
backup
的函数中。该函数非常简单:它验证命令行选项,将命令大部分原样发送到电话上的adb守护程序,并将电话的输出写入文件。甚至没有错误检查:例如,如果您拒绝在电话上进行备份,则adb
只会写出一个空文件。在电话上,备份逻辑从https中的
service_to_fd()
开始://github.com/android/platform_system_core/blob/master/adb/services.cpp。该函数标识来自主机的命令是"backup"
,并将未解析的命令传递给/system/bin/bu
,这是一个琐碎的shell脚本,用于启动com.android.commands.bu.Backup
作为新的Android应用程序进程的主要类。这将调用ServiceManager.getService("backup")
以获得作为IBackupManager
的备份服务,然后调用IBackupManager.fullBackup()
,并将仍未使用的文件描述符(非常间接地)传递给主机上的backup.ab
文件。控制权传递给
fullBackup()
com.android.server.backup.BackupManagerService,它弹出GUI要求用户确认/拒绝备份。用户这样做时,将调用acknowledgeFullBackupOrRestore()
(相同的文件)。如果用户批准了该请求,则acknowledgeFullBackupOrRestore()
会确定备份是否已加密,然后将消息传递给BackupHandler
(相同的文件。),然后BackupHandler
实例化并启动一个PerformAdbBackupTask
(相同的文件,撰写本文时为第4004行)。 > 我们终于开始在
PerformAdbBackupTask.run()
中的第4151行和第4330行之间生成输出了。 >run()
"ANDROID BACKUP"
如果备份未压缩,则为
"4"
;如果备份为非压缩,则为"0"
加密方法:目前为
"1"
或"none"
(如果已加密),以十六进制编码的“用户密码盐”,全部大写(如果已加密),“主密钥校验和” “ salt”(以十六进制编码),所有大写字母
(如果已加密),将“使用的PBKDF2轮数”作为十进制数:当前
"AES-256"
(如果已加密),“ IV用十六进制编码的用户密钥”,全部大写
(如果已加密),用十六进制编码的“主IV +密钥blob,由用户密钥加密”,全部大写
实际的备份数据如下(取决于压缩和加密)
"10000"
,tar
,deflate(tar)
或encrypt(tar)
。TODO:编写代码生成tar输出的路径-只要输入顺序正确,您就可以简单地使用tar(请参见下文) )。
Tar存档格式
应用程序数据存储在app /目录下,从_manifest文件,APK(如果需要)在a /中开始,应用程序文件在f /中,db /中的数据库和sp /中的共享首选项。如果您请求外部存储备份(使用-shared选项),则归档中还将包含一个共享目录,其中包含外部存储文件。
$ 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
加密详细信息
AES 256密钥是使用10000轮PBKDF2随机从备份加密密码中得出的生成512位盐。
随机生成AES 256主密钥。
通过使用新随机生成的512位盐通过10000轮PBKDF2运行主密钥来生成主密钥“校验和”。
将生成随机备份加密IV。
将IV,主密钥和校验和与从1派生的密钥进行连接和加密。生成的blob作为十六进制字符串保存在标头中。实际的备份数据使用主密钥加密,并附加到文件末尾。
示例打包/解压缩代码实现(生产/使用)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
评论
如果您将代码放在某个地方,我也许可以加入。 OP(@ngorichter)可能现在也有一些可用的代码:)解压缩并提取实际文件的实用程序可能会很有用,因此您只能还原部分(如果您具有root用户)。
– Nikolay Elenkov
2012年5月30日,1:12
至于加密部分,我必须查找它的详细信息,但是密钥是使用PBKDF2由Salt和设备解锁PIN,密码或模式(转换为字符串)派生的。主密钥是随机生成的,并使用源自密码的密钥进行加密。首先获取它以用于未加密的存档。如果您遇到问题,可以实施解密部分。
– Nikolay Elenkov
2012年5月30日,1:14
抱歉,密钥实际上是根据您在开始备份时指定的密码得出的。
– Nikolay Elenkov
2012年5月30日下午4:16
@NikolayElenkov我还没有任何代码,但是我确实计划编写一个实用程序来处理ab文件。 。加密,我认为这并不困难;只是我只看了代码的那一部分。同样,我已经跟踪了生成tar流的代码路径(上面尚未写过),但尚未检查实际格式是否为GNU tar。
– jon
2012年5月30日上午10:31
哇,您的分析给我留下了深刻的印象。我从BackupManagerService中提取了一些代码到一个简单的Groovy脚本中,但是当我运行该程序时,结果总是一样的:输入了错误的密码!我使用简单的密码创建了一个新备份,但是密码验证再次失败。目前,我尝试按照上述程序查找错误。
– ingorichter
2012年5月31日在21:28
#3 楼
Nikolay Elenkov的详尽回答。但是,我应该补充一点,有人已经开发出可以执行此操作的软件,并将其打包在此处:http://sourceforge.net/projects/adbextractor/该软件包同时包含Java和Perl工具。我自己比Java更喜欢Perl,所以我提取了Perl代码,确保它们可执行,安装了所需的Perl库,并针对adb备份文件运行
backupdecrypt.pl
,然后将其转换为tar或gzip压缩的tar文件,任何问题。我什至在Bash 3中形成了一个衬板,使我可以将adb备份直接备份到压缩的tar文件中:
adb backup -f >(backupdecrypt.pl -D -z - backup.tgz) -all
希望对您有所帮助。
评论
是的,他们打包了我编写的工具(Java编写的工具):)我还帮助将其移植到Perl。如果您不阅读自述文件,则可能不会立即发现首先出现自述文件,然后是工具...。
– Nikolay Elenkov
2014年8月27日在2:02
我已进行备份,但尚未创建.ab文件,而是已创建.backup文件。我想知道如何提取它。另外我不确定是否已将所有照片和视频都备份了?
– hajirazin
15年4月13日在19:04
#4 楼
要浏览现有的备份文件,请尝试http://www.adb-backup.com页面,它很简单,没有“ dd”,“ tar”,... ...数据不存储在此服务器上。我开发了此在线服务,以使其更轻松地查看备份,而无需使用dd / tar或安装其他软件。我是www.adb-backup.com
评论
对于将adb备份(并提供密码)上传到随机网站,我会非常小心... adb备份中包含的数据是私有数据,您无法知道该站点对备份的处理方式。它可能无害,但我不建议您这样做。
–bmdixon
18年1月19日在16:28
根据Metasmoke的说法,这是垃圾邮件网址。除此之外,我完全同意@bmdixon的意见-尤其是在存在安全方式的情况下,请务必在本地执行任务。
– Izzy♦
18年1月20日在20:27
@Izzy无论如何,我将其标记为垃圾邮件并将其报告给SmokeDetector。
– iBug
18年1月21日在14:19
数据未存储在此服务器上。我开发了此在线服务,以使其更轻松地查看备份,而无需使用dd / tar或安装其他软件。我是www.adb-backup.com
– Liszak
18年1月21日在20:50
评论
我相信没有使用Java的答案都不会在加密电话上起作用。在这里查看我的答案:android.stackexchange.com/a/224474/95893总结了nelenkov应用程序的使用(github.com/nelenkov/android-backup-extractor)。不幸的是,Izzy的Adebar perl脚本ab2tar不适用于加密的备份文件。相似:android.stackexchange.com/questions/28481/…