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

Вскрытие Gangland

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

Ребята нужна помощь со вскрытием файлов от игры 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) 1

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


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

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

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

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

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

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

Войти

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

Войти сейчас



Zone of Games © 2003–2024 | Реклама на сайте.

×