Исходник Nursultan configs | хеширование кфг | expensive 3.1 ready

Начинающий
Статус
Оффлайн
Регистрация
16 Окт 2024
Сообщения
8
Реакции[?]
1
Поинты[?]
1K

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

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

Спасибо!

Привет друзья, недавно написал вам систему хеширование файлов конфигураций прямо как в Nursultan Alpha. Для хеширование использовал AOE а также оставил в коде строку "yousecretkey12345678" лучше ничего не менять если не хотите разбиратся в моем селфкоде.


ConfigStorage.java:
package fun.nursultan.config;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import net.minecraft.client.Minecraft;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConfigStorage {
    public final Logger logger = Logger.getLogger(ConfigStorage.class.getName());

    public final File CONFIG_DIR = new File(Minecraft.getInstance().gameDir, "\\expensive\\configs");
    public final File AUTOCFG_DIR = new File(CONFIG_DIR, "autocfg.cfg");

    public final JsonParser jsonParser = new JsonParser();
    private static final String ALGORITHM = "AES";

    public void init() throws IOException {
        setupFolder();
    }

    public void setupFolder() {
        if (!CONFIG_DIR.exists()) {
            CONFIG_DIR.mkdirs();
        } else if (AUTOCFG_DIR.exists()) {
            loadConfiguration("system", "defaultKey12345678");
            logger.log(Level.SEVERE, "Load system configuration...");
        } else {
            logger.log(Level.SEVERE, "Creating system configuration...");
            try {
                AUTOCFG_DIR.createNewFile();
                logger.log(Level.SEVERE, "Created!");
            } catch (IOException e) {
                logger.log(Level.SEVERE, "Failed to create system configuration file", e);
            }
        }
    }

    public boolean isEmpty() {
        return getConfigs().isEmpty();
    }

    public List<Config> getConfigs() {
        List<Config> configs = new ArrayList<>();
        File[] configFiles = CONFIG_DIR.listFiles();

        if (configFiles != null) {
            for (File configFile : configFiles) {
                if (configFile.isFile() && configFile.getName().endsWith(".cfg")) {
                    String configName = configFile.getName().replace(".cfg", "");
                    Config config = findConfig(configName);
                    if (config != null) {
                        configs.add(config);
                    }
                }
            }
        }

        return configs;
    }

    public void loadConfiguration(String configuration, String secretKey) {
        Config config = findConfig(configuration);
        if (config == null) {
            logger.log(Level.WARNING, "Конфигурация не найдена: " + configuration);
            return;
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(config.getFile()))) {
            String encryptedContent = reader.readLine();

            if (encryptedContent == null || encryptedContent.isEmpty()) {
                logger.log(Level.WARNING, "Файл конфигурации пуст.");
                return;
            }

            String decryptedContent = decrypt(encryptedContent, secretKey);
            JsonObject object = (JsonObject) jsonParser.parse(decryptedContent);
            config.loadConfig(object);

        } catch (FileNotFoundException e) {
            logger.log(Level.WARNING, "Файл не найден: " + config.getFile().getName(), e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при загрузке конфигурации", e);
        }
    }

    public void saveConfiguration(String configuration, String secretKey) {
        Config config = new Config(configuration);
        String contentPrettyPrint = new GsonBuilder().setPrettyPrinting().create().toJson(config.saveConfig());

        try (FileWriter writer = new FileWriter(config.getFile())) {
            if (contentPrettyPrint.isEmpty()) {
                logger.log(Level.WARNING, "Данные для сохранения конфигурации пусты.");
                return;
            }

            String encryptedContent = encrypt(contentPrettyPrint, secretKey);
            writer.write(encryptedContent);

        } catch (IOException e) {
            logger.log(Level.WARNING, "Ошибка при сохранении конфигурации", e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при шифровании!", e);
        }
    }

    public Config findConfig(String configName) {
        if (configName == null) return null;
        File configFile = new File(CONFIG_DIR, configName + ".cfg");
        if (configFile.exists()) {
            return new Config(configName);
        }
        return null;
    }

    public String encrypt(String data, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public String decrypt(String encryptedData, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    private byte[] hashKey(String key) throws Exception {
        MessageDigest sha = MessageDigest.getInstance("SHA-256");
        return sha.digest(key.getBytes(StandardCharsets.UTF_8));
    }
}
-----------------------------------

ConfigCommand.java:
package fun.nursultan.command.impl.feature;

import im.expensive.command.*;
import im.expensive.config.Config;
import im.expensive.config.ConfigStorage;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.util.text.TextFormatting;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ConfigCommand implements Command, CommandWithAdvice, MultiNamedCommand {

    final ConfigStorage configStorage;
    final Prefix prefix;
    final Logger logger;

    @Override
    public void execute(Parameters parameters) {
        String commandType = parameters.asString(0).orElse("");

        switch (commandType) {
            case "load" -> loadConfig(parameters);
            case "save" -> saveConfig(parameters);
            case "list" -> configList();
            case "dir" -> getDirectory();
            default -> throw new RuntimeException(TextFormatting.RED + "Укажите тип команды: " + TextFormatting.GRAY + "load, save, list, dir");
        }
    }

    @Override
    public String name() {
        return "config";
    }

    @Override
    public String description() {
        return "Позволяет взаимодействовать с конфигами в чите";
    }

    @Override
    public List<String> adviceMessage() {
        String commandPrefix = prefix.get();
        return List.of(commandPrefix + name() + " load <config> - Загрузить конфиг",
                commandPrefix + name() + " save <config> - Сохранить конфиг",
                commandPrefix + name() + " list - Получить список конфигов",
                commandPrefix + name() + " dir - Открыть папку с конфигами",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg save myConfig",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg load myConfig"
        );
    }

    @Override
    public List<String> aliases() {
        return List.of("cfg");
    }

    private void loadConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        if (new File(configStorage.CONFIG_DIR, configName + ".cfg").exists()) {
            configStorage.loadConfiguration(configName, secretKey);
            logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " загружена!");

        } else {
            logger.log(TextFormatting.RED + "Конфигурация " + TextFormatting.GRAY + configName + TextFormatting.RED + " не найдена!");
        }
    }

    private void saveConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        configStorage.saveConfiguration(configName, secretKey);
        logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " сохранена!");
    }

    private void configList() {
        if (configStorage.isEmpty()) {
            logger.log(TextFormatting.RED + "Список конфигураций пустой");
            return;
        }
        logger.log(TextFormatting.GRAY + "Список конфигов:");

        for (Config config : configStorage.getConfigs()) {
            logger.log(TextFormatting.GRAY + config.getName());
        }
    }

    private void getDirectory() {
        try {
            Runtime.getRuntime().exec("explorer " + configStorage.CONFIG_DIR.getAbsolutePath());
        } catch (IOException e) {
            logger.log(TextFormatting.RED + "Папка с конфигурациями не найдена!" + e.getMessage());
        }
    }
}
SS:Снимок экрана 2024-10-24 125245.png
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
20 Апр 2021
Сообщения
1,122
Реакции[?]
20
Поинты[?]
30K
Привет друзья, недавно написал вам систему хеширование файлов конфигураций прямо как в Nursultan Alpha. Для хеширование использовал SHA256 а также оставил в коде строку "yousecretkey12345678" лучше ничего не менять если не хотите разбиратся в моем селфкоде.


