[Tutorial] Шифрование и расшифрование моделей

Слив кода [Tutorial] Шифрование и расшифрование моделей

Нет прав для скачивания
Версия(и) Minecraft
1.7.10
В этом ресурсе Вы узнаете:
Защита краденых моделей, из других проектов, от мамкиных хацкеров
  • Как зашифровать модель и изменить расширение файлов;
  • Как расшифровать модель и загрузить её в игру.
Программа для шифрования:
Скачать исходники
Скачать программу

Мод с расшифровкой и загрузкой
Скачать исходники
Скачать мод

Часть 1. Шифрование моделей
Оригинальный гайд по шифрованию файлов был взят здесь и переделан под необходимые нужды

Немного кода
Main:
package ru.fr0le.encryptFiles;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

//Источник - зашифровать и расшифровать файлы с помощью DES
//http://www.avajava.com/tutorials/lessons/how-do-i-encrypt-and-decrypt-files-using-des.html
public class Main {

    private static String dir;
    private static String oldFormat;
    private static String newFormat;
    private static String key;
    private static int countModels;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while(true) {
            System.out.print("Enter dir models (example - models): ");
            dir = scanner.nextLine();  
            File checkDir = new File(dir);
            if(checkDir.isDirectory()) break;
            else System.out.println("Dir not found!");
        }

        while(true) {
            System.out.print("Enter old models format (example - obj): ");
            oldFormat = scanner.nextLine();
            if(oldFormat.isEmpty() || oldFormat.contains(" ")) System.out.println("Incorrect format!");
            else break;
        }

        while(true) {
            System.out.print("Enter new models format (example - hellz): ");
            newFormat = scanner.nextLine();
            if(newFormat.isEmpty() || newFormat.contains(" ")) System.out.println("Incorrect format!");
            else break;
        }

        while(true) {
            System.out.print("Enter key minimum 8 characters (example - hellzGuard123): ");
            key = scanner.nextLine();
            if(key.isEmpty() || key.length() < 8) System.out.println("Incorrect format!");
            else break;
        }

        scanner.close();

        System.out.println("===== Procces =====");
        processFilesFromFolder(new File(dir));

        System.out.println("===== Result =====");
        System.out.println("Models encrypted - " + countModels);
        System.out.println("Dir models - " + dir);
        System.out.println("Old format - " + oldFormat);
        System.out.println("New format - " + newFormat);
        System.out.println("Key - " + key);
    }

    public static void processFilesFromFolder(File folder) {
        File[] folderEntries = folder.listFiles();
        for (File entry : folderEntries) {  
            if(entry.isDirectory())  {
                processFilesFromFolder(entry);
                continue;
            }

            if(entry.isFile()) {
                if(entry.getName().substring(entry.getName().lastIndexOf(".")).equals("." + oldFormat)) {
                    try {
                        FileInputStream fis = new FileInputStream(entry);
                        String newName = entry.getName().substring(0, entry.getName().lastIndexOf(".")) + ("." + newFormat);
                        FileOutputStream fos = new FileOutputStream(entry.getParentFile() + "/" + newName);
                        System.out.println(entry.getName() + " => " + newName);
                        countModels++;
                        encrypt(key, Cipher.ENCRYPT_MODE, fis, fos);
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }
            }  
        }
    }

    public static void encrypt(String key, int mode, InputStream is, OutputStream os) throws Throwable {
        DESKeySpec dks = new DESKeySpec(key.getBytes());
        SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
        SecretKey desKey = skf.generateSecret(dks);
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, desKey);
        CipherInputStream cis = new CipherInputStream(is, cipher);
        doCopy(cis, os);
    }

    public static void doCopy(InputStream is, OutputStream os) throws IOException {
        byte[] bytes = new byte[64];
        int numBytes;
        while((numBytes = is.read(bytes)) != -1) {
            os.write(bytes, 0, numBytes);
        }
        os.flush();
        os.close();
        is.close();
    }
}

Как пользоваться:
1. Компилим или берем готовый encryptFiles-0.0.1.jar;
2. Кладем его рядом с папкой в которой есть модели. Папка с моделями может иметь любое название, а так же иметь подпапки;
3. Запускаем encryptFiles-0.0.1.jar с помощью cmd - java -jar encryptFiles-0.0.1.jar, зайдя в нужный каталог;
4. Указываем в окне cmd следующие параметры:
  • Название каталога;
  • Расширение не зашифрованного файла;
  • Новое расширение для зашифрованного файла;
  • Ключ состоящий минимум из 8 символов;
1608315638098.png


