【问题标题】:Android - Grant root privilege to raw socket classAndroid - 向原始套接字类授予 root 权限
【发布时间】:2018-03-25 04:08:08
【问题描述】:

我正在编写实现原始套接字的类,以修改我的根电话上的某些特定数据包。但是我不能授予该类 su 特权。

我尝试的是启动一个 root 特权进程来启动另一个将调用 JNI 类并创建原始套接字的活动。但是,它仍然不是使用 root UID 而是使用普通用户 UID 运行。

这是向我的 NDK 库授予 root 权限的任何方式,它将以编程方式调用。感谢您提供任何帮助/线索。

【问题讨论】:

    标签: android android-ndk root raw-sockets


    【解决方案1】:

    通过执行“su”获取root权限只会在子进程中打开一个子shell。然后你就可以用root权限运行linux命令和二进制程序了。但是您的应用程序根本没有“根”,只有“子外壳”是根的。所以我们可以利用的就是子shell。
    当您使用命令“am start xxxx”从子 shell 启动 Activity 时,它不会创建当前进程的子进程,而是与 Android 系统通信。然后系统为“am”命令引用的应用程序启动一个单独的进程并启动 Activity,这与单击主屏幕上的图标相同。

    所以解决办法是:

    1. 您可以将处理原始套接字的代码编译成可执行文件,它接受来自命令行的参数。您可以将其解压缩到应用程序的文件目录 (/data/data/com.example/files),然后从根子 shell 运行它。

    2. 如果你想以root权限执行一些java代码。此方法类似于在 PC 上执行 java 程序。根 Java 代码将从 Java 类的 Main 方法开始。因此,创建一个 java 类,例如 com.example.Abcd,并实现方法“public static void main(String[] args)”。 之后,您可以从 root 子 shell 执行几个命令来调用它:
      export CLASSPATH=$CLASSPATH:"+pkgPath
      可以调用 getPackageCodePath() 获取 pkgPath。
      app_process /system/bin com.example.Abcd "+parameters

    ============更多关于解决方案2======

    要在 PC 上执行 java *.jar 文件,我们可以使用命令行“java -jar abcd.jar”,但在 Android 上,我们使用“app_process”而不是“java”,我们可以使用我们的 apk 代替一个单独的 jar 文件。
    我们需要至少 2 个命令行来从我们的 apk 中执行一个类: export CLASSPATH=$CLASSPATH:"+pkgPath
    此行将 pkgPath 附加到环境变量 $CLASSPATH 的末尾。
    在java中生成命令行:
    String line1 = "export CLASSPATH=$CLASSPATH:" + getPackageCodePath();

    现在我们调用 app_process 来执行我们的 java 类:
    app_process /system/bin com.example.Abcd parameters
    - “app_process”和“/system/bin”似乎是“常数”,不应更改。
    - “com.example.Abcd”应该是您希望以 root 权限运行的类的实际类名。
    - 参数将传递给您的类。

    现在您的 java 类应该已经以 root 权限运行,作为您应用程序子 shell 的子进程,进程树将如下所示:

    .....
    |-[Another app]
    |-[Another app]
    |-[Your application](unrooted)
        |--[Sub-shell](rooted)
            |--[Your java class](rooted)
    

    但请记住,所有 Android 功能不在此类中可用,例如获取当前应用程序的文件目录,因为 Context 作为 Android 应用程序丢失。你的java类被限制在一个盒子里。由于这个事实,您的应用程序的库路径不会为该类加载。您现在需要System.loadLibrary() 的完整路径。我没有在这种罕见的情况下使用 JNI,所以我不知道细节,抱歉......

    【讨论】:

    • 这真的很有帮助!我认为第一个解决方案应该对我有用,但我想了解更多关于解决方案 2 的信息。这是否意味着我可以创建一个将调用库的 java 类(需要 root 权限),并从 root 子执行这个类-贝壳?谢谢
    • 另外,是否只能手动将可执行文件复制到应用程序的文件目录中?因为我正在使用 android CMakeList 创建一个可执行文件,但我只能在 armeabiv7 目录中找到这个文件。非常感谢
    • 我不知道 Cmake 可以做到这一点,如果它可以随意使用它。您的 libs/armeabiv7 目录(或 x86 设备上的 libs/x86 目录)将自动添加到 PATH 变量中(我猜)所以也许您可以使用名称而不是完整路径在其中执行文件,从而使事情变得更加方便。谢谢你让我知道,Cmake 可以创建可执行文件,但不只是共享库~
    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多