ConfigStorage.java:
package fun.nursultan.config;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import net.minecraft.client.Minecraft;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConfigStorage {
    public final Logger logger = Logger.getLogger(ConfigStorage.class.getName());

    public final File CONFIG_DIR = new File(Minecraft.getInstance().gameDir, "\\expensive\\configs");
    public final File AUTOCFG_DIR = new File(CONFIG_DIR, "autocfg.cfg");

    public final JsonParser jsonParser = new JsonParser();
    private static final String ALGORITHM = "AES";

    public void init() throws IOException {
        setupFolder();
    }

    public void setupFolder() {
        if (!CONFIG_DIR.exists()) {
            CONFIG_DIR.mkdirs();
        } else if (AUTOCFG_DIR.exists()) {
            loadConfiguration("system", "defaultKey12345678");
            logger.log(Level.SEVERE, "Load system configuration...");
        } else {
            logger.log(Level.SEVERE, "Creating system configuration...");
            try {
                AUTOCFG_DIR.createNewFile();
                logger.log(Level.SEVERE, "Created!");
            } catch (IOException e) {
                logger.log(Level.SEVERE, "Failed to create system configuration file", e);
            }
        }
    }

    public boolean isEmpty() {
        return getConfigs().isEmpty();
    }

    public List<Config> getConfigs() {
        List<Config> configs = new ArrayList<>();
        File[] configFiles = CONFIG_DIR.listFiles();

        if (configFiles != null) {
            for (File configFile : configFiles) {
                if (configFile.isFile() && configFile.getName().endsWith(".cfg")) {
                    String configName = configFile.getName().replace(".cfg", "");
                    Config config = findConfig(configName);
                    if (config != null) {
                        configs.add(config);
                    }
                }
            }
        }

        return configs;
    }

    public void loadConfiguration(String configuration, String secretKey) {
        Config config = findConfig(configuration);
        if (config == null) {
            logger.log(Level.WARNING, "Конфигурация не найдена: " + configuration);
            return;
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(config.getFile()))) {
            String encryptedContent = reader.readLine();

            if (encryptedContent == null || encryptedContent.isEmpty()) {
                logger.log(Level.WARNING, "Файл конфигурации пуст.");
                return;
            }

            String decryptedContent = decrypt(encryptedContent, secretKey);
            JsonObject object = (JsonObject) jsonParser.parse(decryptedContent);
            config.loadConfig(object);

        } catch (FileNotFoundException e) {
            logger.log(Level.WARNING, "Файл не найден: " + config.getFile().getName(), e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при загрузке конфигурации", e);
        }
    }

    public void saveConfiguration(String configuration, String secretKey) {
        Config config = new Config(configuration);
        String contentPrettyPrint = new GsonBuilder().setPrettyPrinting().create().toJson(config.saveConfig());

        try (FileWriter writer = new FileWriter(config.getFile())) {
            if (contentPrettyPrint.isEmpty()) {
                logger.log(Level.WARNING, "Данные для сохранения конфигурации пусты.");
                return;
            }

            String encryptedContent = encrypt(contentPrettyPrint, secretKey);
            writer.write(encryptedContent);

        } catch (IOException e) {
            logger.log(Level.WARNING, "Ошибка при сохранении конфигурации", e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при шифровании!", e);
        }
    }

    public Config findConfig(String configName) {
        if (configName == null) return null;
        File configFile = new File(CONFIG_DIR, configName + ".cfg");
        if (configFile.exists()) {
            return new Config(configName);
        }
        return null;
    }

    public String encrypt(String data, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public String decrypt(String encryptedData, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    private byte[] hashKey(String key) throws Exception {
        MessageDigest sha = MessageDigest.getInstance("SHA-256");
        return sha.digest(key.getBytes(StandardCharsets.UTF_8));
    }
}
-----------------------------------

ConfigCommand.java:
package fun.nursultan.command.impl.feature;

import im.expensive.command.*;
import im.expensive.config.Config;
import im.expensive.config.ConfigStorage;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.util.text.TextFormatting;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ConfigCommand implements Command, CommandWithAdvice, MultiNamedCommand {

    final ConfigStorage configStorage;
    final Prefix prefix;
    final Logger logger;

    @Override
    public void execute(Parameters parameters) {
        String commandType = parameters.asString(0).orElse("");

        switch (commandType) {
            case "load" -> loadConfig(parameters);
            case "save" -> saveConfig(parameters);
            case "list" -> configList();
            case "dir" -> getDirectory();
            default -> throw new RuntimeException(TextFormatting.RED + "Укажите тип команды: " + TextFormatting.GRAY + "load, save, list, dir");
        }
    }

    @Override
    public String name() {
        return "config";
    }

    @Override
    public String description() {
        return "Позволяет взаимодействовать с конфигами в чите";
    }

    @Override
    public List<String> adviceMessage() {
        String commandPrefix = prefix.get();
        return List.of(commandPrefix + name() + " load <config> - Загрузить конфиг",
                commandPrefix + name() + " save <config> - Сохранить конфиг",
                commandPrefix + name() + " list - Получить список конфигов",
                commandPrefix + name() + " dir - Открыть папку с конфигами",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg save myConfig",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg load myConfig"
        );
    }

    @Override
    public List<String> aliases() {
        return List.of("cfg");
    }

    private void loadConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        if (new File(configStorage.CONFIG_DIR, configName + ".cfg").exists()) {
            configStorage.loadConfiguration(configName, secretKey);
            logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " загружена!");

        } else {
            logger.log(TextFormatting.RED + "Конфигурация " + TextFormatting.GRAY + configName + TextFormatting.RED + " не найдена!");
        }
    }

    private void saveConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        configStorage.saveConfiguration(configName, secretKey);
        logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " сохранена!");
    }

    private void configList() {
        if (configStorage.isEmpty()) {
            logger.log(TextFormatting.RED + "Список конфигураций пустой");
            return;
        }
        logger.log(TextFormatting.GRAY + "Список конфигов:");

        for (Config config : configStorage.getConfigs()) {
            logger.log(TextFormatting.GRAY + config.getName());
        }
    }

    private void getDirectory() {
        try {
            Runtime.getRuntime().exec("explorer " + configStorage.CONFIG_DIR.getAbsolutePath());
        } catch (IOException e) {
            logger.log(TextFormatting.RED + "Папка с конфигурациями не найдена!" + e.getMessage());
        }
    }
}
SS:Посмотреть вложение 288644
защищаемся от кряка конфига, не хотим что бы узнали что у нас база нашей пасты - експенис?
 
