Вопрос Создал прекрасный обфускатор, сливать?

aka wqzxqz
Начинающий
Статус
Оффлайн
Регистрация
24 Ноя 2024
Сообщения
448
Реакции[?]
6
Поинты[?]
5K

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

Сделал обфускатор который ломает класс и добавляет кастомный класслоадер и лаунчер главного класса. Нужно дофиксить: запуск обфусцированных читов, а также сделать нормальную обфускацию не через XOR.

Обфускатор сделан нейронкой, то есть полностью все коды от ИИ, но при этом на небольших джарках - работает. Как запускать джарки - разберетесь. Делаю 2 дня обфускатор и уже есть прогресс. В дальнейшем буду делать модификацию JVM и свою жвм для этого обфускатора в целом и ломание байткода по другому

Будет много людей, кому нужен обфускатор который хоть что то может - сливаю
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
28 Июл 2020
Сообщения
190
Реакции[?]
11
Поинты[?]
8K
Бля заебали со своими гптфускаторами, что толку от них? Ваши пасты это не спасет, все ваши кастом класс лоадеры дампятся нищим агент дампером, заебете

Да и все ваши обф на стринги и т.п без полезные, на все ваши флоу и подобная шалупень трансформер пишется проще чем посрать сходить
 
aka wqzxqz
Начинающий
Статус
Оффлайн
Регистрация
24 Ноя 2024
Сообщения
448
Реакции[?]
6
Поинты[?]
5K
Бля заебали со своими гптфускаторами, что толку от них? Ваши пасты это не спасет, все ваши кастом класс лоадеры дампятся нищим агент дампером, заебете

Да и все ваши обф на стринги и т.п без полезные, на все ваши флоу и подобная шалупень трансформер пишется проще чем посрать сходить
каким дампером мне попробовать сдампить мою обфу?)))
 
Начинающий
Статус
Оффлайн
Регистрация
4 Дек 2021
Сообщения
187
Реакции[?]
7
Поинты[?]
4K
Сделал обфускатор который ломает класс и добавляет кастомный класслоадер и лаунчер главного класса. Нужно дофиксить: запуск обфусцированных читов, а также сделать нормальную обфускацию не через XOR.

Обфускатор сделан нейронкой, то есть полностью все коды от ИИ, но при этом на небольших джарках - работает. Как запускать джарки - разберетесь. Делаю 2 дня обфускатор и уже есть прогресс. В дальнейшем буду делать модификацию JVM и свою жвм для этого обфускатора в целом и ломание байткода по другому

Будет много людей, кому нужен обфускатор который хоть что то может - сливаю
сливай
 
Начинающий
Статус
Оффлайн
Регистрация
26 Май 2024
Сообщения
139
Реакции[?]
1
Поинты[?]
0
Сделал обфускатор который ломает класс и добавляет кастомный класслоадер и лаунчер главного класса. Нужно дофиксить: запуск обфусцированных читов, а также сделать нормальную обфускацию не через XOR.

Обфускатор сделан нейронкой, то есть полностью все коды от ИИ, но при этом на небольших джарках - работает. Как запускать джарки - разберетесь. Делаю 2 дня обфускатор и уже есть прогресс. В дальнейшем буду делать модификацию JVM и свою жвм для этого обфускатора в целом и ломание байткода по другому

Будет много людей, кому нужен обфускатор который хоть что то может - сливаю
жду с нетерпением)
 
aka wqzxqz
Начинающий
Статус
Оффлайн
Регистрация
24 Ноя 2024
Сообщения
448
Реакции[?]
6
Поинты[?]
5K
Сделал обфускатор который ломает класс и добавляет кастомный класслоадер и лаунчер главного класса. Нужно дофиксить: запуск обфусцированных читов, а также сделать нормальную обфускацию не через XOR.

Обфускатор сделан нейронкой, то есть полностью все коды от ИИ, но при этом на небольших джарках - работает. Как запускать джарки - разберетесь. Делаю 2 дня обфускатор и уже есть прогресс. В дальнейшем буду делать модификацию JVM и свою жвм для этого обфускатора в целом и ломание байткода по другому

