我正在开发 Android 应用程序中的一些路由功能,并且需要访问 ioctls。由于使用 ioctls 的应用程序需要 root 权限才能运行,所以我能够调用它们的唯一方法是链接一个单独的可执行文件并从 Java 调用它Runtime.getRuntime().exec()
。
有没有办法在不构建单独的可执行文件的情况下从 Android 中的 JNI 访问 root 权限?构建可执行文件是访问 ioctl 的最佳方法吗?
我正在开发 Android 应用程序中的一些路由功能,并且需要访问 ioctls。由于使用 ioctls 的应用程序需要 root 权限才能运行,所以我能够调用它们的唯一方法是链接一个单独的可执行文件并从 Java 调用它Runtime.getRuntime().exec()
。
有没有办法在不构建单独的可执行文件的情况下从 Android 中的 JNI 访问 root 权限?构建可执行文件是访问 ioctl 的最佳方法吗?
非 root 进程无法成为 root(除了漏洞利用),所以是的,您需要一个单独的进程。
这是从 linux 继承而来的,不同之处在于没有直接的方法可以从启动器以 root 身份启动 android 应用程序进程,因为这会向 zygote 发送一个意图,它会分叉并降低专门从事应用程序进程的子进程的特权。(可能有一种迂回的方法来手动创建一个应用程序进程,但是你必须有一个应用程序进程才能做到这一点,所以它从定义上讲是一个辅助进程。作为一个不是zygote 的子级不会继承系统库的共享映射,因此必须将其自己的唯一副本加载到内存中)
ioctl() 只是另一个系统调用,并且仅在对该 fd(来自其设备文件)的访问权限允许时才需要 root。显然,您想使用的就是这种情况,但其他人则没有特权。例如大部分Android框架IPC最终都是用Binder ioctl实现的,它们通常用于控制网络套接字。
ioctl() 调用不明确要求使用 root 权限(或任何特定权限)。正如 Chris Stratton 所说,您需要获得访问相关特定设备的权限。如果您没有说许可,那么除了漏洞利用之外,您将不会得到它。
你最终想要达到什么目标?