Android/Java标准包名是否受保护



我需要在NDK c++代码中引用一个内置的Android Java类。

你可以用cls_tm = (* env) -> FindClass (env,"javax/密码/密码");

我担心有人可以篡改apk,提取java代码,然后用包名javax.crypto创建自己的类。密码,并读取我传递给它的所有敏感数据。我是Java和Android的新手,所以我想知道是否有可能创建自己的包,与内置包javax.crypto.Cipher相同的名称?

可以创建具有相同名称的类。但是,它们不能取代现有的类。

每个类都由类装入器装入。类装入器形成一个层次结构,"bootstrap"类装入器位于最顶端。加载应用程序类的类加载器是由Android应用程序框架创建的;它是"system"类加载器的子类,而"system"类加载器是引导加载器的子类。

当你的应用程序引用一个类时,它要求它的类加载器通过名称找到它。每个加载器要么返回自己定义的类,要么请求其父类找到它。(默认的行为是先请求父节点,但是一个单独的加载器可以覆盖它。)

javax.crypto.Ciphercore.jar的一部分,由引导类加载器加载。因此,除非应用程序的类装入器决定用自己的版本替换Cipher,否则您将获得系统版本。

(JNI FindClass调用实际上有点奇怪。取决于你在哪里调用它,它可能会在系统类加载器而不是应用的加载器中结束。有关解释,请参阅JNI Tips中的这一节。

假设你真的想替换Cipher。你可以提供自己的版本,你的应用代码会很乐意使用它。但是,当您尝试将其传递给core.jar中的其他代码时,您的应用程序将失败。这是因为在VM中加载的类不是按名称唯一的,而是按名称和类装入器的组合唯一的。所以你不能把Cipher+MyAppLoader传递给需要Cipher+bootstrap的东西。

无论如何,如果有人修改了你的APK,他们必须重新签名;因为他们没有你的私钥,所以它看起来不像一个来自你的应用程序。

如果有人修改了设备并用自己的版本替换了系统Cipher,他们可以为所欲为。

最新更新