Начинающий
Статус
Оффлайн
Регистрация
10 Ноя 2023
Сообщения
96
Реакции[?]
0
Поинты[?]
0
Привет друзья, недавно написал вам систему хеширование файлов конфигураций прямо как в Nursultan Alpha. Для хеширование использовал SHA256 а также оставил в коде строку "yousecretkey12345678" лучше ничего не менять если не хотите разбиратся в моем селфкоде.


ConfigStorage.java:
package fun.nursultan.config;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import net.minecraft.client.Minecraft;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConfigStorage {
    public final Logger logger = Logger.getLogger(ConfigStorage.class.getName());

    public final File CONFIG_DIR = new File(Minecraft.getInstance().gameDir, "\\expensive\\configs");
    public final File AUTOCFG_DIR = new File(CONFIG_DIR, "autocfg.cfg");

    public final JsonParser jsonParser = new JsonParser();
    private static final String ALGORITHM = "AES";

    public void init() throws IOException {
        setupFolder();
    }

    public void setupFolder() {
        if (!CONFIG_DIR.exists()) {
            CONFIG_DIR.mkdirs();
        } else if (AUTOCFG_DIR.exists()) {
            loadConfiguration("system", "defaultKey12345678");
            logger.log(Level.SEVERE, "Load system configuration...");
        } else {
            logger.log(Level.SEVERE, "Creating system configuration...");
            try {
                AUTOCFG_DIR.createNewFile();
                logger.log(Level.SEVERE, "Created!");
            } catch (IOException e) {
                logger.log(Level.SEVERE, "Failed to create system configuration file", e);
            }
        }
    }

    public boolean isEmpty() {
        return getConfigs().isEmpty();
    }

    public List<Config> getConfigs() {
        List<Config> configs = new ArrayList<>();
        File[] configFiles = CONFIG_DIR.listFiles();

        if (configFiles != null) {
            for (File configFile : configFiles) {
                if (configFile.isFile() && configFile.getName().endsWith(".cfg")) {
                    String configName = configFile.getName().replace(".cfg", "");
                    Config config = findConfig(configName);
                    if (config != null) {
                        configs.add(config);
                    }
                }
            }
        }

        return configs;
    }

    public void loadConfiguration(String configuration, String secretKey) {
        Config config = findConfig(configuration);
        if (config == null) {
            logger.log(Level.WARNING, "Конфигурация не найдена: " + configuration);
            return;
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(config.getFile()))) {
            String encryptedContent = reader.readLine();

            if (encryptedContent == null || encryptedContent.isEmpty()) {
                logger.log(Level.WARNING, "Файл конфигурации пуст.");
                return;
            }

            String decryptedContent = decrypt(encryptedContent, secretKey);
            JsonObject object = (JsonObject) jsonParser.parse(decryptedContent);
            config.loadConfig(object);

        } catch (FileNotFoundException e) {
            logger.log(Level.WARNING, "Файл не найден: " + config.getFile().getName(), e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при загрузке конфигурации", e);
        }
    }

    public void saveConfiguration(String configuration, String secretKey) {
        Config config = new Config(configuration);
        String contentPrettyPrint = new GsonBuilder().setPrettyPrinting().create().toJson(config.saveConfig());

        try (FileWriter writer = new FileWriter(config.getFile())) {
            if (contentPrettyPrint.isEmpty()) {
                logger.log(Level.WARNING, "Данные для сохранения конфигурации пусты.");
                return;
            }

            String encryptedContent = encrypt(contentPrettyPrint, secretKey);
            writer.write(encryptedContent);

        } catch (IOException e) {
            logger.log(Level.WARNING, "Ошибка при сохранении конфигурации", e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при шифровании!", e);
        }
    }

    public Config findConfig(String configName) {
        if (configName == null) return null;
        File configFile = new File(CONFIG_DIR, configName + ".cfg");
        if (configFile.exists()) {
            return new Config(configName);
        }
        return null;
    }

    public String encrypt(String data, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public String decrypt(String encryptedData, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    private byte[] hashKey(String key) throws Exception {
        MessageDigest sha = MessageDigest.getInstance("SHA-256");
        return sha.digest(key.getBytes(StandardCharsets.UTF_8));
    }
}
-----------------------------------

ConfigCommand.java:
package fun.nursultan.command.impl.feature;

import im.expensive.command.*;
import im.expensive.config.Config;
import im.expensive.config.ConfigStorage;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.util.text.TextFormatting;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ConfigCommand implements Command, CommandWithAdvice, MultiNamedCommand {

    final ConfigStorage configStorage;
    final Prefix prefix;
    final Logger logger;

    @Override
    public void execute(Parameters parameters) {
        String commandType = parameters.asString(0).orElse("");

        switch (commandType) {
            case "load" -> loadConfig(parameters);
            case "save" -> saveConfig(parameters);
            case "list" -> configList();
            case "dir" -> getDirectory();
            default -> throw new RuntimeException(TextFormatting.RED + "Укажите тип команды: " + TextFormatting.GRAY + "load, save, list, dir");
        }
    }

    @Override
    public String name() {
        return "config";
    }

    @Override
    public String description() {
        return "Позволяет взаимодействовать с конфигами в чите";
    }

    @Override
    public List<String> adviceMessage() {
        String commandPrefix = prefix.get();
        return List.of(commandPrefix + name() + " load <config> - Загрузить конфиг",
                commandPrefix + name() + " save <config> - Сохранить конфиг",
                commandPrefix + name() + " list - Получить список конфигов",
                commandPrefix + name() + " dir - Открыть папку с конфигами",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg save myConfig",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg load myConfig"
        );
    }

    @Override
    public List<String> aliases() {
        return List.of("cfg");
    }

    private void loadConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        if (new File(configStorage.CONFIG_DIR, configName + ".cfg").exists()) {
            configStorage.loadConfiguration(configName, secretKey);
            logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " загружена!");

        } else {
            logger.log(TextFormatting.RED + "Конфигурация " + TextFormatting.GRAY + configName + TextFormatting.RED + " не найдена!");
        }
    }

    private void saveConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        configStorage.saveConfiguration(configName, secretKey);
        logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " сохранена!");
    }

    private void configList() {
        if (configStorage.isEmpty()) {
            logger.log(TextFormatting.RED + "Список конфигураций пустой");
            return;
        }
        logger.log(TextFormatting.GRAY + "Список конфигов:");

        for (Config config : configStorage.getConfigs()) {
            logger.log(TextFormatting.GRAY + config.getName());
        }
    }

    private void getDirectory() {
        try {
            Runtime.getRuntime().exec("explorer " + configStorage.CONFIG_DIR.getAbsolutePath());
        } catch (IOException e) {
            logger.log(TextFormatting.RED + "Папка с конфигурациями не найдена!" + e.getMessage());
        }
    }
}
SS:Посмотреть вложение 288644
аткуда у тебяя ета
 
