![]() |
Это мой первый опыт использования XOR и C#. Возможно, профессионалу мой код покажется не самым оптимальным, но он выполняет свою задачу.
У меня вопрос: как получить из текста "Lineage2Ver111" байты, которые будут такими же, как и из файла? Я не уверен, как это называется, но, по-моему, это связано с нулевыми байтами. Например, в коде я получаю байты для текста "Lineage2Ver111": "4C 69 6E....". А в файле для этого же текста я получаю такие байты:"4C 00 69 00 6E....". Я пробовал разные кодировки и много чего ещё, но не добавлять же после каждого байта нулевые байты. Я думаю, что в C# должна быть стандартная функция преобразования для этого. Этот код представляет собой дешифратор файлов Lineage2 версии 111. на C# Чтобы не тратить ваше время, сразу скажу, что этот код работает. У меня только один вопрос, который я описал выше. C#: [CODE] using System . IO ; public static class Lineage2Decrypter { // Ключ XOR для Lineage2Ver111 private const byte KeyXOR = 0xAC ; // Шаблон байтов для поиска начала зашифрованных данных Lineage2Ver111 private static readonly byte [ ] ByteVersion111 = { 76 , 0 , 105 , 0 , 110 , 0 , 101 , 0 , 97 , 0 , 103 , 0 , 101 , 0 , 50 , 0 , 86 , 0 , 101 , 0 , 114 , 0 , 49 , 0 , 49 , 0 , 49 , 0 } ; // Дешифрование файла Lineage2 public static string L2DecodeU ( string fileName ) { if ( ! File . Exists ( fileName ) ) return fileName ; byte [ ] fileData = File . ReadAllBytes ( fileName ) ; int startIndex = FindStringIndex ( fileData , ByteVersion111 ) ; if ( startIndex >= 0 ) { startIndex += ByteVersion111 . Length ; byte [ ] decryptedData = DecryptData ( fileData , startIndex , KeyXOR ) ; string outputFilePath = "temp/dec-" + Path . GetFileName ( fileName ) ; Directory . CreateDirectory ( Path . GetDirectoryName ( outputFilePath ) ) ; using ( FileStream outputFile = File . OpenWrite ( outputFilePath ) ) { outputFile . Write ( decryptedData , 0 , decryptedData . Length ) ; } return outputFilePath ; } return fileName ; } // Поиск начала зашифрованных данных в массиве байт private static int FindStringIndex ( byte [ ] data , byte [ ] pattern ) { for ( int i = 0 ; i |
Если вам понадобится использовать этот код, вы можете сделать это следующим образом:
C#: Код:
L2DecodeU |
Цитата:
Код:
Lineage2Ver111 |
Цитата:
Если есть возможно приведите свой код. |
Цитата:
Код:
public |
Цитата:
И 121 как я понимаю по вашему коду берет ключ из имени файла? |
Цитата:
|
Цитата:
C#: Код:
Encoding |
@BIT_hack,
C#: Код:
private |
Цитата:
111 и 121 поддерживаю чтение определенного фрагмента, а не блоков ранее заложенные размера. |
Цитата:
|
Цитата:
|
Цитата:
Открыли файл Создали буфер в стеке для считывания заголовка длиной первых 28 байт и потом прочитали эти 28 байт... Проверили соответствует ли заголовок 111 кодировки или нет, если нет, просто вышли и всё. Закомментирован вывод в командной строке и указано отобразить сообщением или ещё как или просто ничего не выводить, потому что не содержится указание на крипт. Что ещё надо? Какие оптимизации, для другой и других кодировок можно сделать по другому, это лишь пример быстрой работы с созданием минимальных аллокаций. А делать тоже самое с выделением байтов и определять кодировку файла, какой смысл? |
Спасибо ребята я разобрался там оказалось не все так страшно эти файл можно декодировать в несколько строк кода!
Алгоритм такой как вы описали выше! |
| Время: 20:27 |