Jump to content
Zone of Games Forum
Sign in to follow this  
sZeleboba

Вскрытие Gangland

Recommended Posts

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

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

Share this post


Link to post

Файлы фрагментно зашифрованны с использованием операции 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)

  • Like (+1) 1

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  



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

Система Orphus

×