2013-06-10 3 views
0

Мне нужно сделать ссылку на встроенный Java Java-класс в коде NDK C++.Стандартные имена пакетов Android/Java:

Вы можете сделать это с помощью cls_tm = (* env) -> FindClass (env, "javax/crypto/Cipher");

Я беспокоюсь, что кто-то может вмешаться в apk, извлечь код Java, а затем создать свой собственный класс с именем пакета javax.crypto.Cipher и прочитать все конфиденциальные данные, которые я передаю ему. Я новичок в Java и Android, поэтому я хотел знать, можно ли создать собственный пакет с тем же именем, что и в таких пакетах, как javax.crypto.Cipher?

+0

Обычно компоненты в приложении, которые конфликтуют с именами компонентов платформы, отбрасываются при установке в пользу версий платформы. Возможно, можно переопределить это поведение, но даже если это не так, ваш байт-код, созданный вашим приложением, может быть изменен, чтобы вместо этого ссылаться на пользовательские компоненты с уникальными именами или поведение виртуальной машины, на которой он работает, может быть изменено или приложение может быть установленным на устройстве с модифицированной платформой, где системные версии этих пакетов были искажены. –

ответ

2

Возможно создание классов с тем же именем. Однако они не заменяют существующие классы.

Каждый класс загружается загрузчиком классов. Погрузчики классов образуют иерархию, причем загрузчик классов «bootstrap» находится на самом верху. Класс-загрузчик, который загружает классы вашего приложения, создается платформой приложений Android; это дочерний элемент загрузчика класса «system», который является дочерним элементом загрузчика начальной загрузки.

Когда ваше приложение ссылается на класс, оно просит свой загрузчик классов найти его по имени. Каждый загрузчик либо вернет класс, который он определил, либо попросит своего родителя найти его. (Поведение по умолчанию состоит в том, чтобы сначала спросить родителя, но отдельный загрузчик может переопределить это.)

javax.crypto.Cipher является частью core.jar, который загружается загрузчиком класса начальной загрузки. Поэтому, если загрузчик классов вашего приложения не решит заменить Cipher своей собственной версией, вы получите системную версию.

(The JNI FindClass вызов на самом деле немного странно. В зависимости от того, где вы находитесь, когда вы называете его, он может на самом деле в конечном итоге в классе системы загрузчика, а не загрузчик вашего приложения. См this section in JNI Tips для объяснения.)

Предположим, вы действительно хотели заменить Cipher. Вы можете предоставить свою собственную версию, и ваш код приложения будет с удовольствием использовать ее. Однако, когда вы пытаетесь передать его другому коду в core.jar, ваше приложение завершится с ошибкой. Это связано с тем, что классы, загруженные в виртуальную машину, не уникальны по имени, а скорее сочетанием имени и загрузчика классов. Поэтому вы не можете передать Cipher+MyAppLoader во что-то, что ожидает Cipher+bootstrap.

В любом случае, если кто-то изменил ваш APK, им пришлось бы его повторно подписать; так как у них нет вашего личного ключа, это не похоже на приложение, которое пришло от вас.

Если кто-то изменил устройство и заменил систему Cipher своей собственной версией, они могут делать все, что захотят.

+0

спасибо, я не знаю, почему Google не вводит собственную версию проверки LVL, я думаю, они считают, что пиратство является благоприятной функцией – pt123

Смежные вопросы