我正在开发 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 所说,您需要获得访问相关特定设备的权限。如果您没有说许可,那么除了漏洞利用之外,您将不会得到它。
你最终想要达到什么目标?