在已经获取root权限的Android设备上读取或写入/data目录中的文件

5

我正在尝试在已经root的手机上以编程方式读写/data目录中的文件。

首先,我使用 shell execute su确保我的程序获得了超级用户访问权限,这个步骤很顺利。

通过在程序内使用shell execs命令,我能够读写/data中的文件,但是当使用Android File或其他API时,我会收到“Permission denied”java.io.IOException错误。

如何使用API在已经root的手机上读写/data?像Root Explorer这样的程序可以实现这个功能。

谢谢。

2个回答

4
简而言之,不,通过API是严格不可能的,因为您需要确保您的修改命令以root身份运行,否则操作系统将拒绝这些操作。
您需要将修改命令管道传输到su命令,以便它作为root执行。在他的github上,Chainfire提供了一个Shell类的示例实现,您可以使用它来执行rm命令或任何其他命令作为root。
您可以以编程方式完成的一种方法是将要编辑的文件复制到临时目录中,例如/sdcard/tmp.txt,然后编辑该文件,随后将其复制回原始位置并覆盖那里的文件。
另一种方法是对目标文件进行 chmod 更改权限 (例如 chmod 777 /data/xxx.txt),以便您可以通过编程方式读写其内容。这就是为什么您会收到 Permission denied 错误的原因,因为您的程序没有访问其他文件的权限。关键在于您需要确保 chmod 命令本身被传递到 su 命令中,以便该命令不会被拒绝。我建议阅读下面链接中的指南,因为它非常详细地介绍了在必须以 root 身份运行时如何处理情况。

来源: 如何 SU


没有回答所问的问题,问题是如何访问文件而不是更改其权限。 - Chris Stratton
仍然不是一个很好的答案。请花时间学习各个权限位的作用,而不是建议将777随意应用于所有事物。 - Chris Stratton
将文件权限设置为777存在很高的风险。因为一旦将权限设置为777,这将使文件对所有其他应用程序或进程可读和可写。因此,在您的应用程序将其设置回默认权限之前,您的文件处于巨大的风险之下(如果它是机密文件)。另一个问题是,如果您的应用程序将权限设置为777并且崩溃(可能是由于其他问题),而没有恢复原始权限,则永远存在巨大的风险。因为它可以在全世界范围内被简单地读取和写入。 - ShihabSoft
你的评论有很多问题,但我会解决其中最明显的一个:如果应用程序已经修改了该文件,那么这意味着手机已经被root,也就是说,设备上存储在未加密状态下的任何数据都容易被任何应用程序检查。在这种情况下,给予该文件完全访问权限对于开发人员来说并不是最大的问题,因为设备本身已经不安全了。 - cnexus

2
通过编码,您可以添加一行代码,例如:

Runtime.getRuntime().exec("chmod 077" +your_file_you_need_to_give_permission); 

2
谢谢您的建议,但那只是部分解决了问题。我更希望能够直接获取文件权限,而不是通过chmod命令来实现。我想让我的程序在获得root访问权限(由shell执行su命令提供)的情况下,在/data目录中读写文件,而无需任何其他shell执行。 - JS_
@JS_:你能详细说明一下吗?我没听懂你的意思。 - Niki
这里的目标是让程序从根访问中受益,并本地使用读/写数据的API。您提供的解决方案可能有效,但依赖于额外的shell execs,这可能不是最佳解决方案。理想情况下,它应该通过常规API工作,就像Root Explorer或其他程序似乎在使用的那样。 - JS_
没有其他API,Root Explorer和其他应用程序使用具有su权限的shell命令。 - afollestad
将文件权限设置为777存在很高的风险。因为一旦将权限设置为777,这将使文件对所有其他应用程序或进程可读和可写。因此,在您的应用程序将其设置回默认权限之前,您的文件处于巨大的风险之下(如果它是机密文件)。另一个问题是,如果您的应用程序将权限设置为777并且崩溃(可能是由于其他问题),而没有恢复到原始权限,则永远存在巨大的风险。因为它可以在全世界范围内被简单地读取和写入。 - ShihabSoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接