powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / повторная загрузка классов java.*
16 сообщений из 16, страница 1 из 1
повторная загрузка классов java.*
    #37710641
Известно что в java.lang.ClassLoader захардкожена проверка на классы, чьё полное имя начинается на "java." Эта проверка похоже призвана запретить загрузку классов из пакаджа java. любым загрузчиком, кроме bootstrap загрузчика (т.к. все остальные загрузчики наследуются от lava.lang.ClassLoader).
У меня возник вопрос, действительно ли никаким честным способом нельзя загрузить классы java.* ещё раз из своего загрузчика? Под честным я понимаю отсутствие предварительных хаков в коде java-core класссов (а то можно и оригинальный java.lang.ClassLoader заменить, и с изменённым запустить JVM).

Так вот, например если поступить таким образом:
- пишем свой класслоадер, который конечно унаследован от от java.lang.ClassLoader. Неважно какой родительский класслоадер укажем при создании инстанса своего загрузчика, ну пусть для определённости это будет bootstrap загрузчик (т.е. укажем null-парента);
- наш класслоадер не будет делегировать загрузку классов родительскому класслоадеру. В действительности механизма, который бы заставил нас делегировать, не существует, есть только рекомендации такого поведения;
- если не использовать нативный код, то мы в любом случае будем вынуждены воспользоваться одним из файнал методов java.lang.ClassLoader.defineClass(...) для того, чтобы создать инстанс типа java.lang.Class из массива байт, полученного из файла .class Любой из доступных нам методов ClassLoader.defineClass(...) приведёт к вызову прайват метода ClassLoader.preDefineClass(...), в котором вставлена проверка на классы java.*, запрещающая их грузить. Но, что мешает написать свой собственный нативный метод defineClass, который будет создавать инстанс java.lang.Class из массива байт аналогично тому, как это делает нативный код, вызывающийся из java.lang.ClassLoader.defineClass(...)?

Сам я ответить на этот вопрос не могу, т.к. не знаю какие именно действия производятся оригинальным нативным кодом для создания класса. Могу предположить две задачи: непосредственное создание инстанса класса из массива байт и "регистрация" этого инстанса в VM. Под "регистрацией" я имею в виду, что может быть о загруженном классе должен знать не только загрузивший его класслоадер, но и ещё какие-то части VM.

Ну вот, я задал вопрос и написал почему я сам не могу ответить на него. Возможно на форуме есть те, кто смогут помочь разобраться:)
Вопрос в любом случае едва ли может принести какую-то практическую пользу, но мне просто интересно выяснить ответ.
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710659
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валя это тебе для чего понадобилось ?
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710660
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко Валентин,

Вам нужно подменить существующий класс из java.* или добавить свой?
В любом случае это получается в хотите хакнуть JVM. Если вы хотите хакнуть свою JVM, возьмите OpenJDK и курочьте как хотите. А если у пользователя - то это невозможно (разве что найдете дыру в защите).
И основной вопрос - а зачем все это? Может, сформулируете саму проблему и мы попытаемся пойти другим путем?
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710673
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валя,

если ты написал свой класслоадер то нужно как то грузить классы им

соответственно если он не наследует стандартный ClassLoader класс то Class.forName использовать ты не сможешь

Придет писать свой Class класс - соотв переписывать JDK.
Наследовать Class незя он файнал.

А писать свою jdk и внедрять в проект тебе в компании никто не даст ты и без меня это знаешь .....
Вопрос нафига тебе это ?

Просто для фана ? Возьми как уже посоветовали OpenJDK и куроч наздоровье ...
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710677
>>И основной вопрос - а зачем все это? Может, сформулируете саму проблему и мы попытаемся пойти другим путем?
сформулирую причину подробнее: вопрос возник пока я аккумулировал свои знания о класслоадерах в письменной форме:) Вопрос носит исключительно академический характер и хакать я ничего не собираюсь, т.к. " a true Programmer uses the
Source only for knowledge and defense, never for attack
".

