如果我socket()
在 JNI C 方法中调用函数,应用程序仍然会失败并出现权限错误。如果我在 AndroidManifest.xml 中添加了 uses-permission 行,问题就解决了。
因此,似乎在 Dalvik 虚拟机中没有实现 Android 权限检查,因为我正在调用本机 C 函数并且仍然被检查。我想知道如何在 Android 内核中执行检查,或者通过ptrace
拦截每个系统调用或任何其他方式来跟踪应用程序。非常感谢。
如果我socket()
在 JNI C 方法中调用函数,应用程序仍然会失败并出现权限错误。如果我在 AndroidManifest.xml 中添加了 uses-permission 行,问题就解决了。
因此,似乎在 Dalvik 虚拟机中没有实现 Android 权限检查,因为我正在调用本机 C 函数并且仍然被检查。我想知道如何在 Android 内核中执行检查,或者通过ptrace
拦截每个系统调用或任何其他方式来跟踪应用程序。非常感谢。
检查由 Linux 内核执行,使用组成员身份来确定访问权限。
如果您查看 VM 中的 zygote fork 代码,您可以使用 setgroups() 来设置补充组 ID。如果您在应用程序框架代码中仔细观察它,您可以看到它在哪里确定权限并将它们传递给 forkAndSpecialize()。
本机代码在 SDK 应用程序使用的同一沙箱中运行,因此受制于与 SDK 应用程序相同的安全模型。
请参阅下载 Android NDK:
如果您编写本机代码,您的应用程序仍会打包到 .apk 文件中,并且它们仍会在设备上的虚拟机内运行。基本的 Android 应用程序模型不会改变。