【问题标题】:Android native - How does native code written in jni run with root permission?Android native - 用 jni 编写的原生代码如何在 root 权限下运行?
【发布时间】:2018-08-15 09:55:50
【问题描述】:

我有一个通过 jni 调用本机共享库的 Android 应用程序。这个共享库调用了一些可加载的内核模块。ko

当 jni 调用共享库中调用内核模块的函数时,我的应用程序运行失败。但是当我使用这个共享库编写一个可执行文件时,调用上述函数时它工作正常。

我发现我的应用程序以用户名“u0_axx”运行,而我的可执行文件通过 root 命令行运行。所以可能它没有调用内核模块的权限。

我的问题是这个本机代码如何在 root 权限下运行?或者解决此类问题的解决方案?

Ps:我也尝试使用Runtime.getRuntime().exec("su") 并将<uses-permission android:name="android.permission.ACCESS_SUPERUSER"/> 添加到清单中,但它没有帮助并获得权限被拒绝的异常。我的设备已植根,我的应用被构建为系统应用。

【问题讨论】:

  • 在我看来就像 ANDROID: How to gain root access in an Android application? 的副本。 方法 不能有权限。每个进程都授予 Root 权限。
  • 这个答案是为了在 Java 中以 root 权限执行 shell 命令。我希望 jni 调用的共享库中的本机代码以 root 权限运行,以便它可以调用内核函数。
  • 我还向其他人询问了与该问题相关的问题:stackoverflow.com/questions/51844210/…,但现在我找不到如何为此授予 root 访问权限。
  • 我担心answer 很清楚:您不能在 Java 应用程序中拥有 root 权限,即使那是系统应用程序。对于您的特定请求,您需要一些中介进程(以 su 身份运行),它可以接收来自您的 Java 或本机代码的请求,并为您调用内核函数。
  • 如果你想要一个更权威的答案,here 它是由 Dianne Hackborn 提供的。

标签: android c java-native-interface native android-source


【解决方案1】:

您可以将您的应用设置为系统运行,

android:sharedUserId="android.uid.system"

这需要一些额外的步骤,但它不会让您的 JNI 代码访问内核模块。

为此,您需要一些中介进程(以 root 身份运行),它可以接收来自 Java 或本机代码的请求,并为您调用内核函数。你可以使用

Runtime.getRuntime().exec("su …")

但是,从 init.rc 将这个中介进程作为服务启动可能会更容易。像 https://github.com/SpazeDog/rootfw 这样的专门库也可能会有所帮助。

您可以在https://boundarydevices.com/android-security-part-1-application-signatures-permissions/找到更多解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多