Java: URLClassLoader хранит загруженные классы в каталоге Temp
Я пытаюсь загрузить файл JAR из Интернета, используя URLClassLoader
, все работает нормально, но все загруженные классы хранятся во временном каталоге Windows, и могут быть скопированы для деобфускации, пока я не позвоню classLoader.close();
что в свою очередь вызовет программу ClassNotFoundException
,
Могу ли я загрузить классы без сохранения на диск?
(Только память) Другое решение для шифрования jar-классов и написания собственного ClassLoader, который будет расшифровывать классы, но я не нахожу никаких примеров.
Я пытался искать документы или статьи на эту тему, но ничего не нашел:(
Подскажите пожалуйста, возможно ли это реализовать и где я могу взять материал по теме? Спасибо!
2 ответа
Вы понимаете, что любой, у кого есть доступ к машине, на которой вы запускаете код, всегда может овладеть кодом, который будет выполнять пользовательскую загрузку классов, верно? Это означает, что они могут просто декомпилировать сам этот класс и заставить его записывать расшифрованные классы, что делает это упражнение бессмысленным. Правда, большинство людей не будут знать, как это сделать, но это возможно.
Мой совет - просто запутать код, если вы действительно должны это сделать. Беспокойство по поводу того, что люди завладеют вашей библиотекой, далеко не уйдет, поскольку вы мало что можете сделать, чтобы защитить ее от декомпиляции, если только вы не используете запутанные конструкции кода, которые могут сбить с толку декомпилятор (или функции jad
и лайки не поддерживают и, следовательно, заставляют их создавать серьезно испорченный декомпилированный код).
Любой, обладающий достаточными знаниями и надлежащей мотивацией, найдет способ сделать это.
Довольно просто создать свой собственный ClassLoader, который извлекает классы из сети. В документации Java пример для Classloader:
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
функция, вы можете иметь шифрование или что-нибудь еще.