Шифрование (GTA 4) — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
 
(не показаны 3 промежуточные версии 1 участника)
Строка 1: Строка 1:
==Алгоритмы шифрования==
+
=== Алгоритм шифрования ===
  
=== AES ===
+
Алгоритм шифрования, использованный для <code>[[RPF|*.rpf]]</code>, <code>[[IMG|*.img]]</code> и <code>[[SCO|*.sco]]</code> файлов называется [[Wikipedia:Advanced Encryption Standard|Advanced Encryption Standard]] (AES). Ключ шифрования одинаков для всех игровых версий GTA IV/EFLC, включая Xbox360. Этот же алгоритм (однако, с другими ключами) используется на многих играх от Rockstar.
 +
 
 +
Характеристика алгоритма шифрования:
  
Алгоритм шифрования, использованный для [[RPF]], [[IMG]] и [[SCO]] файлов, имеет название [[Wikipedia:Advanced Encryption Standard|Advanced Encryption Standard]] (AES) и следующую характеристику:
 
 
* Размер блока: 128 бит (16 байт)
 
* Размер блока: 128 бит (16 байт)
 
* Размер ключа: 256 бит (32 байта)
 
* Размер ключа: 256 бит (32 байта)
Строка 9: Строка 10:
 
* Повторяется: 16 раз
 
* Повторяется: 16 раз
  
Это значит что вся зашифрованная информация может быть разбита на блоки по 16 байт и расшифрована отдельно. Расшифровка происходит с использованием 128 битного ключа 16 раз на каждом блоке данных. Если последний блок меньше 16 байт, он остается не зашифрованным.
+
Вся зашифрованная информация может быть разбита на блоки по 16 байт и расшифрована отдельно. Расшифровка происходит с использованием 128 битного ключа 16 раз на каждом блоке данных. Если последний блок меньше 16 байт, он остается не зашифрованным.
  
==== Ключ ====
+
==== Ключ шифрования ====
  
256 - битный ключ, обязательный для шифровки и дешифровки может быть получен из <code>.exe</code> файла со следующих оффсетов:
+
256-битный ключ, обязательный для шифровки и дешифровки может быть получен из <code>.exe</code> файла со следующих оффсетов:
  
 
{| {{Таблица}}
 
{| {{Таблица}}
Строка 19: Строка 20:
 
!Оффсет
 
!Оффсет
 
|-
 
|-
|1.0 US || 0x00A94204
+
|GTA IV XENON (Xbox360) || 0x00A80F40
 
|-
 
|-
|1.0.1 US || 0x00B607C4
+
|GTA IV 1.0.0.0 US || 0x00A94204
 
|-
 
|-
|1.0.2 US || 0x00B56BC4
+
|GTA IV 1.0.1.0 US || 0x00B607C4
 
|-
 
|-
|1.0.3 US || 0x00B75C9C
+
|GTA IV 1.0.2.0 US || 0x00B56BC4
 
|-
 
|-
|1.0.4 US || 0x00B7AEF4
+
|GTA IV 1.0.3.0 US || 0x00B75C9C
 
|-
 
|-
|1.0.1.2 JAP || 0x00B8813C
+
|GTA IV 1.0.4.0 US || 0x00B7AEF4
 
|-
 
|-
|1.0.2.2 JAP || 0x00B8C38C
+
|GTA IV 1.0.1.2 JAP || 0x00B8813C
 
|-
 
|-
|1.0.0.1 RUS || 0x00B5B65C
+
|GTA IV 1.0.2.2 JAP || 0x00B8C38C
 
|-
 
|-
|1.0.1.1 RUS || 0x00B569F4
+
|GTA IV 1.0.0.1 RUS || 0x00B5B65C
 
|-
 
|-
|1.0.2.1 RUS || 0x00B76CB4
+
|GTA IV 1.0.1.1 RUS || 0x00B569F4
 
|-
 
|-
|1.0.3.1 RUS || 0x00B7AEFC
+
|GTA IV 1.0.2.1 RUS || 0x00B76CB4
 
|-
 
|-
|1.0.0.4 International ||0x00BE1370
+
|GTA IV 1.0.3.1 RUS || 0x00B7AEFC
 
|-
 
|-
|Xbox360 || 0x00A80F40
+
|GTA IV 1.0.0.4 International ||0x00BE1370
 +
|-
 +
|GTA IV 1.0.5.1 RUS ||0x00BE6518 
 +
|-
 +
|GTA IV 1.0.5.2 JAP ||
 +
|-
 +
|GTA IV 1.0.6.0 US ||0x00BE6540 
 +
|-
 +
|GTA IV 1.0.7.0 US ||0x00BE6510 
 +
|-
 +
|GTA IV 1.0.6.1 RUS ||
 +
|- 
 +
|GTA IV 1.0.6.2 JAP ||
 +
|- 
 +
|EFLC 1.1.0.0 US || 0x00BEF028
 +
|-
 +
|EFLC 1.1.0.1 RUS || 0x00BEF040
 +
|-
 +
|EFLC 1.1.1.0 International || 0x00C705E0
 +
|-
 +
|EFLC 1.1.2.0 International || 0x00C6DEEC
 
|}
 
|}
  