Начинающий
Статус
Оффлайн
Регистрация
8 Авг 2024
Сообщения
62
Реакции[?]
0
Поинты[?]
0
А для чего это чудо? Спасибо конечно, но смысл текст в .кфг менять? Если это от кряка, то это не сильно поможет, допустим можно заскринить настройки функций другу, и вот уже фри конфиг. Хотя в том то и смысл конфига, чтобы под себя его настраивать, независимо от того купил ли ты конфиг или нет:NotLikeThis:
 
onetap.su technology
Пользователь
Статус
Оффлайн
Регистрация
20 Июн 2020
Сообщения
371
Реакции[?]
110
Поинты[?]
3K
это типо что б можно было скинуть конфиг в общий чат дс и не опозориться на какой это чит?
 
Read Only
Статус
Оффлайн
Регистрация
26 Авг 2024
Сообщения
653
Реакции[?]
1
Поинты[?]
2K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
а ша 256 тут где
 
Начинающий
Статус
Оффлайн
Регистрация
29 Сен 2024
Сообщения
62
Реакции[?]
1
Поинты[?]
0
Привет друзья, недавно написал вам систему хеширование файлов конфигураций прямо как в Nursultan Alpha. Для хеширование использовал SHA256 а также оставил в коде строку "yousecretkey12345678" лучше ничего не менять если не хотите разбиратся в моем селфкоде.