>>В любом случае это получается в хотите хакнуть JVM
Меня как раз интересует, действительно ли указанная проверка в java.lang.ClassLoader.preDefineClass достаточна для того, чтобы исключить возможность повторной загрузки java.* классов, или теоретически возможно загрузить их в своём класслоадере используя доступные в JVM механизмы. Способ, который видится мне, я написал. Но сказать возможен ли он теоритически, или нет - я не могу (тем более я не могу его осуществить, и не спрашиваю как. меня интересует лишь теоритическая возможность).

>>Валя это тебе для чего понадобилось ?
Для интереса, бывает и такое:) Ты меня вероятно знаешь, раз "валя" пишешь. Открой тоже личико, Фатима:ъ
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710680
>>соответственно если он не наследует стандартный ClassLoader
написал же что в указанном мысленном эксперименте - наследует
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710681
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко ВалентинМеня как раз интересует, действительно ли указанная проверка в java.lang.ClassLoader.preDefineClass достаточна для того, чтобы исключить возможность повторной загрузки java.* классов, или теоретически возможно загрузить их в своём класслоадере
Повторно нельзя загрузить классы из bootstrap. Остальные загружаются сколько угодно раз.
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710684
Повторно нельзя загрузить классы из bootstrap. Остальные загружаются сколько угодно раз
если это действительно так, то зачем тогда было вставлять дополнительную проверку на java.* в java.lang.ClassLoader? Эти классы и так заведомо грузятся бутстрапом, и значит если ваше утверждение истинно, дополнительная проверка специально для классов java.* не нужна, но она есть
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710686
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко Валентин,

знаю знаю

потом отпишу в личку
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710695
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валя, (буду писать так потому знаю тебя хорошо)

Так вот попробуй отнаследуйся от ClassLoader и перепиши там defineClass
тот который

protected final Class<?> defineClass(String name, byte[] b, int off, int len,
ProtectionDomain protectionDomain)


preDefineClass возвращает protectionDomain возвращай там new ProtectionDomain()

Хак но может прокатит
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710696
Коваленко Валентин Повторно нельзя загрузить классы из bootstrap. Остальные загружаются сколько угодно раз
если это действительно так, то зачем тогда было вставлять дополнительную проверку на java.* в java.lang.ClassLoader? Эти классы и так заведомо грузятся бутстрапом, и значит если ваше утверждение истинно, дополнительная проверка специально для классов java.* не нужна, но она есть
хотя нет, этот мой аргумент явно ошибочен. В JVM же ленивая загрузка классов, а потому вполне возможно что какие-то java.* классы окажутся незагруженными после старта JVM, и будуз грузиться позже, при необходимости. Вот на этот случай похоже проверка и вставлена.

Однако почему этой проверки достаточно, я как и прежде пока не понимаю.
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710702
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко Валентин,

>>> Однако почему этой проверки достаточно, я как и прежде пока не понимаю.

а почему нет ?
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710703
justforsqlruотнаследуйся от ClassLoader и перепиши там defineClass
тот который

protected final Class<?> defineClass(String name, byte[] b, int off, int len,
ProtectionDomain protectionDomain)


preDefineClass возвращает protectionDomain возвращай там new ProtectionDomain()

как я уже писал, чтобы повторить его поведение, придётся повторить поведение нативных прайват методов defineClass0(...),defineClass1(...),defineClass2(...)
И снова, как я уже писал - мне неизвестно что именно они делают. Свои предположения я написал в стартовом посте темы (прошу его прочитать внимательно:)) Однако то, что я не знаю что они делают и не могу их посторить, ещё не значит что это принципиально невозможно
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710705
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко Валентин,

хм да ты прав

там приватный jni вызов ...
попробуй asm и JavaAssist покопать может чего отроешь там интересного ну и Instrumentation конечно ...
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710706
>>> Однако почему этой проверки достаточно, я как и прежде пока не понимаю.
>>>>>>а почему нет ?
"вот вам лук, повесьте на дверь и никто не сможет зайти" - но почему никто не сможет?, я хочу именно понять в таком случае принципиальные причины, которые обеспечат невозможность зайти (загрузить класс).
...
Рейтинг: 0 / 0
повторная загрузка классов java.*
    #37710708
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко Валентин,

Ну наверное потому что ты не напишешь свой класслоадер минуя ClassLoader на стандартной сборке jdk

именно поэтому этой проверки достаточно
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / повторная загрузка классов java.*
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]