Будет много людей, кому нужен обфускатор который хоть что то может - сливаю
если чо в этом обфускаторе свой реверсер байткода, а также своя таблица ключей на уровень выше XOR'а. Деобф легко, но если постараетесь - будет тяжело дампить/деобфить. Скоро выложу
если чо в этом обфускаторе свой реверсер байткода, а также своя таблица ключей на уровень выше XOR'а. Деобф легко, но если постараетесь - будет тяжело дампить/деобфить. Скоро выложу
Вот код класслоадера который грузит ключи и байткод:


Java:
package argentoz.protect;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Arrays;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.concurrent.ConcurrentHashMap;

public class SecureClassLoader extends ClassLoader {
    private static final byte[] KEY = {0x48, 0x2A, 0x7C, 0x3F, 0x12, 0x59, 0x6E, (byte) 0x8B, 0x4D, 0x77, 0x0F, 0x3C, (byte) 0x9A, (byte) 0xE3, 0x5D, 0x2B};
    private static final byte SIMPLE_KEY = 0x48;
    private static final byte[] MASTER_KEY = {
            0x48, 0x2A, 0x7C, 0x3F, 0x12, 0x59, 0x6E, (byte)0x8B,
            0x4D, 0x77, 0x0F, 0x3C, (byte)0x9A, (byte)0xE3, 0x5D, 0x2B,
            0x7F, 0x1D, 0x39, 0x62, (byte)0xA3, 0x27, 0x45, 0x53,
            0x69, 0x33, 0x18, (byte)0xD4, (byte)0xE7, 0x0B, 0x74, (byte)0xC9
    };
    private static final int[] ROTATION_TABLE = {
            7, 12, 17, 22, 5, 9, 14, 20, 4, 11, 16, 23, 6, 10, 15, 21
    };
    private static final byte[] SUBSTITUTION_BOX = {
            (byte)0xE2, 0x4F, (byte)0xA1, 0x35, (byte)0xB7, 0x6C, 0x1D, 0x29,
            0x58, (byte)0xF3, 0x07, (byte)0xD9, 0x4A, (byte)0x8E, 0x63, (byte)0xC5,
            0x3B, 0x72, (byte)0x91, 0x0F, (byte)0xE8, 0x55, (byte)0xCD, 0x36,
            (byte)0xA4, 0x2E, (byte)0xF7, 0x1B, 0x60, (byte)0x8C, 0x47, (byte)0xD2
    };
    private static final byte[] INVERSE_SUBSTITUTION_BOX = createInverseSBox(SUBSTITUTION_BOX); // Инверсная S-Box
    private final Map<String, byte[]> classData = new HashMap<>();
    private final Map<String, Class<?>> loadedClasses = new HashMap<>();
    private final Map<String, Integer> decryptionMethod = new ConcurrentHashMap<>();
    private final Set<String> problemClasses = new HashSet<>();
    private final String jarPath;
    private final URL codeBase;
    private static final String[] INITIAL_PROBLEM_CLASSES = {
            "mpp/venusfr/ui/mainmenu/MainScreen",
            "mpp/venusfr/scripts/lua/classes/EntityClass",
            "mpp/venusfr/utils/client/IMinecraft",
            "mpp/venusfr/events/TickEvent"
    };
    private static final Set<String> PARENT_LOADED_PACKAGES = new HashSet<>(Arrays.asList(
            "mpp.venusfr.scripts.lua.classes.",
            "mpp.venusfr.utils.client.",
            "mpp.venusfr.events.",
            "net.minecraft.",
            "net.optifine."
    ));
    private static final int NO_DECRYPT = 0;
    private static final int STANDARD_XOR = 1;
    private static final int SIMPLE_XOR = 2;
    private static final int ADVANCED_ENCRYPTION = 3;

