使用root访问权限修改Android 6.0+中另一个应用程序的SQLite数据库

时间:2016-01-26 18:47:31

标签: android sqlite root selinux

我在Android中有一个应用需要使用root修改其他应用的私有数据库。目前的方法适用于所有设备,包括Lollypop,但由于SELinux,似乎在Marshmallow设备上失败。

要修改数据库,应用程序会执行以下操作:

  • 来自root:
    • 将目标数据库复制到我的应用程序文件夹,保留权限和所有权(cp -p)
    • 更改权限(chmod 777)
  • 从app,使用SQLiteDatabase类打开数据库并执行查询
  • 从根
    • 移回数据库并恢复权限

但是,在Marshmallow上,尝试使用SQLiteDatabase打开复制的数据库失败并产生以下AVC拒绝:

avc: denied { open } for path="/data/data/<my app package>/cache/<database>.db" dev="dm-0" ino=509488 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0

我唯一尝试过的是以root用户身份在文件上运行chcon u:r:untrusted_app:s0,但它表示权限已被拒绝。

此外,根据我在此处阅读的内容:https://source.android.com/security/selinux/,似乎SELinux在5.0版本中设置为强制模式,那么为什么现在这只是一个问题,现在在6.0但是没有&#39 ; t在5.0?

2 个答案:

答案 0 :(得分:1)

我刚为我的某个应用程序完成了类似的操作,因此它可以在Pixel设备上的Android 7上运行。

与您一样,我将原始数据库文件复制到我应用的位置。然后我不仅chmod他们,但我也chown / chgrp他们到我的应用程序的uid。最后,我将数据库文件切换到在其原始位置为它们找到的上下文。然后,我可以通过我的应用程序中的SqliteDatabase类访问和操作它们。

完成后,我将数据库文件移回原来的位置,将它们chg / chgrp回到拥有应用程序的uid,然后恢复它们。

这是一个巨大的痛苦。但到目前为止它似乎在我的有限测试中起作用。但请注意,在Android的更高版本中,工具箱命令似乎已被toybox命令取代,这确实会影响chown / chgrp。工具箱版本允许在同一命令中更改所有者和组。 Toybox不是这样,你必须发出chown和chgrp命令。

也可能有其他命令更改。例如,在Pixel上,grep命令现在是一个独立的二进制文件,而不是工具箱或玩具箱的一部分。

答案 1 :(得分:0)

您可以使用adb shell su 0 setenforce 0代码关闭强制执行模式并转到许可模式。

在许可模式下,您可以在没有SELinux的情况下做普通手机上的任何事情。

关闭强制执行模式后,您可以执行以前的操作。