16

如果我socket()在 JNI C 方法中调用函数,应用程序仍然会失败并出现权限错误。如果我在 AndroidManifest.xml 中添加了 uses-permission 行,问题就解决了。

因此,似乎在 Dalvik 虚拟机中没有实现 Android 权限检查,因为我正在调用本机 C 函数并且仍然被检查。我想知道如何在 Android 内核中执行检查,或者通过ptrace拦截每个系统调用或任何其他方式来跟踪应用程序。非常感谢。

4

2 回答 2

19

检查由 Linux 内核执行,使用组成员身份来确定访问权限。

如果您查看 VM 中的 zygote fork 代码,您可以使用 setgroups() 来设置补充组 ID。如果您在应用程序框架代码中仔细观察它,您可以看到它在哪里确定权限并将它们传递给 forkAndSpecialize()。

于 2011-03-01T20:29:24.623 回答
5

本机代码在 SDK 应用程序使用的同一沙箱中运行,因此受制于与 SDK 应用程序相同的安全模型。

请参阅下载 Android NDK

如果您编写本机代码,您的应用程序仍会打包到 .apk 文件中,并且它们仍会在设备上的虚拟机内运行。基本的 Android 应用程序模型不会改变。

于 2011-03-01T13:10:05.737 回答