Android 中如何通过 root 权限任意操作 /data/data 目录中其它 App 的私有资源

本贴最后更新于 377 天前,其中的信息可能已经时过境迁

此文基于已经获取 root 权限的开发环境

问题

众所周知,Android 在 sdk29(Android 10)时更改了文件读写的结构,以防止 app 对用户公共文件夹进行随意读写。在 9 之前包括 9,如果想读写其它 App 私有资源可使用 libsu 库,libsu 是 magisk 作者 topjohnwu 推出的一个 Android 库,它可以为使用 root 权限的应用程序提供完整的解决方案,具体代码实现如下:

//读取其它app的私有文件
InputStreamReader fin = new InputStreamReader(SuFileInputStream.open("/data/data/其它app包名/***"));

//将文件写入到其它app的私有目录中
OutputStreamWriter fout = new OutputStreamWriter(OutputStreamWriter.open("/data/data/其它app包名/***"));

上面的文件读写函数在 Android 9 及以下系统版本中可正常运行,但是如果在 Android 10 及以上系统版本中,会提示 java.io.FileNotFoundException: No such file or directory,即找不到文件,如果你使用 adb 工具或者 MT 管理器,会发现想要操作的文件就静静的躺在那里,此时心中一万头***奔腾而过,到底哪里有问题?

解决方案

其实如果仔细看,会发现系统根目录下有个 data_mirror 目录,跟 data 很像啊,字面意思不就是 data 的镜像吗,是的,Android 通过 mount tmpfs 的方式将常见的应用目录(如 /data/data/data/user_de)使得对应用而言仅可访问和发现自己的存储目录,进而避免 stat /data/data/<package_name> 的方式探测用户安装的其他应用的存在。所以,我们可以通过操作 /data_mirror/data_ce/null/0/其它app包名/*** 的方式实现,具体代码如下:

//读取其它app的私有文件
InputStreamReader fin = new InputStreamReader(SuFileInputStream.open("/data_mirror/data_ce/null/0/其它app包名/***"));

//将文件写入到其它app的私有目录中
OutputStreamWriter fout = new OutputStreamWriter(OutputStreamWriter.open("/data_mirror/data_ce/null/0/其它app包名/***"));
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 66 关注
  • root
    8 引用 • 36 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...