Софт UE-Explorer с авто декодером 111 и 121

BIT_hack

Знающий
Участник
Сообщения
215
Розыгрыши
0
Решения
2
Репутация
79
Реакции
155
Баллы
455
Я часто использую программу UE-Explorer для декомпиляции файлов с расширением *.u. раньше мне приходилось сначала декодировать файлы с помощью других программ, а затем открывать их в UE-Explorer.
Я добавил в программу встроенный дешифратор для 111 и 121 кодировок, что избавляет от необходимости использовать сторонних программ.

Также в последней версии программы 1.4.2.7, доступной на сегодняшний день, возникала ошибка <Запрошенное значение "Ctrl" не найдено.> при запуске и программа не запускалась.
Похоже, она была связана с проблемами в работе русской версии Windows, я исправил эту ошибку и программа запускается без ошибок.

  1. Вы можете скачать программу с официального сайта, перейдя по следующей ссылке:
  2. После того как вы установите программу, вам нужно будет заменить файл в её папке на тот, который прикреплен к этой теме.
Все декомпилированные файлы будут подписаны как "dec-" в вкладках программы.
1.JPG
 

Вложения

  • UEExplorer.zip
    583,6 КБ · Просмотры: 66

Круто! Спасибо!
 
Я часто использую программу UE-Explorer для декомпиляции файлов с расширением *.u. раньше мне приходилось сначала декодировать файлы с помощью других программ, а затем открывать их в UE-Explorer.
Я добавил в программу встроенный дешифратор для 111 и 121 кодировок, что избавляет от необходимости использовать сторонних программ.

Также в последней версии программы 1.4.2.7, доступной на сегодняшний день, возникала ошибка <Запрошенное значение "Ctrl" не найдено.> при запуске и программа не запускалась.
Похоже, она была связана с проблемами в работе русской версии Windows, я исправил эту ошибку и программа запускается без ошибок.

  1. Вы можете скачать программу с официального сайта, перейдя по следующей ссылке:
  2. После того как вы установите программу, вам нужно будет заменить файл в её папке на тот, который прикреплен к этой теме.
Все декомпилированные файлы будут подписаны как "dec-" в вкладках программы.
Посмотреть вложение 78748
Без экзешника дефолт открывается без проблем, ставлю твой exe и вот:
1728937047368.png
 
Без экзешника дефолт открывается без проблем, ставлю твой exe и вот:
Если мой файл то он должен был выдать Control так как ctrl уже нет, вот еще нашел место где он был возможно поможет
 

Вложения

  • UEExplorer.zip
    583,6 КБ · Просмотры: 18
Если у вас есть опыт работы с C#, пожалуйста, посмотрите и подскажите, в чём может быть проблема. Я нашёл решение в интернете, и оно сработало. Я проверил его на нескольких версиях Windows, и всё работало нормально. Возможно, есть какая-то другая причина?
 
Я загрузил обновлённые исходные коды с сервера. Ошибка больше не возникает. Я создал новый проект на основе чистых исходников, добавив только декодер. Пожалуйста, проверьте.
 

Вложения

  • UEExplorer.zip
    584,8 КБ · Просмотры: 28
Попробовал
Я загрузил обновлённые исходные коды с сервера. Ошибка больше не возникает. Я создал новый проект на основе чистых исходников, добавив только декодер. Пожалуйста, проверьте.
Выдает ошибку. [mmo-dev.info]_1728937916022.png
 
у меня таких проблем нет и тем кому скидывал программу тоже их нет но я буду разбираться в чем причина.
Тоже все норм с 1 раза запустилась, вчера уже проверил на одном файле, все гуд.
 
На всякий случай я прилагаю исходный код. Возможно, кто-то, у кого возникла эта ошибка, сможет собрать его и разобраться в проблеме. Я не могу воспроизвести её ни на одном компьютере с чистой операционной системой Windows.

Собирал проект в C#:
Microsoft Visual Studio Community 2022 (64-разрядная версия) - Current Версия 17.11.5

Может кому-то отдельно понадобится дешифратор 111 и 121
C#:
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

public static class Lineage2Decrypter
{
    // Ключ для дешифрования с помощью XOR
    private static byte s_keyXOR; //Lineage2Ver111
    private static byte[] s_lineage2Verbyte; //Lineage2Ver111,Lineage2Ver121