Ключ одинаков для всех игровых версий включая Xbox360 (его можно получить если извлечь <code>gtaiv_360.exe</code> из <code>default.xex</code>).  
+
В Xbox360-версии ключ можно извлечь из <code>gtaiv_360.exe</code>, находящемся в <code>default.xex</code>.
  
Вы можете использовать '''SHA1 хеш''' для проверки правильности ключа:
+
Вы можете использовать '''SHA1 хеш''' для проверки правильности ключа: <code>DE A3 75 EF 1E 6E F2 22 3A 12 21 C2 C5 75 C4 7B F1 7E FA 5E</code> ''(Примечание: это не ключ шифрования!)''
DE A3 75 EF 1E 6E F2 22 3A 12 21 C2 C5 75 C4 7B F1 7E FA 5E
+
'''''Примечание:''''' '''Это не ключ шифрования!'''
+
  
Игра может читать как шифрованные, так и не шифрованные архивы. Рекомендуется оставлять измененные игровые архивы не шифрованными.
+
Не рекомендуется публиковать где-либо сам ключ, либо включать его в программу, поскольку публикация ключа попадает под нарушение авторских прав.
 +
 
 +
Игра может читать как шифрованные, так и не шифрованные архивы. [[SparkIV]] оставляет измененные игровые архивы не шифрованными, [[OpenIV]] - шифрованными.
  
 
==== Примеры ====
 
==== Примеры ====
 
+
Программно расшифровка архивов может быть реализована через '''AesLib''':
Программы для расшифровки данных GTA IV могут выглядеть так:
+
 
+
'''С++:'''
+
 
<source lang="c">AES_set_decrypt_key(key, 256, context);
 
<source lang="c">AES_set_decrypt_key(key, 256, context);
 
 
for (int i = 0; i < (int) (data_size/16); i++) {
 
for (int i = 0; i < (int) (data_size/16); i++) {
 
     void *p = (void *) (data_offset + i*16);  
 
     void *p = (void *) (data_offset + i*16);  
Строка 66: Строка 83:
 
         AES_decrypt_block(p, p, context);
 
         AES_decrypt_block(p, p, context);
 
}</source>
 
}</source>
 
+
<source lang="delphi">AES_set_decrypt_key(@CAesKey[0], 256, context);
 
+
for i := 0 to data_size div 16 - 1 do begin
'''Delphi (дополнительно нужен [http://www.ieap.uni-kiel.de/surface/ag-berndt/download/delphi/aeslib.zip AesLib.pas]):'''
+
  Cardinal(p) := Cardinal(Data) + i*16;
<source lang="delphi">unit RockstarCrypt;
+
  for j := 1 to 16 do           // Повторяется 16 раз
 
+
    aes_decrypt_block(p^, p^, context);
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;
 
+
</source>
end.</source>
+
  
 
== Ссылки ==
 
== Ссылки ==

Текущая версия на 13:54, 20 июня 2010

Содержание

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

Алгоритм шифрования, использованный для *.rpf, *.img и *.sco файлов называется Advanced Encryption Standard (AES). Ключ шифрования одинаков для всех игровых версий GTA IV/EFLC, включая Xbox360. Этот же алгоритм (однако, с другими ключами) используется на многих играх от Rockstar.

Характеристика алгоритма шифрования:

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

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

Ключ шифрования

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

Версия игры Оффсет
GTA IV XENON (Xbox360) 0x00A80F40
GTA IV 1.0.0.0 US 0x00A94204
GTA IV 1.0.1.0 US 0x00B607C4
GTA IV 1.0.2.0 US 0x00B56BC4
GTA IV 1.0.3.0 US 0x00B75C9C
GTA IV 1.0.4.0 US 0x00B7AEF4
GTA IV 1.0.1.2 JAP 0x00B8813C
GTA IV 1.0.2.2 JAP 0x00B8C38C
GTA IV 1.0.0.1 RUS 0x00B5B65C
GTA IV 1.0.1.1 RUS 0x00B569F4
GTA IV 1.0.2.1 RUS 0x00B76CB4
GTA IV 1.0.3.1 RUS 0x00B7AEFC
GTA IV 1.0.0.4 International 0x00BE1370
GTA IV 1.0.5.1 RUS 0x00BE6518
GTA IV 1.0.5.2 JAP
GTA IV 1.0.6.0 US 0x00BE6540
GTA IV 1.0.7.0 US 0x00BE6510
GTA IV 1.0.6.1 RUS
GTA IV 1.0.6.2 JAP
EFLC 1.1.0.0 US 0x00BEF028
EFLC 1.1.0.1 RUS 0x00BEF040
EFLC 1.1.1.0 International 0x00C705E0
EFLC 1.1.2.0 International 0x00C6DEEC

В 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 (Примечание: это не ключ шифрования!)

Не рекомендуется публиковать где-либо сам ключ, либо включать его в программу, поскольку публикация ключа попадает под нарушение авторских прав.

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

Примеры

Программно расшифровка архивов может быть реализована через AesLib:

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);
}
AES_set_decrypt_key(@CAesKey[0], 256, context);
for i := 0 to data_size div 16 - 1 do begin
  Cardinal(p) := Cardinal(Data) + i*16;
  for j := 1 to 16 do           // Повторяется 16 раз
    aes_decrypt_block(p^, p^, context);
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