Перейти к содержимому
Zone of Games Forum

Рекомендованные сообщения

Ребята нужна помощь со вскрытием файлов от игры Gangland, текстуры, звуки, модели достать удалось, а вот игровые скрипты, файлы карт, текст не поддается, видимо файлы архивов чем то сжаты, вот только чем не могу понять. Прилагаю несколько примеров таких архивов, буду благодарен за любую наводку в какую сторону копать.

https://disk.yandex.ru/d/HADBydmbPoR16g

Поделиться сообщением


Ссылка на сообщение

Файлы фрагментно зашифрованны с использованием операции XOR по “ключу”.

Структура файла:

uint32 : dataOffset — смещение на начало секции с файлами
uint8 : globalFlags — флаги характеризующие файл:
	0x1 — указывает файловому менеджеру игры, что файлы нужно расшифровать сразу же при открытии архива
	0x2 — указывает, что каждое вхождение файла в таблице содержит дополнительные флаги
	0x4 — указывает, что таблица файлов зашифрована

Структура таблицы файлов:

uint16 : count — количество файлов в архиве
<далее вхождения файлов>

Структура вхождения файла в таблице:

cstring : filename — относительный путь к файлу \ название файла
uint32 : size — размер файла

#if globalFlags & 0x2
uint8 : flags — дополнительные флаги файла:
	0x1 — файл зашифрован
#endif

Что касается шифрования, это тот же самый алгоритм, что используется в игре “The Escape from Paradise City”, который представлен в скрипте для quickBMS (я так понимаю именно он и использовался для распаковки других файлов):

Spoiler

public static void XorData(int key, byte[] buffer)
{
  int salt = 0x1001 * key - 0x6F0B34D9;
  int position = 0;

  if (buffer.Length > 3) {
    int block_size = buffer.Length / 4;
    position = block_size * 4;

    for (int i = 0; i < position; i += 4) {
      buffer[i + 0] ^= (byte)(salt >> 4);
      buffer[i + 1] ^= (byte)(salt >> 10);
      buffer[i + 2] ^= (byte)(salt >> 16);
      buffer[i + 3] ^= (byte)(salt >> 22);

      salt = ((int)(key ^ (key << 8) ^ 0xE08ADA15)) + ((0x10001 * key + 0x4D3B1949) * salt);
    }
  }

  if (position < buffer.Length) {
    int remaining = buffer.Length - position;
    for (int i = 0; i < remaining; ++i) {
      buffer[position + i] ^= (byte)salt;
    }
  }
}

 

Отличие только в используемом ключе:

key = dataOffset + 0x00E6C2CF — ключ для таблицы файлов
key = dataOffset + file.Offset + (file.Size * 7) — ключ для файла

Удалось написать программку и распаковать представленные архивы.

Найти её можно здесь: Прямая ссылка (GitHub)

  • Лайк (+1) 2

Поделиться сообщением


Ссылка на сообщение

Скажите, пожалуйста, а как использовать эту программу, что-то не запускается на Windows 11? И как использовать данный скрипт, через чего запустить? Очень хочется вскрыть map и lua...

Поделиться сообщением


Ссылка на сообщение

Получилось полностью распаковать все ресурсы игры. Вплоть до скриптов

Если кому то нужен, могу скинуть скрипт на питоне

Поделиться сообщением


Ссылка на сообщение
3 часа назад, sZeleboba сказал:

Получилось полностью распаковать все ресурсы игры. Вплоть до скриптов

Если кому то нужен, могу скинуть скрипт на питоне

Было бы очень здорово получить Ваш скрипт, давно мечтаю открыть архивы

Изменено пользователем Sergey8080

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас



×