    // Основная функция для дешифрования файла Lineage2
    public static string L2DecodeU(string fileName)
    {
        // Проверяем, существует ли файл
        if (!File.Exists(fileName)) return fileName;
        // Считываем данные из файла
        byte[] fileData = File.ReadAllBytes(fileName);
        // Находим начальный индекс строки "Lineage2Ver111" в массиве байт
        bool isLineage2Ver = FindStringIndex(fileData, Encoding.Unicode.GetBytes("Lineage2Ver111"));

        if (isLineage2Ver)
        {
            s_keyXOR = 0xAC;
            s_lineage2Verbyte = Encoding.Unicode.GetBytes("Lineage2Ver111"); //Lineage2Ver111

        }
        else // Если строка не найдена "Lineage2Ver111", тогда ищем "Lineage2Ver121"
        {
            isLineage2Ver = FindStringIndex(fileData, Encoding.Unicode.GetBytes("Lineage2Ver121"));

            s_keyXOR = (byte)GetXORKey121(Path.GetFileName(fileName));
            s_lineage2Verbyte = Encoding.Unicode.GetBytes("Lineage2Ver121"); //Lineage2Ver121
        }

        // Если строка найдена, то дешифруем файл
        if (isLineage2Ver)
        {
            // Дешифруем данные с помощью XOR
            byte[] decryptedData = DecryptData(fileData, s_lineage2Verbyte.Length, s_keyXOR);

            // Создаем имя выходного файла
            string outputFilePath = "temp";

            int counter = 1;
            string newFileName = "dec-" + Path.GetFileName(fileName);

            // Проверяем, существует ли файл
            if (!File.Exists("temp/dec-" + Path.GetFileName(fileName)))
            {
                outputFilePath = "temp/dec-" + Path.GetFileName(fileName);
            }
            else {

            // Проверка, существует ли файл
            while (File.Exists(Path.Combine(outputFilePath, newFileName)))
            {
              newFileName = $"({counter}){"dec-" + Path.GetFileName(fileName)}";
                counter++;
            }
                outputFilePath = "temp/" + newFileName;
          //  MessageBox.Show(newFileName);
        }
            
            // Создаем папку "temp", если она не существует
            string outputDirectory = Path.GetDirectoryName(outputFilePath);
            if (!Directory.Exists(outputDirectory))
            {
                Directory.CreateDirectory(outputDirectory);
            }
            // Используем using-блок для автоматического закрытия файла
            using (var outputFile = File.OpenWrite(outputFilePath))
            {
                // Сохраняем дешифрованные данные в выходной файл
                outputFile.Write(decryptedData, 0, decryptedData.Length);
            }

            // Возвращаем имя выходного файла
            return outputFilePath;
        }
        // Если строка не найдена, то файл не зашифрован
        return fileName;
    }

    // Метод для поиска начала зашифрованных данных в массиве байт
    private static bool FindStringIndex(byte[] data, byte[] pattern)
    {
        // Предполагаем, что совпадение найдено
        bool match = false;

        // Проходим по массиву данных, начиная с первого байта
        for (int i = 0; i <= pattern.Length - 1; i++)
        {
            // Если байты совпадают
            if (data[i] == pattern[i])
            {
                match = true;
            }
            else
            {
                match = false;
                break;
            }

        }
        return match;
    }

    // Метод для дешифрования данных с помощью XOR
    private static byte[] DecryptData(byte[] data, int startIndex, byte key)
    {
        // Создаем массив для хранения дешифрованных данных
        byte[] decryptedData = new byte[data.Length - startIndex];

        // Проходим по массиву данных, начиная с заданного индекса
        for (int i = startIndex, j = 0; i < data.Length; i++, j++)
        {
            // Дешифруем каждый байт с помощью XOR
            decryptedData[j] = (byte)(data[i] ^ key);
        }

        // Возвращаем массив дешифрованных данных
        return decryptedData;
    }

    // Метод для получения ключа XOR для Lineage2Ver121
    private static int GetXORKey121(string filename)
    {
        int sum = 0;
        foreach (char c in filename.ToLower())
        {
            sum += (byte)c;
        }
        return sum & 0xff;
    }


    // Метод для удаления временных файлов по завершению программы
    public static void DeleteTempFiles()
    {
        if (Directory.Exists("temp"))
        {
            // Используем рекурсивное удаление для удаления всех файлов и подпапок
            Directory.Delete("temp", true);
        }
    }
}

В даном исходники дешифратор вызывается из ProgramForm.cs в методе:
C#:
public void LoadFromFile(string filePathdec)
{
.......
.......

//Таким способом:
 string  filePath = Lineage2Decrypter.L2DecodeU(filePathdec); //Декомпилируем файл

.......
.......

}

Исходные коды уже находятся в архиве. Вам нужно лишь распаковать его запустить проект и «Скомпилировать».
 

Вложения

  • UE-Explorer-src.7z
    2,7 МБ · Просмотры: 24
На всякий случай я прилагаю исходный код. Возможно, кто-то, у кого возникла эта ошибка, сможет собрать его и разобраться в проблеме. Я не могу воспроизвести её ни на одном компьютере с чистой операционной системой Windows.

Собирал проект в C#:
Microsoft Visual Studio Community 2022 (64-разрядная версия) - Current Версия 17.11.5

Может кому-то отдельно понадобится дешифратор 111 и 121
C#:
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

public static class Lineage2Decrypter
{
    // Ключ для дешифрования с помощью XOR
    private static byte s_keyXOR; //Lineage2Ver111
    private static byte[] s_lineage2Verbyte; //Lineage2Ver111,Lineage2Ver121