ConfigStorage.java:
package fun.nursultan.config;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import net.minecraft.client.Minecraft;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConfigStorage {
    public final Logger logger = Logger.getLogger(ConfigStorage.class.getName());

    public final File CONFIG_DIR = new File(Minecraft.getInstance().gameDir, "\\expensive\\configs");
    public final File AUTOCFG_DIR = new File(CONFIG_DIR, "autocfg.cfg");

    public final JsonParser jsonParser = new JsonParser();
    private static final String ALGORITHM = "AES";

    public void init() throws IOException {
        setupFolder();
    }

    public void setupFolder() {
        if (!CONFIG_DIR.exists()) {
            CONFIG_DIR.mkdirs();
        } else if (AUTOCFG_DIR.exists()) {
            loadConfiguration("system", "defaultKey12345678");
            logger.log(Level.SEVERE, "Load system configuration...");
        } else {
            logger.log(Level.SEVERE, "Creating system configuration...");
            try {
                AUTOCFG_DIR.createNewFile();
                logger.log(Level.SEVERE, "Created!");
            } catch (IOException e) {
                logger.log(Level.SEVERE, "Failed to create system configuration file", e);
            }
        }
    }

    public boolean isEmpty() {
        return getConfigs().isEmpty();
    }

    public List<Config> getConfigs() {
        List<Config> configs = new ArrayList<>();
        File[] configFiles = CONFIG_DIR.listFiles();

        if (configFiles != null) {
            for (File configFile : configFiles) {
                if (configFile.isFile() && configFile.getName().endsWith(".cfg")) {
                    String configName = configFile.getName().replace(".cfg", "");
                    Config config = findConfig(configName);
                    if (config != null) {
                        configs.add(config);
                    }
                }
            }
        }

        return configs;
    }

    public void loadConfiguration(String configuration, String secretKey) {
        Config config = findConfig(configuration);
        if (config == null) {
            logger.log(Level.WARNING, "Конфигурация не найдена: " + configuration);
            return;
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(config.getFile()))) {
            String encryptedContent = reader.readLine();

            if (encryptedContent == null || encryptedContent.isEmpty()) {
                logger.log(Level.WARNING, "Файл конфигурации пуст.");
                return;
            }

            String decryptedContent = decrypt(encryptedContent, secretKey);
            JsonObject object = (JsonObject) jsonParser.parse(decryptedContent);
            config.loadConfig(object);

        } catch (FileNotFoundException e) {
            logger.log(Level.WARNING, "Файл не найден: " + config.getFile().getName(), e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при загрузке конфигурации", e);
        }
    }

    public void saveConfiguration(String configuration, String secretKey) {
        Config config = new Config(configuration);
        String contentPrettyPrint = new GsonBuilder().setPrettyPrinting().create().toJson(config.saveConfig());

        try (FileWriter writer = new FileWriter(config.getFile())) {
            if (contentPrettyPrint.isEmpty()) {
                logger.log(Level.WARNING, "Данные для сохранения конфигурации пусты.");
                return;
            }

            String encryptedContent = encrypt(contentPrettyPrint, secretKey);
            writer.write(encryptedContent);

        } catch (IOException e) {
            logger.log(Level.WARNING, "Ошибка при сохранении конфигурации", e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при шифровании!", e);
        }
    }

    public Config findConfig(String configName) {
        if (configName == null) return null;
        File configFile = new File(CONFIG_DIR, configName + ".cfg");
        if (configFile.exists()) {
            return new Config(configName);
        }
        return null;
    }

    public String encrypt(String data, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public String decrypt(String encryptedData, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    private byte[] hashKey(String key) throws Exception {
        MessageDigest sha = MessageDigest.getInstance("SHA-256");
        return sha.digest(key.getBytes(StandardCharsets.UTF_8));
    }
}
-----------------------------------

ConfigCommand.java:
package fun.nursultan.command.impl.feature;

import im.expensive.command.*;
import im.expensive.config.Config;
import im.expensive.config.ConfigStorage;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.util.text.TextFormatting;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ConfigCommand implements Command, CommandWithAdvice, MultiNamedCommand {

    final ConfigStorage configStorage;
    final Prefix prefix;
    final Logger logger;

    @Override
    public void execute(Parameters parameters) {
        String commandType = parameters.asString(0).orElse("");

        switch (commandType) {
            case "load" -> loadConfig(parameters);
            case "save" -> saveConfig(parameters);
            case "list" -> configList();
            case "dir" -> getDirectory();
            default -> throw new RuntimeException(TextFormatting.RED + "Укажите тип команды: " + TextFormatting.GRAY + "load, save, list, dir");
        }
    }

    @Override
    public String name() {
        return "config";
    }

    @Override
    public String description() {
        return "Позволяет взаимодействовать с конфигами в чите";
    }

    @Override
    public List<String> adviceMessage() {
        String commandPrefix = prefix.get();
        return List.of(commandPrefix + name() + " load <config> - Загрузить конфиг",
                commandPrefix + name() + " save <config> - Сохранить конфиг",
                commandPrefix + name() + " list - Получить список конфигов",
                commandPrefix + name() + " dir - Открыть папку с конфигами",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg save myConfig",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg load myConfig"
        );
    }

    @Override
    public List<String> aliases() {
        return List.of("cfg");
    }

    private void loadConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        if (new File(configStorage.CONFIG_DIR, configName + ".cfg").exists()) {
            configStorage.loadConfiguration(configName, secretKey);
            logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " загружена!");

        } else {
            logger.log(TextFormatting.RED + "Конфигурация " + TextFormatting.GRAY + configName + TextFormatting.RED + " не найдена!");
        }
    }

    private void saveConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        configStorage.saveConfiguration(configName, secretKey);
        logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " сохранена!");
    }

    private void configList() {
        if (configStorage.isEmpty()) {
            logger.log(TextFormatting.RED + "Список конфигураций пустой");
            return;
        }
        logger.log(TextFormatting.GRAY + "Список конфигов:");

        for (Config config : configStorage.getConfigs()) {
            logger.log(TextFormatting.GRAY + config.getName());
        }
    }

    private void getDirectory() {
        try {
            Runtime.getRuntime().exec("explorer " + configStorage.CONFIG_DIR.getAbsolutePath());
        } catch (IOException e) {
            logger.log(TextFormatting.RED + "Папка с конфигурациями не найдена!" + e.getMessage());
        }
    }
}
SS:Посмотреть вложение 288644
1 нахуя
2 нахуя защищать кфг на экспенсиве
3 нахуй просто защищать кфг
4 поч нету вм протекта анти дебагера подгрузки, детект инжекта?
 
