Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Принцип работы ClassLoader и защита классов ClassLoader в Java — это часть Java Runtime Environment (JRE), которая загружает классы Java в память при их первом использовании. В Java классы не встроены напрямую в исполняемый код; они загружаются по мере необходимости.
Создание и компиляция нашей .jar
В нашей .jar будет несколько классов: основной класс Main, который будет запускать остальные, и два других класса для проверки работы ClassLoader.
Main.java:
Main:
public class Main {
public static void main(String[] args) {
test2.One();
test3.Two();
}
}
Test1.java:
test1:
public class test1 {
public static void One() {
System.out.println("был загружен 1 class");
}
}
Test2.java:
test2:
public class test2 {
public static void Two() {
System.out.println("был загружен 2 class");
}
}
Чтобы скомпилировать эти файлы в .jar:
Нажмите Win + R, введите cmd и запустите командную строку.
Перейдите в директорию, где находятся файлы .java. Например, C:\Users\user\Desktop.
Введите команду javac -d ./build *.java. В папке build появятся несколько файлов .class.
Перейдите в директорию build командой cd build и создайте .jar файл командой jar cvf test.jar *.
Откройте созданный .jar файл через WinRAR, перейдите в папку META-INF и откройте файл MANIFEST.MF.
Вставьте в самом низу Main-Class: Main, сохраните документ и выйдите.
Шифрование класса
Теперь создадим класс Crypter для шифрования нашего класса:
Скомпилируйте и запустите этот класс командой java Crypter. Если у вас открылось окно, значит вы сделали всё правильно, дальше можно просто закинуть файл. [
Если вы увидите сообщение Encryption completed. Посмотреть вложение 284966
значит шифрование прошло успешно.
Загрузка и расшифровка класса
Теперь напишем загрузчик классов, который будет расшифровывать и загружать наш класс:
ClassLoader1:
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.security.Key;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
public class ClassLoader1 extends ClassLoader {
private static final byte[] KEY_BYTES = {
(byte)0x01, (byte)0x23, (byte)0x67, (byte)0x45,
(byte)0x89, (byte)0xCD, (byte)0xAB, (byte)0xEF,
(byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67,
(byte)0x89, (byte)0xAB, (byte)0xEF, (byte)0xCD
};
public ClassLoader1(ClassLoader parent) {
super(parent);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
File encryptedJarFile = new File("C:/Users/users/Desktop/ja1r.jar");
byte[] encryptedJarBytes = Files.readAllBytes(encryptedJarFile.toPath());
Key key = new SecretKeySpec(KEY_BYTES, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedJarBytes = cipher.doFinal(encryptedJarBytes);
try (InputStream is = new ByteArrayInputStream(decryptedJarBytes);
JarInputStream jarStream = new JarInputStream(is)) {
JarEntry entry;
while ((entry = jarStream.getNextJarEntry()) != null) {
if (entry.getName().equals(name.replace('.', '/') + ".class")) {
byte[] classBytes = jarStream.readAllBytes();
return defineClass(name, classBytes, 0, classBytes.length);
}
}
}
throw new ClassNotFoundException("Class " + name + " not found in decrypted jar");
} catch (Exception e) {
throw new ClassNotFoundException("Could not load class " + name, e);
}
}
public static void main(String[] args) {
ClassLoader1 classLoader = new ClassLoader1(ClassLoader.getSystemClassLoader());
try {
Class<?> loadedClass = classLoader.findClass("Main");
System.out.println("Loaded class: " + loadedClass.getName());
Method mainMethod = loadedClass.getMethod("main", String[].class);
String[] mainArgs = new String[]{};
mainMethod.invoke(null, (Object) mainArgs);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Скомпилируйте и запустите этот загрузчик. Если вы увидите 2 сообщения
Код:
был загружен 1 class
был загружен 2 class
значит загрузка и расшифровка прошли успешно
Теперь у вас есть базовое понимание работы ClassLoader и пример защиты классов с помощью шифрования. Вы можете доработать этот пример и создать более сложный загрузчик классов.
Принцип работы ClassLoader и защита классов ClassLoader в Java — это часть Java Runtime Environment (JRE), которая загружает классы Java в память при их первом использовании. В Java классы не встроены напрямую в исполняемый код; они загружаются по мере необходимости.
Создание и компиляция нашей .jar
В нашей .jar будет несколько классов: основной класс Main, который будет запускать остальные, и два других класса для проверки работы ClassLoader.
Main.java:
Main:
public class Main {
public static void main(String[] args) {
test2.One();
test3.Two();
}
}
Test1.java:
test1:
public class test1 {
public static void One() {
System.out.println("был загружен 1 class");
}
}
Test2.java:
test2:
public class test2 {
public static void Two() {
System.out.println("был загружен 2 class");
}
}
Чтобы скомпилировать эти файлы в .jar:
Нажмите Win + R, введите cmd и запустите командную строку.
Перейдите в директорию, где находятся файлы .java. Например, C:\Users\user\Desktop.
Введите команду javac -d ./build *.java. В папке build появятся несколько файлов .class.
Перейдите в директорию build командой cd build и создайте .jar файл командой jar cvf test.jar *.
Откройте созданный .jar файл через WinRAR, перейдите в папку META-INF и откройте файл MANIFEST.MF.
Вставьте в самом низу Main-Class: Main, сохраните документ и выйдите.
Шифрование класса
Теперь создадим класс Crypter для шифрования нашего класса:
Скомпилируйте и запустите этот класс командой java Crypter. Если у вас открылось окно, значит вы сделали всё правильно, дальше можно просто закинуть файл. [
Если вы увидите сообщение Encryption completed. Посмотреть вложение 284966
значит шифрование прошло успешно.
Загрузка и расшифровка класса
Теперь напишем загрузчик классов, который будет расшифровывать и загружать наш класс:
ClassLoader1:
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.security.Key;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
public class ClassLoader1 extends ClassLoader {
private static final byte[] KEY_BYTES = {
(byte)0x01, (byte)0x23, (byte)0x67, (byte)0x45,
(byte)0x89, (byte)0xCD, (byte)0xAB, (byte)0xEF,
(byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67,
(byte)0x89, (byte)0xAB, (byte)0xEF, (byte)0xCD
};
public ClassLoader1(ClassLoader parent) {
super(parent);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
File encryptedJarFile = new File("C:/Users/users/Desktop/ja1r.jar");
byte[] encryptedJarBytes = Files.readAllBytes(encryptedJarFile.toPath());
Key key = new SecretKeySpec(KEY_BYTES, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedJarBytes = cipher.doFinal(encryptedJarBytes);
try (InputStream is = new ByteArrayInputStream(decryptedJarBytes);
JarInputStream jarStream = new JarInputStream(is)) {
JarEntry entry;
while ((entry = jarStream.getNextJarEntry()) != null) {
if (entry.getName().equals(name.replace('.', '/') + ".class")) {
byte[] classBytes = jarStream.readAllBytes();
return defineClass(name, classBytes, 0, classBytes.length);
}
}
}
throw new ClassNotFoundException("Class " + name + " not found in decrypted jar");
} catch (Exception e) {
throw new ClassNotFoundException("Could not load class " + name, e);
}
}
public static void main(String[] args) {
ClassLoader1 classLoader = new ClassLoader1(ClassLoader.getSystemClassLoader());
try {
Class<?> loadedClass = classLoader.findClass("Main");
System.out.println("Loaded class: " + loadedClass.getName());
Method mainMethod = loadedClass.getMethod("main", String[].class);
String[] mainArgs = new String[]{};
mainMethod.invoke(null, (Object) mainArgs);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Скомпилируйте и запустите этот загрузчик. Если вы увидите 2 сообщения
Код:
был загружен 1 class
был загружен 2 class
значит загрузка и расшифровка прошли успешно
Теперь у вас есть базовое понимание работы ClassLoader и пример защиты классов с помощью шифрования. Вы можете доработать этот пример и создать более сложный загрузчик классов.