    // Основная функция для дешифрования файла Lineage2
    public static string L2DecodeU(string fileName)
    {
        // Проверяем, существует ли файл
        if (!File.Exists(fileName)) return fileName;
        // Считываем данные из файла
        byte[] fileData = File.ReadAllBytes(fileName);
        // Находим начальный индекс строки "Lineage2Ver111" в массиве байт
        bool isLineage2Ver = FindStringIndex(fileData, Encoding.Unicode.GetBytes("Lineage2Ver111"));

        if (isLineage2Ver)
        {
            s_keyXOR = 0xAC;
            s_lineage2Verbyte = Encoding.Unicode.GetBytes("Lineage2Ver111"); //Lineage2Ver111

        }
        else // Если строка не найдена "Lineage2Ver111", тогда ищем "Lineage2Ver121"
        {
            isLineage2Ver = FindStringIndex(fileData, Encoding.Unicode.GetBytes("Lineage2Ver121"));

            s_keyXOR = (byte)GetXORKey121(Path.GetFileName(fileName));
            s_lineage2Verbyte = Encoding.Unicode.GetBytes("Lineage2Ver121"); //Lineage2Ver121
        }

        // Если строка найдена, то дешифруем файл
        if (isLineage2Ver)
        {
            // Дешифруем данные с помощью XOR
            byte[] decryptedData = DecryptData(fileData, s_lineage2Verbyte.Length, s_keyXOR);

            // Создаем имя выходного файла
            string outputFilePath = "temp";

            int counter = 1;
            string newFileName = "dec-" + Path.GetFileName(fileName);

            // Проверяем, существует ли файл
            if (!File.Exists("temp/dec-" + Path.GetFileName(fileName)))
            {
                outputFilePath = "temp/dec-" + Path.GetFileName(fileName);
            }
            else {

            // Проверка, существует ли файл
            while (File.Exists(Path.Combine(outputFilePath, newFileName)))
            {
              newFileName = $"({counter}){"dec-" + Path.GetFileName(fileName)}";
                counter++;
            }
                outputFilePath = "temp/" + newFileName;
          //  MessageBox.Show(newFileName);
        }
           
            // Создаем папку "temp", если она не существует
            string outputDirectory = Path.GetDirectoryName(outputFilePath);
            if (!Directory.Exists(outputDirectory))
            {
                Directory.CreateDirectory(outputDirectory);
            }
            // Используем using-блок для автоматического закрытия файла
            using (var outputFile = File.OpenWrite(outputFilePath))
            {
                // Сохраняем дешифрованные данные в выходной файл
                outputFile.Write(decryptedData, 0, decryptedData.Length);
            }

            // Возвращаем имя выходного файла
            return outputFilePath;
        }
        // Если строка не найдена, то файл не зашифрован
        return fileName;
    }

    // Метод для поиска начала зашифрованных данных в массиве байт
    private static bool FindStringIndex(byte[] data, byte[] pattern)
    {
        // Предполагаем, что совпадение найдено
        bool match = false;

        // Проходим по массиву данных, начиная с первого байта
        for (int i = 0; i <= pattern.Length - 1; i++)
        {
            // Если байты совпадают
            if (data[i] == pattern[i])
            {
                match = true;
            }
            else
            {
                match = false;
                break;
            }

        }
        return match;
    }

    // Метод для дешифрования данных с помощью XOR
    private static byte[] DecryptData(byte[] data, int startIndex, byte key)
    {
        // Создаем массив для хранения дешифрованных данных
        byte[] decryptedData = new byte[data.Length - startIndex];

        // Проходим по массиву данных, начиная с заданного индекса
        for (int i = startIndex, j = 0; i < data.Length; i++, j++)
        {
            // Дешифруем каждый байт с помощью XOR
            decryptedData[j] = (byte)(data[i] ^ key);
        }

        // Возвращаем массив дешифрованных данных
        return decryptedData;
    }

    // Метод для получения ключа XOR для Lineage2Ver121
    private static int GetXORKey121(string filename)
    {
        int sum = 0;
        foreach (char c in filename.ToLower())
        {
            sum += (byte)c;
        }
        return sum & 0xff;
    }


    // Метод для удаления временных файлов по завершению программы
    public static void DeleteTempFiles()
    {
        if (Directory.Exists("temp"))
        {
            // Используем рекурсивное удаление для удаления всех файлов и подпапок
            Directory.Delete("temp", true);
        }
    }
}

В даном исходники дешифратор вызывается из ProgramForm.cs в методе:
C#:
public void LoadFromFile(string filePathdec)
{
.......
.......

//Таким способом:
 string  filePath = Lineage2Decrypter.L2DecodeU(filePathdec); //Декомпилируем файл

.......
.......

}

Исходные коды уже находятся в архиве. Вам нужно лишь распаковать его запустить проект и «Скомпилировал
Спасибо
 
Назад
Сверху Снизу