    public SecureClassLoader(ClassLoader parent, String jarPath) {
        super(parent);
        this.jarPath = jarPath;
        this.codeBase = getCodeBaseURL();

        try {
            for (String problemClass : INITIAL_PROBLEM_CLASSES) {
                problemClasses.add(problemClass);
            }

            loadClassesFromJar();

            for (String problemClass : problemClasses) {
                decryptionMethod.put(problemClass, ADVANCED_ENCRYPTION); // Используем продвинутое шифрование по умолчанию
            }

            System.out.println("SecureClassLoader initialized with " + classData.size() + " classes");
        } catch (IOException e) {
            throw new RuntimeException("Failed to initialize secure class loader", e);
        }
    }

    private URL getCodeBaseURL() {
        try {
            return new URL("file:" + jarPath);
        } catch (Exception e) {
            return null;
        }
    }

    private void loadClassesFromJar() throws IOException {
        try (JarFile jarFile = new JarFile(jarPath)) {
            Enumeration<JarEntry> entries = jarFile.entries();

            while (entries.hasMoreElements()) {
                JarEntry entry = entries.nextElement();
                if (entry.getName().endsWith(".class") &&
                        !entry.getName().startsWith("argentoz/protect")) {
                    String className = entry.getName().replace('/', '.').replace(".class", "");
                    byte[] classBytes = readEntryData(jarFile, entry);
                    classData.put(className, classBytes);

                    if (isValidClassFile(classBytes)) {
                        decryptionMethod.put(entry.getName().replace(".class", ""), ADVANCED_ENCRYPTION); // По умолчанию продвинутое шифрование
                    }
                }
            }
        }
    }

    private byte[] readEntryData(JarFile jarFile, JarEntry entry) throws IOException {
        try (InputStream is = jarFile.getInputStream(entry)) {
            byte[] buffer = new byte[(int) entry.getSize()];
            int bytesRead = 0;
            int totalBytesRead = 0;

            while (totalBytesRead < buffer.length) {
                bytesRead = is.read(buffer, totalBytesRead, buffer.length - totalBytesRead);
                if (bytesRead == -1) break;
                totalBytesRead += bytesRead;
            }

            return buffer;
        }
    }

    @Override
    public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        Class<?> loadedClass = loadedClasses.get(name);
        if (loadedClass != null) {
            return loadedClass;
        }

        try {
            if (name.startsWith("argentoz.protect")) {
                return super.loadClass(name, resolve);
            }

            String classPath = name.replace('.', '/');

            if (problemClasses.contains(classPath)) {
                return super.loadClass(name, resolve);
            }

            for (String prefix : PARENT_LOADED_PACKAGES) {
                if (name.startsWith(prefix)) {
                    return super.loadClass(name, resolve);
                }
            }

            if (classData.containsKey(name)) {
                try {
                    return findClass(name);
                } catch (Exception e) {
                    problemClasses.add(classPath);
                    return super.loadClass(name, resolve);
                }
            }

            return super.loadClass(name, resolve);
        } catch (Exception e) {
            try {
                return super.loadClass(name, resolve);
            } catch (ClassNotFoundException cnfe) {
                throw cnfe;
            }
        }
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        if (loadedClasses.containsKey(name)) {
            return loadedClasses.get(name);
        }