Начинающий
Статус
Оффлайн
Регистрация
21 Окт 2022
Сообщения
227
Реакции[?]
1
Поинты[?]
2K
Привет друзья, недавно написал вам систему хеширование файлов конфигураций прямо как в Nursultan Alpha. Для хеширование использовал SHA256 а также оставил в коде строку "yousecretkey12345678" лучше ничего не менять если не хотите разбиратся в моем селфкоде.


ConfigStorage.java:
package fun.nursultan.config;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import net.minecraft.client.Minecraft;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConfigStorage {
    public final Logger logger = Logger.getLogger(ConfigStorage.class.getName());

    public final File CONFIG_DIR = new File(Minecraft.getInstance().gameDir, "\\expensive\\configs");
    public final File AUTOCFG_DIR = new File(CONFIG_DIR, "autocfg.cfg");

    public final JsonParser jsonParser = new JsonParser();
    private static final String ALGORITHM = "AES";

    public void init() throws IOException {
        setupFolder();
    }

    public void setupFolder() {
        if (!CONFIG_DIR.exists()) {
            CONFIG_DIR.mkdirs();
        } else if (AUTOCFG_DIR.exists()) {
            loadConfiguration("system", "defaultKey12345678");
            logger.log(Level.SEVERE, "Load system configuration...");
        } else {
            logger.log(Level.SEVERE, "Creating system configuration...");
            try {
                AUTOCFG_DIR.createNewFile();
                logger.log(Level.SEVERE, "Created!");
            } catch (IOException e) {
                logger.log(Level.SEVERE, "Failed to create system configuration file", e);
            }
        }
    }

    public boolean isEmpty() {
        return getConfigs().isEmpty();
    }

    public List<Config> getConfigs() {
        List<Config> configs = new ArrayList<>();
        File[] configFiles = CONFIG_DIR.listFiles();

        if (configFiles != null) {
            for (File configFile : configFiles) {
                if (configFile.isFile() && configFile.getName().endsWith(".cfg")) {
                    String configName = configFile.getName().replace(".cfg", "");
                    Config config = findConfig(configName);
                    if (config != null) {
                        configs.add(config);
                    }
                }
            }
        }

        return configs;
    }

    public void loadConfiguration(String configuration, String secretKey) {
        Config config = findConfig(configuration);
        if (config == null) {
            logger.log(Level.WARNING, "Конфигурация не найдена: " + configuration);
            return;
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(config.getFile()))) {
            String encryptedContent = reader.readLine();

            if (encryptedContent == null || encryptedContent.isEmpty()) {
                logger.log(Level.WARNING, "Файл конфигурации пуст.");
                return;
            }

            String decryptedContent = decrypt(encryptedContent, secretKey);
            JsonObject object = (JsonObject) jsonParser.parse(decryptedContent);
            config.loadConfig(object);

        } catch (FileNotFoundException e) {
            logger.log(Level.WARNING, "Файл не найден: " + config.getFile().getName(), e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при загрузке конфигурации", e);
        }
    }

    public void saveConfiguration(String configuration, String secretKey) {
        Config config = new Config(configuration);
        String contentPrettyPrint = new GsonBuilder().setPrettyPrinting().create().toJson(config.saveConfig());

        try (FileWriter writer = new FileWriter(config.getFile())) {
            if (contentPrettyPrint.isEmpty()) {
                logger.log(Level.WARNING, "Данные для сохранения конфигурации пусты.");
                return;
            }

            String encryptedContent = encrypt(contentPrettyPrint, secretKey);
            writer.write(encryptedContent);

        } catch (IOException e) {
            logger.log(Level.WARNING, "Ошибка при сохранении конфигурации", e);
        } catch (Exception e) {
            logger.log(Level.WARNING, "Ошибка при шифровании!", e);
        }
    }

    public Config findConfig(String configName) {
        if (configName == null) return null;
        File configFile = new File(CONFIG_DIR, configName + ".cfg");
        if (configFile.exists()) {
            return new Config(configName);
        }
        return null;
    }

    public String encrypt(String data, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    public String decrypt(String encryptedData, String secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(hashKey(secretKey), ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    private byte[] hashKey(String key) throws Exception {
        MessageDigest sha = MessageDigest.getInstance("SHA-256");
        return sha.digest(key.getBytes(StandardCharsets.UTF_8));
    }
}
-----------------------------------

ConfigCommand.java:
package fun.nursultan.command.impl.feature;

import im.expensive.command.*;
import im.expensive.config.Config;
import im.expensive.config.ConfigStorage;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.util.text.TextFormatting;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ConfigCommand implements Command, CommandWithAdvice, MultiNamedCommand {

    final ConfigStorage configStorage;
    final Prefix prefix;
    final Logger logger;

    @Override
    public void execute(Parameters parameters) {
        String commandType = parameters.asString(0).orElse("");

        switch (commandType) {
            case "load" -> loadConfig(parameters);
            case "save" -> saveConfig(parameters);
            case "list" -> configList();
            case "dir" -> getDirectory();
            default -> throw new RuntimeException(TextFormatting.RED + "Укажите тип команды: " + TextFormatting.GRAY + "load, save, list, dir");
        }
    }

    @Override
    public String name() {
        return "config";
    }

    @Override
    public String description() {
        return "Позволяет взаимодействовать с конфигами в чите";
    }

    @Override
    public List<String> adviceMessage() {
        String commandPrefix = prefix.get();
        return List.of(commandPrefix + name() + " load <config> - Загрузить конфиг",
                commandPrefix + name() + " save <config> - Сохранить конфиг",
                commandPrefix + name() + " list - Получить список конфигов",
                commandPrefix + name() + " dir - Открыть папку с конфигами",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg save myConfig",
                "Пример: " + TextFormatting.RED + commandPrefix + "cfg load myConfig"
        );
    }

    @Override
    public List<String> aliases() {
        return List.of("cfg");
    }

    private void loadConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        if (new File(configStorage.CONFIG_DIR, configName + ".cfg").exists()) {
            configStorage.loadConfiguration(configName, secretKey);
            logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " загружена!");

        } else {
            logger.log(TextFormatting.RED + "Конфигурация " + TextFormatting.GRAY + configName + TextFormatting.RED + " не найдена!");
        }
    }

    private void saveConfig(Parameters parameters) {
        String configName = parameters.asString(1)
                .orElseThrow(() -> new RuntimeException(TextFormatting.RED + "Укажите название конфига!"));

        String secretKey = "yourSecretKey123";

        configStorage.saveConfiguration(configName, secretKey);
        logger.log(TextFormatting.GREEN + "Конфигурация " + TextFormatting.RED + configName + TextFormatting.GREEN + " сохранена!");
    }

    private void configList() {
        if (configStorage.isEmpty()) {
            logger.log(TextFormatting.RED + "Список конфигураций пустой");
            return;
        }
        logger.log(TextFormatting.GRAY + "Список конфигов:");

        for (Config config : configStorage.getConfigs()) {
            logger.log(TextFormatting.GRAY + config.getName());
        }
    }

    private void getDirectory() {
        try {
            Runtime.getRuntime().exec("explorer " + configStorage.CONFIG_DIR.getAbsolutePath());
        } catch (IOException e) {
            logger.log(TextFormatting.RED + "Папка с конфигурациями не найдена!" + e.getMessage());
        }
    }
}
SS:Посмотреть вложение 288644
1 блять НАХУЯ ПЕРЕЕБАШИВАТЬ ФУЛ КЛАСЫ ЕСЛИ МОЖНО ПРОСТО ПЕРЕДЕЛАТЬ НЕМНОГО МЕТОДЫ В КОНФИГ СТОРОДЖЕ??
 
Начинающий
Статус
Оффлайн
Регистрация
13 Сен 2023
Сообщения
124
Реакции[?]
1
Поинты[?]
1K
и зачем конфиги защищать?
в нурипуке кфг захешированы , чтобы юзеры не смогли в кфг поменять стейт модуля/его настройку. Типо там же премиум дополнение есть
 
PoC Life
Пользователь
Статус
Оффлайн
Регистрация
22 Авг 2022
Сообщения
324
Реакции[?]
47
Поинты[?]
37K
Начинающий
Статус
Оффлайн
Регистрация
16 Окт 2024
Сообщения
8
Реакции[?]
1
Поинты[?]
1K
А для чего это чудо? Спасибо конечно, но смысл текст в .кфг менять? Если это от кряка, то это не сильно поможет, допустим можно заскринить настройки функций другу, и вот уже фри конфиг. Хотя в том то и смысл конфига, чтобы под себя его настраивать, независимо от того купил ли ты конфиг или нет:NotLikeThis:
Я же говорю как в нурике. Кому нужно тот пусть берет. Не вижу смысла задавать такие вопросы
 
Начинающий
Статус
Оффлайн
Регистрация
23 Апр 2024
Сообщения
290
Реакции[?]
0
Поинты[?]
1K
аткуда у тебяя ета
сурс нурика мой чек
1 блять НАХУЯ ПЕРЕЕБАШИВАТЬ ФУЛ КЛАСЫ ЕСЛИ МОЖНО ПРОСТО ПЕРЕДЕЛАТЬ НЕМНОГО МЕТОДЫ В КОНФИГ СТОРОДЖЕ??
+
Очень полезно, советую добавить защиту по хвиду
ХАХВХА, генииий
 
Начинающий
Статус
Оффлайн
Регистрация
10 Ноя 2023
Сообщения
96
Реакции[?]
0
Поинты[?]
0
Последнее редактирование:
Сверху Снизу