Шифрование (GTA 4)

Материал из GTAModding.ru
Перейти к: навигация, поиск

Содержание

Алгоритмы шифрования

AES

Алгоритм шифрования, использованный для RPF, IMG и SCO файлов, имеет название Advanced Encryption Standard (AES) и следующую характеристику:

  • Размер блока: 128 бит (16 байт)
  • Размер ключа: 256 бит (32 байта)
  • Режим: electronic code book (ECB)
  • Повторяется: 16 раз

Это значит что вся зашифрованная информация может быть разбита на блоки по 16 байт и расшифрована отдельно. Расшифровка происходит с использованием 128 битного ключа 16 раз на каждом блоке данных. Если последний блок меньше 16 байт, он остается не зашифрованным.

Ключ

256 - битный ключ, обязательный для шифровки и дешифровки может быть получен из .exe файла со следующих оффсетов:

Версия игры Оффсет
1.0 US 0x00A94204
1.0.1 US 0x00B607C4
1.0.2 US 0x00B56BC4
1.0.3 US 0x00B75C9C
1.0.4 US 0x00B7AEF4
1.0.1.2 JAP 0x00B8813C
1.0.2.2 JAP 0x00B8C38C
1.0.0.1 RUS 0x00B5B65C
1.0.1.1 RUS 0x00B569F4
1.0.2.1 RUS 0x00B76CB4
1.0.3.1 RUS 0x00B7AEFC
Xbox360 0x00A80F40

Ключ одинаков для всех игровых версий включая Xbox360 (его можно получить если извлечь gtaiv_360.exe из default.xex).

Вы можете использовать SHA1 хеш для проверки правильности ключа:

DE A3 75 EF 1E 6E F2 22 3A 12 21 C2 C5 75 C4 7B F1 7E FA 5E

Примечание: Это не ключ шифрования!

Игра может читать как шифрованные, так и не шифрованные архивы. Рекомендуется оставлять измененные игровые архивы не шифрованными.

Примеры

Программы для расшифровки данных GTA IV могут выглядеть так:

С++:

AES_set_decrypt_key(key, 256, context);
 
for (int i = 0; i < (int) (data_size/16); i++) {
    void *p = (void *) (data_offset + i*16); 
    for (int j = 1; j <= 16; j++)            // Повторяется 16 раз
        AES_decrypt_block(p, p, context);
}


Delphi (дополнительно нужен AesLib.pas):

unit RockstarCrypt;
 
interface
 
const
  CKeyLength = 32;
 
type
  PAesKey = ^TAesKey;
  TAesKey = array[0..CKeyLength-1] of byte;
 
procedure RockstarDecrypt(Data: Pointer; Size: cardinal);
 
implementation
 
uses AesLib;
 
procedure RockstarDecrypt(Data: Pointer; Size: cardinal);
const
  CAesRounds = 16; // 16 секций.
  CAesKey: array[0..CKeyLength-1] of byte = (
    $1A, $B5, ... // Поместите сюда полный ключ или загрузите из  exe
  );
var
  AesCtx: TAesContext;
  i, j: Cardinal;
  p: Pointer;
begin
  aes_set_decrypt_key(@CAesKey[0], CKeyLength, AesCtx);
 
  for i := 0 to Size div 16 - 1 do begin
    Cardinal(p) := Cardinal(Data) + i*16;
    for j := 1 to CAesRounds do
      aes_decrypt_block(p^, p^, AesCtx);
  end;
end;
 
end.

Ссылки

п · о · р
GTA 4 Grand Theft Auto IV
Форматы файлов.dat.gxt.ide.img.ipl.nod.sco.rpf.rrr.wdd.wdr.wft.wbd/wbn.whm.wad.wnv.wpl.wtd
Документация Handling.datgta.datОружиеКатсценыПутиСкриптовые функцииШифрованиеФормат CFG файла настроек
Скриптинг в GTA 4
ИнструментыAPE IVASI LoaderIV NeedleGIMSOpenIVPathViewerSparkIVXLiveLessRaCon
Скриптовые программыAliceC++ Script HookScocl.NET Script HookDelphi Hook
ТуториалыИмпортирование текстур с помощью OpenIVИмпортирование текстур с помощью SparkIV
МодификацииGTA Vice City RageIV:SAGostown Paradise IV