我正在转换要在Android设备上使用的C应用程序。该程序是使用Kotlin和C混合编写的,使用Android NDK支持JNI调用。该应用程序正在使用原始套接字在两个设备之间发送自定义数据包。当我创建原始套接字时,出现的错误是:不允许进行操作。
须知:
Process p = Runtime.getRuntime().exec("su");
<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"/>
这是在应用程序中调用的原始套接字
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;
}
我希望,因为我已经授予程序对设备的根访问权限,所以我应该能够创建原始套接字。我还有什么想念的吗?
编辑:我也查看了Raw Sockets on Android,但没有回答这个问题。那里评分最高的答案是说,可以使用C / C ++通过有根设备创建原始套接字,而我有一个有根设备,可以毫无问题地构建项目的C / C ++部分。另外,请参阅例如nmap for Android,它在有根设备上使用原始套接字。
编辑::在Java应用程序中的UID是root。在尝试创建套接字之前,c代码中进程的UID是不同的用户。我无法设置进程的uid(setuid函数),并且在尝试进行操作时收到“ Operation Not Permitted”错误。