0

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

你可以通过 cls_tm = (*env)->FindClass(env, "javax/crypto/Cipher");

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

4

1 回答 1

2

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

每个类都由类加载器加载。类加载器形成一个层次结构,“引导”类加载器位于最顶层。加载应用程序类的类加载器由 Android 应用程序框架创建;它是“系统”类加载器的子类,它是引导加载器的子类。

当您的应用程序引用一个类时,它会要求其类加载器按名称查找它。每个加载器要么返回它定义的类,要么要求其父类找到它。(默认行为是先询问父级,但单个加载器可以覆盖它。)

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

(JNIFindClass调用实际上有点奇怪。根据您调用它的位置,它实际上可能最终出现在系统类加载器中,而不是您的应用程序的加载器中。请参阅JNI 提示中的本节以获取解释。)

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

无论如何,如果有人修改了您的 APK,他们将不得不重新签名;由于他们没有您的私钥,因此它看起来不像来自您的应用程序。

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

于 2013-06-11T00:02:50.573 回答