Android - 将 root 权限授予原始套接字 class

Android - Grant root privilege to raw socket class

我正在编写实现原始套接字的 class 来修改我的根 phone 上的某些特定数据包。但是我不能授予 class su 权限。

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

是否有任何方法可以向我的 NDK 库授予 root 权限,该库将以编程方式调用。感谢任何 help/clues。

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

所以解决方案是:

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

  2. 如果你想用root权限执行一些java代码。此方法类似于在 PC 上执行 java 程序。根 java 代码将从 Java class 的 Main 方法开始。所以创建一个 java class 例如 com.example.Abcd,并实现方法 'public static void main(String[] args)”。 之后你可以从 root sub-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 中执行 class: export CLASSPATH=$CLASSPATH:"+pkgPath
此行将 pkgPath 附加到环境变量 $CLASSPATH.
的末尾 在java中生成命令行:
String line1 = "export CLASSPATH=$CLASSPATH:" + getPackageCodePath();

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

现在您的 java class 应该已经是 运行 root 权限,作为您应用程序 sub-shell 的 sub-process,进程树将看起来像:

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

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