在已扎根的android设备中创建原始套接字时,“不允许操作”。 Java的UID是root,C代码的UID不是root

时间:2019-04-26 06:56:40

标签: kotlin android-ndk java-native-interface raw-sockets

我正在转换要在Android设备上使用的C应用程序。该程序是使用Kotlin和C混合编写的,使用Android NDK支持JNI调用。该应用程序正在使用原始套接字在两个设备之间发送自定义数据包。当我创建原始套接字时,出现的错误是:不允许进行操作。

须知:

  1. android设备已植根并在其上运行lineageos 14.1
  2. 通过以下命令在启动时为应用程序授予根访问权限:
Process p = Runtime.getRuntime().exec("su");
  1. 在android清单中,已经授予Internet权限,并且我已经能够创建普通套接字
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.NET_ADMIN" tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.NET_RAW" tools:ignore="ProtectedPermissions"/>
  1. Android设备已连接到我的网络

这是在应用程序中调用的原始套接字

s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

if (s == -1) {
    ktprint("[open_sockraw] socket(): %s\n", strerror(errno)); //the error being returned is Operation Not Permitted.
    return -1;
}
  1. 我试图在C代码中设置用户的UID,但出现“不允许操作”错误。

我希望,因为我已经授予程序对设备的根访问权限,所以我应该能够创建原始套接字。我还有什么想念的吗?

编辑:我也查看了Raw Sockets on Android,但没有回答这个问题。那里评分最高的答案是说,可以使用C / C ++通过有根设备创建原始套接字,而我有一个有根设备,可以毫无问题地构建项目的C / C ++部分。另外,请参阅例如nmap for Android,它在有根设备上使用原始套接字。

编辑::在Java应用程序中的UID是root。在尝试创建套接字之前,c代码中进程的UID是不同的用户。我无法设置进程的uid(setuid函数),并且在尝试进行操作时收到“ Operation Not Permitted”错误。

0 个答案:

没有答案