        byte[] rawClassData = classData.get(name);
        if (rawClassData != null) {
            String classPath = name.replace('.', '/');
            byte[] finalClassData = new byte[0];

            Integer method = decryptionMethod.get(classPath);

            if (method == null) {
                method = detectDecryptionMethod(rawClassData);
                decryptionMethod.put(classPath, method);
            }

            switch (method) {
                case NO_DECRYPT:
                    finalClassData = rawClassData;
                    break;
                case STANDARD_XOR:
                    finalClassData = standardDecrypt(rawClassData);
                    break;
                case SIMPLE_XOR:
                    finalClassData = simpleDecrypt(rawClassData);
                    break;
                case ADVANCED_ENCRYPTION:
                    finalClassData = customDecrypt(rawClassData); // Используем продвинутое дешифрование
                    break;
                default:
                    finalClassData = tryMultipleDecryptions(rawClassData, classPath);
            }

            if (!isValidClassFile(finalClassData)) {
                finalClassData = tryMultipleDecryptions(rawClassData, classPath);

                if (!isValidClassFile(finalClassData)) {
                    problemClasses.add(classPath);
                    return super.findClass(name);
                }
            }

            try {
                ProtectionDomain domain = new ProtectionDomain(
                        new CodeSource(codeBase, (Certificate[]) null),
                        null, this, null);

                Class<?> clazz = defineClass(name, finalClassData, 0, finalClassData.length, domain);
                loadedClasses.put(name, clazz);
                return clazz;
            } catch (Exception e) {
                problemClasses.add(classPath);
                return super.findClass(name);
            }
        }

        return super.findClass(name);
    }

    private int detectDecryptionMethod(byte[] data) {
        return ADVANCED_ENCRYPTION; // По умолчанию используем продвинутое дешифрование
    }

    private boolean isValidClassFile(byte[] data) {
        if (data.length < 8) return false;

        boolean validMagic = data[0] == (byte)0xCA &&
                data[1] == (byte)0xFE &&
                data[2] == (byte)0xBA &&
                data[3] == (byte)0xBE;

        if (!validMagic) return false;

        int major = ((data[6] & 0xFF) << 8) | (data[7] & 0xFF);
        return major > 0 && major <= 65;
    }

    private byte[] standardDecrypt(byte[] encryptedData) {
        return encryptedData; // Заглушка, если захотите использовать стандартный XOR
    }

    private byte[] simpleDecrypt(byte[] encryptedData) {
        return encryptedData; // Заглушка для простого XOR
    }

    private byte[] customDecrypt(byte[] encryptedData) {
        byte[] uniqueKey = generateUniqueKey(encryptedData); // Ключ генерируется на основе зашифрованных данных
        byte[] decryptedData = new byte[encryptedData.length];

        for (int i = encryptedData.length - 1; i >= 0; i--) { // Дешифрование в обратном порядке
            byte currentByte = encryptedData[i];

            // 1. Обратное вращение битов
            int rotation = ROTATION_TABLE[i % ROTATION_TABLE.length];
            currentByte = rotateRight(currentByte, rotation);

            // 2. Обратная подстановка (инверсная S-Box)
            currentByte = INVERSE_SUBSTITUTION_BOX[currentByte & 0xFF];

            // 3. XOR с уникальным ключом
            currentByte ^= uniqueKey[i % uniqueKey.length];

            decryptedData[i] = currentByte;
        }
        return decryptedData;
    }

    private byte[] decryptClassData(byte[] encryptedData) {
        return decryptClassData(encryptedData); // Больше не используется напрямую
    }

    private byte[] tryMultipleDecryptions(byte[] data, String classPath) {
        return data; // Заглушка для попыток разных дешифрований
    }

    @Override
    public URL getResource(String name) {
        if (classData.containsKey(name.replace('/', '.').replace(".class", ""))) {
            try {
                return new URL("jar:file:" + jarPath + "!/" + name);
            } catch (Exception e) {
                return null;
            }
        }
        return super.getResource(name);
    }

    @Override
    public InputStream getResourceAsStream(String name) {
        String className = name.replace('/', '.').replace(".class", "");
        if (classData.containsKey(className)) {
            String classPath = className.replace('.', '/');

            if (problemClasses.contains(classPath)) {
                return super.getResourceAsStream(name);
            }

            byte[] rawData = classData.get(className);
            Integer method = decryptionMethod.get(classPath);
            byte[] finalData;

            if (method != null) {
                switch (method) {
                    case NO_DECRYPT:
                        finalData = rawData;
                        break;
                    case STANDARD_XOR:
                        finalData = standardDecrypt(rawData);
                        break;
                    case SIMPLE_XOR:
                        finalData = simpleDecrypt(rawData);
                        break;
                    case ADVANCED_ENCRYPTION:
                        finalData = customDecrypt(rawData); // Используем продвинутое дешифрование
                        break;
                    default:
                        finalData = rawData;
                }
            } else {
                if (isValidClassFile(rawData)) {
                    finalData = rawData;
                    decryptionMethod.put(classPath, NO_DECRYPT);
                } else {
                    finalData = tryMultipleDecryptions(rawData, classPath);
                }
            }

            if (isValidClassFile(finalData)) {
                return new ByteArrayInputStream(finalData);
            } else {
                return super.getResourceAsStream(name);
            }
        }
        return super.getResourceAsStream(name);
    }

    private byte[] generateUniqueKey(byte[] classData) {
        byte[] expandedKey = new byte[Math.max(256, classData.length / 4)];

        for (int i = 0; i < MASTER_KEY.length && i < expandedKey.length; i++) {
            expandedKey[i] = MASTER_KEY[i];
        }

        int classSize = classData.length;
        for (int i = 0; i < expandedKey.length; i++) {
            expandedKey[i] ^= (byte)(classSize & 0xFF);
            classSize = (classSize >> 8) | (classSize << 24);

            int samplePos = (i * 17) % classData.length;
            expandedKey[i] ^= classData[samplePos];

            if (i > 0) expandedKey[i] ^= expandedKey[i-1];
            if (i > 3) expandedKey[i] ^= expandedKey[i-3];

            expandedKey[i] = (byte)((expandedKey[i] * 13) + 7);
        }

        return expandedKey;
    }

    private byte rotateRight(byte b, int shift) {
        return (byte) ((b & 0xFF) >>> shift | (b & 0xFF) << (8 - shift));
    }

    private static byte[] createInverseSBox(byte[] sBox) {
        byte[] inverseSBox = new byte[256];
        for (int i = 0; i < sBox.length; i++) {
            inverseSBox[sBox[i] & 0xFF] = (byte) i;
        }
        return inverseSBox;
    }
}
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,471
Реакции[?]
679
Поинты[?]
39K
А нахуй вы разрешение на слив своего продукта просите. Вы может у мамы спрашиваете можно ли пк вам включить ?
 