5. Все зашифрованные файлы будут находиться рядом с незашифрованными;
1608315688416.png


6. Результат:
1608315776064.png
1608315808607.png


Часть 2. Расшифрование модели и загрузка в игру
Процесс расшифровки будет происходить во время загрузки игры. Файл будет расшифрован, загружен в память и удален. Как прятать ключ от посторонних глаз, откуда его подгружать или получать, это уже вам решать. Можно воспользоваться конвертером и перевести это
String key = "hellzGuard123";
в это
String key = new String(new byte[] {104, 101, 108, 108, 122, 71, 117, 97, 114, 100, 49, 50, 51});
и сверху обфусцировать, но это наверное малоэффективный способ.

Модели будут находится в отдельной папке hellzmod в данном примере, а не в самом моде.
1608317383233.png


Загружать модели будем стандартным AdvancedModelLoader.java с небольшими изменениями.

Немного кода
Настройки мода
Info.java:
package ru.fr0le.hellz;

public class Info {

    public static final String name = "Decrypt Files";
    public static final String modid = "decryptfiles";
    public static final String version = "0.0.1";

    public static final String modDir = "hellzmod"; //папка с моделями
    public static final String modelsFormat = "hellz"; //расширение зашифрованных файлов
    public static final String key = "hellzGuard123"; //ключ который мы указывали при шифровании

    //Конвертер - https://www.dcode.fr/ascii-code
    //сконвертированный ключ
    //public static String key = new String(new byte[] {104, 101, 108, 108, 122, 71, 117, 97, 114, 100, 49, 50, 51});
}

Инициализация
ClientProxy.java:
//создание временной папки для расшифровки моделей
//если лаунчер использует проверку папок, тогда эту папку нужно добавить в исключение,
//так как в ней будут появляться временные файлы во время загрузки мода
public void createClientDir() {
    if(FMLCommonHandler.instance().getEffectiveSide().isClient()) {
        //temp dir for decrypt
        File file = new File(Info.modDir + "/temp");
        if(!file.isDirectory()) {       
            file.mkdirs();       
        }   
    }
}

public void loadModels() {
    GL11.glCallList(ClientProxy.getRenderAll("armor", "balaclava"));
}

public static int getRenderAll(String dir, String model) {
    if(hash.containsKey(model))
        return hash.get(model);

    int displayList = GLAllocation.generateDisplayLists(1);
    GL11.glNewList(displayList, GL11.GL_COMPILE);
    AdvancedModelLoader.loadModel(new File(Info.modDir + "/models/" + dir + "/" + model + "." + Info.modelsFormat)).renderAll();
    GL11.glEndList();
    hash.put(model, displayList);
    return displayList;
}

Расшифровка, загрузка и удаление временной модели
WavefrontObject.java:
public WavefrontObject(File file) throws ModelFormatException {
    this.fileName = file.getName();
    File fileDecrypted = new File(Info.modDir + "/temp/encrypted." + Info.modelsFormat);
    FileInputStream fis;
    FileOutputStream fos;

    try {
        fis = new FileInputStream(file);
        fos = new FileOutputStream(fileDecrypted);
        decrypt(Info.key, Cipher.DECRYPT_MODE, fis, fos);
    } catch (Throwable e) {
        e.printStackTrace();
    }

    loadObjModel(fileDecrypted);
    fileDecrypted.delete();
}

private void decrypt(String key, int mode, InputStream is, OutputStream os) throws Throwable {
    DESKeySpec dks = new DESKeySpec(key.getBytes());
    SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
    SecretKey desKey = skf.generateSecret(dks);
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.DECRYPT_MODE, desKey);
    CipherOutputStream cos = new CipherOutputStream(os, cipher);
    doCopy(is, cos);
}

private void doCopy(InputStream is, OutputStream os) throws IOException {
    byte[] bytes = new byte[64];
    int numBytes;
    while ((numBytes = is.read(bytes)) != -1) {
        os.write(bytes, 0, numBytes);
    }
    os.flush();
    os.close();
    is.close();
}

После компиляции и загрузки мода и моделей в лаунчер, удалите незашифрованные модели

Результат:
Рендер зашифрованной модели
1608317467961.png
Автор
Fr0Le
Скачивания
18
Просмотры
3,774
Первый выпуск
Обновление
Оценка
4.00 звёзд 1 оценок

Другие ресурсы пользователя Fr0Le

Последние рецензии

Респект за слив. Но к туториалу это точно не относится. Слишком мало объяснений и не весь код написан. Хорошо, что ты еще исходы оставил, а то так и не разобрался бы.
Сверху