
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
18.03.2012, 17:04:36
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Известно что в 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. Ну вот, я задал вопрос и написал почему я сам не могу ответить на него. Возможно на форуме есть те, кто смогут помочь разобраться:) Вопрос в любом случае едва ли может принести какую-то практическую пользу, но мне просто интересно выяснить ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 17:28:12
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Валя это тебе для чего понадобилось ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 17:29:16
|
|||
|---|---|---|---|
повторная загрузка классов java.* |
|||
|
#18+
Коваленко Валентин, Вам нужно подменить существующий класс из java.* или добавить свой? В любом случае это получается в хотите хакнуть JVM. Если вы хотите хакнуть свою JVM, возьмите OpenJDK и курочьте как хотите. А если у пользователя - то это невозможно (разве что найдете дыру в защите). И основной вопрос - а зачем все это? Может, сформулируете саму проблему и мы попытаемся пойти другим путем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 17:43:42
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Валя, если ты написал свой класслоадер то нужно как то грузить классы им соответственно если он не наследует стандартный ClassLoader класс то Class.forName использовать ты не сможешь Придет писать свой Class класс - соотв переписывать JDK. Наследовать Class незя он файнал. А писать свою jdk и внедрять в проект тебе в компании никто не даст ты и без меня это знаешь ..... Вопрос нафига тебе это ? Просто для фана ? Возьми как уже посоветовали OpenJDK и куроч наздоровье ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 17:48:27
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
>>И основной вопрос - а зачем все это? Может, сформулируете саму проблему и мы попытаемся пойти другим путем? сформулирую причину подробнее: вопрос возник пока я аккумулировал свои знания о класслоадерах в письменной форме:) Вопрос носит исключительно академический характер и хакать я ничего не собираюсь, т.к. " a true Programmer uses the Source only for knowledge and defense, never for attack ". >>В любом случае это получается в хотите хакнуть JVM Меня как раз интересует, действительно ли указанная проверка в java.lang.ClassLoader.preDefineClass достаточна для того, чтобы исключить возможность повторной загрузки java.* классов, или теоретически возможно загрузить их в своём класслоадере используя доступные в JVM механизмы. Способ, который видится мне, я написал. Но сказать возможен ли он теоритически, или нет - я не могу (тем более я не могу его осуществить, и не спрашиваю как. меня интересует лишь теоритическая возможность). >>Валя это тебе для чего понадобилось ? Для интереса, бывает и такое:) Ты меня вероятно знаешь, раз "валя" пишешь. Открой тоже личико, Фатима:ъ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 17:50:07
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
>>соответственно если он не наследует стандартный ClassLoader написал же что в указанном мысленном эксперименте - наследует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 17:51:51
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Коваленко ВалентинМеня как раз интересует, действительно ли указанная проверка в java.lang.ClassLoader.preDefineClass достаточна для того, чтобы исключить возможность повторной загрузки java.* классов, или теоретически возможно загрузить их в своём класслоадере Повторно нельзя загрузить классы из bootstrap. Остальные загружаются сколько угодно раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 17:57:34
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Повторно нельзя загрузить классы из bootstrap. Остальные загружаются сколько угодно раз если это действительно так, то зачем тогда было вставлять дополнительную проверку на java.* в java.lang.ClassLoader? Эти классы и так заведомо грузятся бутстрапом, и значит если ваше утверждение истинно, дополнительная проверка специально для классов java.* не нужна, но она есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 17:59:26
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Коваленко Валентин, знаю знаю потом отпишу в личку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 18:09:12
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Валя, (буду писать так потому знаю тебя хорошо) Так вот попробуй отнаследуйся от ClassLoader и перепиши там defineClass тот который protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) preDefineClass возвращает protectionDomain возвращай там new ProtectionDomain() Хак но может прокатит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 18:09:16
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Коваленко Валентин Повторно нельзя загрузить классы из bootstrap. Остальные загружаются сколько угодно раз если это действительно так, то зачем тогда было вставлять дополнительную проверку на java.* в java.lang.ClassLoader? Эти классы и так заведомо грузятся бутстрапом, и значит если ваше утверждение истинно, дополнительная проверка специально для классов java.* не нужна, но она есть хотя нет, этот мой аргумент явно ошибочен. В JVM же ленивая загрузка классов, а потому вполне возможно что какие-то java.* классы окажутся незагруженными после старта JVM, и будуз грузиться позже, при необходимости. Вот на этот случай похоже проверка и вставлена. Однако почему этой проверки достаточно, я как и прежде пока не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 18:13:52
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Коваленко Валентин, >>> Однако почему этой проверки достаточно, я как и прежде пока не понимаю. а почему нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 18:14:23
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
justforsqlruотнаследуйся от ClassLoader и перепиши там defineClass тот который protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) preDefineClass возвращает protectionDomain возвращай там new ProtectionDomain() как я уже писал, чтобы повторить его поведение, придётся повторить поведение нативных прайват методов defineClass0(...),defineClass1(...),defineClass2(...) И снова, как я уже писал - мне неизвестно что именно они делают. Свои предположения я написал в стартовом посте темы (прошу его прочитать внимательно:)) Однако то, что я не знаю что они делают и не могу их посторить, ещё не значит что это принципиально невозможно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 18:16:37
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
Коваленко Валентин, хм да ты прав там приватный jni вызов ... попробуй asm и JavaAssist покопать может чего отроешь там интересного ну и Instrumentation конечно ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.03.2012, 18:18:03
|
|||
|---|---|---|---|
|
|||
повторная загрузка классов java.* |
|||
|
#18+
>>> Однако почему этой проверки достаточно, я как и прежде пока не понимаю. >>>>>>а почему нет ? "вот вам лук, повесьте на дверь и никто не сможет зайти" - но почему никто не сможет?, я хочу именно понять в таком случае принципиальные причины, которые обеспечат невозможность зайти (загрузить класс). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&tablet=1&tid=2132299]: |
0ms |
get settings: |
16ms |
get forum list: |
27ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
58ms |
get topic data: |
22ms |
get forum data: |
5ms |
get page messages: |
97ms |
get tp. blocked users: |
3ms |
| others: | 363ms |
| total: | 605ms |

| 0 / 0 |
