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

Read Only
Статус
Оффлайн
Регистрация
19 Июл 2024
Сообщения
207
Реакции[?]
0
Поинты[?]
0
Привет друзья, недавно написал вам систему хеширование файлов конфигураций прямо как в 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:Посмотреть вложение 288644
/dell ezz deobf
 
Начинающий
Статус
Оффлайн
Регистрация
22 Авг 2023
Сообщения
307
Реакции[?]
17
Поинты[?]
15K
Привет друзья, недавно написал вам систему хеширование файлов конфигураций прямо как в 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:Посмотреть вложение 288644
как всегда насрал дерьмом, смысл от ключа? тебе так слабо реализовать динамику?
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2024
Сообщения
453
Реакции[?]
1
Поинты[?]
0
как всегда насрал дерьмом, смысл от ключа? тебе так слабо реализовать динамику?
Гений с своей обфа тупая которая /dell ezz deobf что-то говорит на обфу конфигов експ 3.1 нурика
 
Начинающий
Статус
Оффлайн
Регистрация
21 Фев 2022
Сообщения
111
Реакции[?]
10
Поинты[?]
9K
Если ты добавил в подгрузку конфига SHA-256 AES (Hash private algorithm), то смогут сделать SQL Injection и инжектить через конфиги код в джаву потому что уязвимая библиотека, советую написать свой алгоритм AES
 
Начинающий
Статус
Оффлайн
Регистрация
22 Авг 2023
Сообщения
307
Реакции[?]
17
Поинты[?]
15K
Сверху Снизу