我正在编写实现Raw套接字的类来修改我的root电话上的某个特定数据包。但是我无法授予该类的su特权。
我尝试的是启动root权限进程来启动另一个活动,该活动将调用JNI类并创建原始套接字。但是,它仍然没有使用root UID,而是普通用户UID。
是否可以将root权限授予我将以编程方式调用的NDK库。感谢您提供任何帮助/线索。
答案 0 :(得分:0)
通过执行“su”获取root权限只会在子进程中打开子shell。然后,您可以使用root权限运行linux命令和二进制程序。但是你的应用程序根本没有“根”,只有“子shell”才有根。所以我们可以利用的是子壳 当您使用命令“am start xxxx”从子shell启动Activity时,它不会创建当前进程的子进程,而是与Android系统进行通信。系统然后为“am”命令引用的应用程序启动一个单独的进程并启动Activity,这与单击主屏幕上的图标相同。
所以解决方案是:
您可以将操作原始套接字的代码编译为可执行文件,它从命令行接受参数。您可以将其解压缩到应用程序的文件目录(/data/data/com.example/files),然后从root的子shell中运行它。
如果要使用root权限执行某些java代码。该方法类似于在PC上执行java程序。生根的java代码将从Java类的Main方法开始。因此,创建一个java类,如com.example.Abcd,并实现方法'public static void main(String [] args)“。
之后,您可以从rooted子shell执行几个命令来调用它:
export CLASSPATH=$CLASSPATH:"+pkgPath
可以调用pkgPath调用 getPackageCodePath() 。
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 priviledge运行的类的实际类名。
- 参数将传递给您的班级。
现在你的java类应该已经使用root priviledge运行,作为应用程序子shell的子进程,进程树将如下所示:
.....
|-[Another app]
|-[Another app]
|-[Your application](unrooted)
|--[Sub-shell](rooted)
|--[Your java class](rooted)
但请注意,此类中的所有Android功能都不,例如获取当前应用程序的files目录,因为Context
作为Android应用程序丢失了。你的java类被限制在一个盒子里。由于这个事实,不会为类加载应用程序的库路径。您现在需要System.loadLibrary()
的完整路径。我没有在极少数情况下使用JNI所以我不知道细节,对不起......