【问题标题】:Read private file (/data/data folder) in rooted device在根设备中读取私有文件(/data/data 文件夹)
【发布时间】:2014-03-01 19:10:09
【问题描述】:

我需要访问另一个应用程序的私有文件夹中包含的文件。我已授予我的应用程序 root 权限并更改了权限 - 虽然我认为没有必要 - 但是当我尝试从文件中读取时,我得到“权限被拒绝”。

这是代码:

File file = new File("/data/data/other.app/shared_prefs/file.xml");
if(file.exists()) {

  try {
      Runtime.getRuntime().exec("su");
      Runtime.getRuntime().exec("chmod 777 " + file.getAbsolutePath());
      InputStream in = new FileInputStream(file);

      ....
  } catch (IOException e) {
      e.printStackTrace();
  }
}

【问题讨论】:

  • 这里不应该是空格"chmod 777"在文件名前?
  • 感谢您指出这一点。我已经编辑了代码,但我仍然无法打开文件

标签: android inputstream root


【解决方案1】:

您可能无法做到这一点,因为 android 上的每个应用程序都有一个具有唯一权限的用户。

看到这个:http://developer.android.com/guide/topics/security/permissions.html#userid

应用程序存储的任何数据都将分配给该应用程序的用户 ID,并且通常不能被其他包访问。当使用 getSharedPreferences(String, int)、openFileOutput(String, int) 或 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) 创建新文件时,您可以使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 标志来允许任何其他包读取/写文件。设置这些标志时,该文件仍归您的应用所有,但已正确设置其全局读取和/或写入权限,因此任何其他应用都可以看到它。

【讨论】:

  • 嗯,我不同意。有“根浏览器”可以在任何地方浏览和打开文件(也是我试图打开的那个),所以这是可行的
  • 这个答案对于“Android”是正确的,但不适用于具有某种“su”根垫片的黑客构建。
【解决方案2】:

你不能像那样分解 su 和 chmod 操作。

这段代码: Runtime.getRuntime().exec("su"); Runtime.getRuntime().exec("chmod 777" + file.getAbsolutePath());

不会导致在 root shell 中执行 chmod。每次调用 exec 都会启动一个新进程。

您需要在一个进程中运行所有您需要的命令。最简单的方法是在您的 /data/data 目录中编写一个 shell 脚本,为您执行这些操作,然后通过 sh shell 处理器运行它。

请注意,良好的安全做法是在您的应用程序中完成该文件后将文件 chmod 恢复为不可读,这样您就不会永远暴露其他应用程序。

这个答案看起来有你需要的东西:Run binary from with root Android Application

【讨论】:

  • 感谢您的帮助。那么调用 exec(String[]) 应该可以工作,而不是调用 exec(String) 两次?
  • 没有。你不理解。 exec() 无论参数数量如何,都会创建一个进程。参数被视为具有多个命令参数的单个命令行。你需要用一个命令完成你想做的事情。使用 adb shell 找到一个可以执行您想要的操作的命令行命令。例如 exec("/system/bin/sh", "-c", "su && chmod 777" + file.getAbsolutePath()) 可能会做你想做的事。
  • 是的,现在我明白了问题所在,请参阅下面的答案
【解决方案3】:

已解决


使用此代码运行命令已解决:

public static void runAsRoot(String[] cmds){
   try {
       Process p = Runtime.getRuntime().exec("su");
       DataOutputStream os = new DataOutputStream(p.getOutputStream());
       for (String tmpCmd : cmds) {
           os.writeBytes(tmpCmd+"\n");
       }
       os.writeBytes("exit\nexit\n");
       os.flush();
       p.waitFor();
   } catch(IOException e) {
       e.printStackTrace();
   } catch(InterruptedException e) {
       e.printStackTrace();
   }
}

【讨论】:

    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多