- Версия(и) Minecraft
- 1.7.10
В этом ресурсе Вы узнаете:
Скачать исходники
Скачать программу
Мод с расшифровкой и загрузкой
Скачать исходники
Скачать мод
Часть 1. Шифрование моделей
Оригинальный гайд по шифрованию файлов был взят здесь и переделан под необходимые нужды
Немного кода
Как пользоваться:
1. Компилим или берем готовый encryptFiles-0.0.1.jar;
2. Кладем его рядом с папкой в которой есть модели. Папка с моделями может иметь любое название, а так же иметь подпапки;
3. Запускаем encryptFiles-0.0.1.jar с помощью cmd -
4. Указываем в окне cmd следующие параметры:
5. Все зашифрованные файлы будут находиться рядом с незашифрованными;
6. Результат:
Часть 2. Расшифрование модели и загрузка в игру
Процесс расшифровки будет происходить во время загрузки игры. Файл будет расшифрован, загружен в память и удален. Как прятать ключ от посторонних глаз, откуда его подгружать или получать, это уже вам решать. Можно воспользоваться конвертером и перевести это
в это
и сверху обфусцировать, но это наверное малоэффективный способ.
Модели будут находится в отдельной папке hellzmod в данном примере, а не в самом моде.
Загружать модели будем стандартным AdvancedModelLoader.java с небольшими изменениями.
Немного кода
Настройки мода
Инициализация
Расшифровка, загрузка и удаление временной модели
После компиляции и загрузки мода и моделей в лаунчер, удалите незашифрованные модели
Результат:
Рендер зашифрованной модели
Защита краденых моделей, из других проектов, от мамкиных хацкеров
- Как зашифровать модель и изменить расширение файлов;
- Как расшифровать модель и загрузить её в игру.
Скачать исходники
Скачать программу
Мод с расшифровкой и загрузкой
Скачать исходники
Скачать мод
Часть 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 символов;
5. Все зашифрованные файлы будут находиться рядом с незашифрованными;
6. Результат:
Часть 2. Расшифрование модели и загрузка в игру
Процесс расшифровки будет происходить во время загрузки игры. Файл будет расшифрован, загружен в память и удален. Как прятать ключ от посторонних глаз, откуда его подгружать или получать, это уже вам решать. Можно воспользоваться конвертером и перевести это
String key = "hellzGuard123";
в это
String key = new String(new byte[] {104, 101, 108, 108, 122, 71, 117, 97, 114, 100, 49, 50, 51});
и сверху обфусцировать, но это наверное малоэффективный способ.
Модели будут находится в отдельной папке hellzmod в данном примере, а не в самом моде.
Загружать модели будем стандартным 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();
}
После компиляции и загрузки мода и моделей в лаунчер, удалите незашифрованные модели
Результат:
Рендер зашифрованной модели