aka wqzxqz
Начинающий
Статус
Оффлайн
Регистрация
24 Ноя 2024
Сообщения
448
Реакции[?]
6
Поинты[?]
5K
А нахуй вы разрешение на слив своего продукта просите. Вы может у мамы спрашиваете можно ли пк вам включить ?
не ну а смысл сливать никому не нужную хуйню, я и спрашиваю - нужно кому то эта хуйня вот и все, это ж фри обф написанный под пивом
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,471
Реакции[?]
679
Поинты[?]
39K
не ну а смысл сливать никому не нужную хуйню, я и спрашиваю - нужно кому то эта хуйня вот и все, это ж фри обф написанный под пивом
Слить сразу - X
Спросить у типов и даже если все ответят нет то все равно слить - V
 
Начинающий
Статус
Оффлайн
Регистрация
12 Ноя 2024
Сообщения
331
Реакции[?]
6
Поинты[?]
3K
это не чатгпт будет и не бигдик
да даже если обученная модель разницы нет
в твоем класслоадере константы MASTER_KEY, SUBSTITUTION_BOX и ROTATION_TABLE вытащить руками из будки можно и изначальный файл уже лежит в ногах
 
Начинающий
Статус
Оффлайн
Регистрация
17 Фев 2024
Сообщения
152
Реакции[?]
1
Поинты[?]
1K
Слить сразу - X
Спросить у типов и даже если все ответят нет то все равно слить - V
Неее, 100% если ответят нет, то 100% не будет слива, раз написали нет, то и не надо.
все ваши кастом класс лоадеры дампятся нищим агент дампером
if(jvm_args.contains("javaagent") return;
 
Начинающий
Статус
Оффлайн
Регистрация
3 Май 2023
Сообщения
745
Реакции[?]
4
Поинты[?]
4K
Сделал обфускатор который ломает класс и добавляет кастомный класслоадер и лаунчер главного класса. Нужно дофиксить: запуск обфусцированных читов, а также сделать нормальную обфускацию не через XOR.

Обфускатор сделан нейронкой, то есть полностью все коды от ИИ, но при этом на небольших джарках - работает. Как запускать джарки - разберетесь. Делаю 2 дня обфускатор и уже есть прогресс. В дальнейшем буду делать модификацию JVM и свою жвм для этого обфускатора в целом и ломание байткода по другому

Будет много людей, кому нужен обфускатор который хоть что то может - сливаю
для каких-то фри читов пойдет а для премки проще уже купить проту у кого-то нежели брать твою обфу
 
aka wqzxqz
Начинающий
Статус
Оффлайн
Регистрация
24 Ноя 2024
Сообщения
448
Реакции[?]
6
Поинты[?]
5K
Сделал обфускатор который ломает класс и добавляет кастомный класслоадер и лаунчер главного класса. Нужно дофиксить: запуск обфусцированных читов, а также сделать нормальную обфускацию не через XOR.

Обфускатор сделан нейронкой, то есть полностью все коды от ИИ, но при этом на небольших джарках - работает. Как запускать джарки - разберетесь. Делаю 2 дня обфускатор и уже есть прогресс. В дальнейшем буду делать модификацию JVM и свою жвм для этого обфускатора в целом и ломание байткода по другому

Будет много людей, кому нужен обфускатор который хоть что то может - сливаю
если кто то может помочь в дс напишите - scaredead

ошибка:

Bash:
C:\Users\bnn31\Documents\Java\FluxGuard>java -jar input-obf.jar -аргумент1 -аргумент2
[FluxGuard] Initializing CustomClassLoader...
CustomClassLoader initialized with 1 obfuscated classes
[FluxGuard] Preloading obfuscated classes...
Preloading 1 obfuscated classes...
[FluxGuard] Could not load deobfuscated class ru.scaredead.JarObfuscator, trying original: Invalid superclass index 33 in class file ru/scaredead/JarObfuscator
Exception in thread "main" java.lang.NoClassDefFoundError: ru/scaredead/JarObfuscator is not a class because access_flag ACC_MODULE is set
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1023)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:887)
        at fluxguard.reborn.CustomClassLoader.findClass(CustomClassLoader.java:107)
        at fluxguard.reborn.CustomClassLoader.preloadClasses(CustomClassLoader.java:64)
        at fluxguard.reborn.ClassReader.main(ClassReader.java:28)
 
