Java: URLClassLoader сохраняет загруженные классы во временном каталоге

Я пытаюсь загрузить файл jar из Интернета с помощью URLClassLoader, все работает нормально, но все загруженные классы сохраняются во временном каталоге Windows и могут быть скопированы для деобфускации, пока я не вызову classLoader.close();, что, в свою очередь, вызовет программу ClassNotFoundException.

Могу ли я загрузить классы без сохранения на диск?

(Только память) Другое решение шифрует классы jar и пишет собственный ClassLoader, который будет расшифровывать классы, но я не нашел примеров.

Я попытался найти документы или статьи по этой теме, но ничего не нашел :(

Подскажите пожалуйста, возможно ли реализовать и где можно взять материал по теме? Спасибо!


person Draiget    schedule 24.03.2014    source источник
comment
Если код является конфиденциальным (у кода тоже есть уровни конфиденциальности, как и у данных), то вам нужно хранить его на сервере, которым вы управляете. Он не должен быть доступен локально на рабочем столе или устройстве, которым управляет [потенциальный] злоумышленник.   -  person jww    schedule 07.09.2014


Ответы (2)


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

Мой совет состоял бы в том, чтобы просто запутать код, если вы действительно должны это сделать. Беспокойство о том, что кто-то завладеет вашей библиотекой, не принесет вам пользы, так как вы мало что можете сделать, чтобы защитить ее от декомпиляции, если только вы не используете запутывающие конструкции кода, которые запутают декомпилятор (или функции jad и тому подобное). не поддерживают и, таким образом, заставляют их создавать серьезно поврежденный декомпилированный код).

Любой, у кого есть достаточные знания и надлежащая мотивация, найдет способ сделать это.

person carlspring    schedule 24.03.2014
comment
Я не знаю надежного способа защиты помимо обфускации, но эта защита точно так же, как и обфускация кода, только замедляет процесс декомпиляции. - person Draiget; 24.03.2014
comment
Я понял, что Java должна быть открытой и что любые библиотеки, написанные на ней, должны быть такими же. Если бы двоичные файлы в Java предназначались для шифрования, декомпиляция кода не была бы намного проще, чем в мире C++. Я думаю, что Java хотела, чтобы разработчики защищали свой код с помощью лицензий. Просто посмотрите на бум лицензий, который возник через несколько лет после того, как Java стала настолько популярной. Многие из этих лицензий очень сильно связаны с проектами Java (хотя они и сформулированы так обобщенно). - person carlspring; 24.03.2014

Довольно просто создать свой собственный ClassLoader, который извлекает классы из сети. В примере документации по Java для загрузчика классов:

class NetworkClassLoader extends ClassLoader {
     String host;
     int port;

     public Class findClass(String name) {
         byte[] b = loadClassData(name);
         return defineClass(name, b, 0, b.length);
     }

     private byte[] loadClassData(String name) {
         // load the class data from the connection
          . . .
     }
 }

Вам нужно только реализовать loadClassData, а все остальное будет сделано за вас. В этой функции loadClassData у вас может быть шифрование или что-то еще.

person Laplie Anderson    schedule 24.03.2014
comment
Да, вы можете прочитать банку в памяти и загрузить классы оттуда, но кто-то все равно может декомпилировать ваш класс, реконструировать его, перекомпилировать и заменить ваш пользовательский загрузчик классов своим. На самом деле это просто напрасные усилия. При должной мотивации люди, которые знают, что делают, справятся с этим. - person carlspring; 24.03.2014