【Android改机系列】全息备份原理剖析
上一篇帖子:【Android改机系列】一键新机原理剖析 主要分析的是一键新机功能,一键新机主要用于批量(恶意)注册、拉新之用。今天来介绍全息备份原理及应用。
原版下载地址:https://www.lanzous.com/i5489ri
密码:Dalvik
原版是跑不起来的!跑不起来的!跑不起来的!只供技术分析之用。
全息备份简介
什么是全息备份
一款App运行之后会在应用沙盒目录data/data/xxx或者/sdcard或者/Android/甚至Settings.Global/Secure/System(理论上是没有权限)中生成该App在运行时候产生的文件,例如登录状态,App的设置,聊天文件,游戏存档等等。
全息备份就是备份该App在运行时候已经产生的所有文件,然后在一款新机器中再还原这些文件。
这个时候在新机器中运行该App,你在之前手机中的所有登录状态,App的设置,聊天文件,游戏存档都会出现在这台手机中,所以就不用担心你在该App中的聊天记录或者设置信息丢失。
全息备份能做什么
普通应用场景
举个最简单的例子:你用一台用了五年的Android手机,手机上安装了高德地图、微信、抖音、旅行青蛙等App,现在你手机机已经卡的不行了打算换一台手机,但是又不想之前高德地图的离线地图和微信中的聊天记录和闯关游戏记录丢失。
你想在新手机中也拥有之前的离线地图和微信中的聊天记录和闯关记录,这个时候就需要全息备份,把之前旧手机中所有的数据都搬运到新手机中。
实际上miui和emui等国产第三方定制系统都具有一键换机功能(好像只能在同品牌手机中换)。
改机应用场景
全息备份的实现
传统实现方案
免root实现方案
app必须有FLAG_ALLOW_BACKUP属性才能进行全息备份,也就是androidMannifest.xml文件中android:allowBackup属性设置为ture
第一步
arrayList 需要备份的包名列表
private static void fullBackup(File file, ArrayList<String> arrayList, boolean z) {
int i = 0;
IBackupManager asInterface = Stub.asInterface(ServiceManager.getService("backup"));
if (asInterface == null) {
Log.e("ContentValues", "Can't obtain Backup Manager binder");
return;
}
ParcelFileDescriptor parcelFileDescriptor = null;
try {
parcelFileDescriptor = openParcelFile(file);
String[] strArr = new String[arrayList.size()];
if (VERSION.SDK_INT <= 19) {
Method[] methods = IBackupManager.class.getMethods();
int length = methods.length;
while (true) {
if (i >= length) {
break;
}
Method method = methods[i];
if ("fullBackup".equals(method.getName())) {
method.setAccessible(true);
method.invoke(asInterface, new Object[]{parcelFileDescriptor, Boolean.valueOf(z), Boolean.valueOf(false), Boolean.valueOf(false), Boolean.valueOf(false), Boolean.valueOf(false), arrayList.toArray(strArr)});
break;
}
i++;
}
} else {
asInterface.fullBackup(parcelFileDescriptor, z, false, false, false, false, false, true, (String[]) arrayList.toArray(strArr));
}
if (parcelFileDescriptor != null) {
try {
parcelFileDescriptor.close();
} catch (IOException e) {
}
}
} catch (Exception e2) {
Log.e("ContentValues", "Unable to invoke backup manager for backup", e2);
if (parcelFileDescriptor != null) {
try {
parcelFileDescriptor.close();
} catch (IOException e3) {
}
}
} finally {
if (parcelFileDescriptor != null) {
try {
parcelFileDescriptor.close();
} catch (IOException e4) {
}
}
}
}
第二步
{
Package packageR = (Package) methodHookParam.args[0];
ApplicationInfo applicationInfo = packageR.applicationInfo;
String str2 = packageR.applicationInfo.packageName;
applicationInfo.flags |= 32768;
applicationInfo.flags |= 131072;
}
第三步
try {
Stub.asInterface(ServiceManager.getService("backup")).acknowledgeFullBackupOrRestore(i, true, "", "", new FullObserver());
} catch (RemoteException e) {
e.printStackTrace();
}
}
第四步
结束语
源码位置:
2. 原版改机的全息备份是有点问题的,不能完整运行。不知道作者故意写错还是不小心写错的,总之我破解修改后的代码是能完美运行的。
- End -
看雪ID:seandong
https://bbs.pediy.com/user-766159.htm
本文由看雪论坛 seandong 原创
转载请注明来自看雪社区
往期热门回顾
﹀
﹀
﹀
公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com
↙点击下方“阅读原文”,查看更多干货