Начинающий
Статус
Оффлайн
Регистрация
3 Май 2023
Сообщения
745
Реакции[?]
4
Поинты[?]
4K
если кто то может помочь в дс напишите - scaredead

ошибка:

Bash:
C:\Users\bnn31\Documents\Java\FluxGuard>java -jar input-obf.jar -аргумент1 -аргумент2
[FluxGuard] Initializing CustomClassLoader...
CustomClassLoader initialized with 1 obfuscated classes
[FluxGuard] Preloading obfuscated classes...
Preloading 1 obfuscated classes...
[FluxGuard] Could not load deobfuscated class ru.scaredead.JarObfuscator, trying original: Invalid superclass index 33 in class file ru/scaredead/JarObfuscator
Exception in thread "main" java.lang.NoClassDefFoundError: ru/scaredead/JarObfuscator is not a class because access_flag ACC_MODULE is set
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1023)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:887)
        at fluxguard.reborn.CustomClassLoader.findClass(CustomClassLoader.java:107)
        at fluxguard.reborn.CustomClassLoader.preloadClasses(CustomClassLoader.java:64)
        at fluxguard.reborn.ClassReader.main(ClassReader.java:28)
мне ток что нейронка выдала класс лоадер который без ошибок и рабочий... ты там сколько пишешь класс лоадер обьясни
 
Сверху Снизу