Перейти к публикации

Welcome to Call of Duty Black Ops , Call of Duty: Modern Warfare 3, COD2, COD4, COD4, MW2, Call of Duty War, CallofDuty Black Ops - В России!





Взлом .ff удался...


  • Вы не можете создать новую тему
  • Please log in to reply
6 replies to this topic

#1 Slinger

Slinger

    технический спецЫалист

  • Staff
  • PipPipPipPipPipPipPipPip
  • 3131 Сообщений:
  • Пол:Мужской
  • Location:Moscow, Russia

Отправлено 13 July 2008 - 23:22

Мануал по редактированию .ff файлов будет чуть позже, да и результаты пока не очень... Но в целом, доволен =)

Размещенное изображение
Размещенное изображение

#2 Hypothermia

Hypothermia

    Подполковник

  • Модераторы
  • PipPipPipPipPip
  • 777 Сообщений:
  • Пол:Мужской

Отправлено 13 July 2008 - 23:37

Просто крутой чел. :(
Изображение

#3 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 14 July 2008 - 13:36

С подачи Slinger'а немного покопался в распакованном .ff файле. Вообщем, удалось понять следующее:
Файл состоит из следующих полей: Заголовок, Таблица описания типов хранящихся данных, Сами данные
Каждый тип файла, хранящийся в .ff переводятся в свой формат (видимо так они и хранятся в памяти игры). Все данные идут последовательно друг за другом и чтобы перемещаться по ним нужно знать формат хранения каждого типа, а уж чтобы их извлечь и перевести в обычные, стандартные файлы ресурсов (*.str, *.iwi и т.п.) тут без мануала по хранению очень сложно (не для всех типов, но все же).
Ну т.е., к примеру, из простого: запись одного референса из файла локализации (файлы *.str) хранится в таком формате:
Байты				Значение
0x00..0x07		0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF  (8 байт 0xFF)
0x08..N			  stringZ  (строка перевода референса с завершающим нулем)
N+1..M			  stringZ (название референса с завершающим нулем)

Формат .gsc-файла (скрипта) тоже довольно простой:
Байты				Значение
0x00..0x03		0xFF 0xFF 0xFF 0xFF  (4 байта 0xFF)
0x04..0x07	   длина .gsc скрипта 
0x07..0x0A	   0xFF 0xFF 0xFF 0xFF  (4 байта 0xFF)
0x0B..N			stringZ (путь к реальному файлу скрипта с завершающим нулем, например: "codescripts/character_mp.gsc"0x00)
N+1..M			 stringZ (сам текст скрипта с завершающим нулем)

Так, теперь о заголовке самого распакованного файла .ff:
Байты				Значение
0x00..0x03		длина файла (не учитывая заголовок, т.е.: (реальная длина файла) минус 0x2C)
0x04..0x2B		??? (хз что, но, видимо, надо :))

Дальше идет заголовок "таблицы типов":
0x2C..0x2F	  кол-во элементов в "дополнительной таблице" данных (если не используется, то забивается нулями)
0x30..0x33	  если задано кол-во эл-ов в доп. таблице, то забивается 0xFF, иначе - нулями
0x34..0x37	  кол-во элементов в "основной таблице" 
0x38..0x3B	  0xFF 0xFF 0xFF 0xFF

Если задана "дополнительная таблица", то она следует сразу за заголовком:
Сначала идет таблица типов (?) данных (по 4 байта на 1 тип, т.е. она занимает 4 * [ кол-во эл-ов в доп таблице] )

0x3C..0x3F - код  типа для первого элемента данных
0x40..0x43 - код  типа для второго элемента данных
 и т.д. (всего 4 * [кол-во элементов в "доп. таблице" ] байт )

Сразу за доп. таблицей типов идут сами данные. Пока мне в качестве доп. таблицы встречались только перечень используемых тэгов (костей).
А они хранятся в виде stringZ (т.е. сразу за таблицей типов, друг за другом в виде строк с завершающим нулем)


Если дополнительная таблица не задана (а если задана, то сразу после ее данных) идет таблица типов основных данных (по 8 байт на 1 тип):

Тип записывается так:
Первые 4 байта - код типа
Вторые 4 байта - 0xFF

И так подряд идут коды всех типов данных.

Ну а после уже этой таблицы идут сами данные. А вот какой размер у каждого элемента данных и его формат хранения зависит от типа.
Например, референс строки локализации имеет тип 0x16.


Итог: Вытащить все данные в виде исходных файлов можно только если точно знать формат хранения каждого типа файла.
Хотя, некоторые можно рипнуть, например те же скрипты - заголовок у них вполне оригинальный, т.е. можно написать рипалку для gsc.
Для wav, вроде бы тоже.


Так вот, самое-то главное - казалось бы, строки локализации менять достаточно просто - вырезал старую (в hex-редакторе HxD), вставил новую, не забыл про завершающий ноль. Затем встав на адрес 0x2C и выделив блок до конца файла, вбиваем длину блока в первые 4 байта файла - указываем новый размер. Но вот только фик :(
Игра падает по ошибке. Хотя, на 1 символ больше мне удалось сделать. Все таким же способом. А вот больше не прокатило.
Это явно не контрольная сумма в файле (т.к. она бы не дала менять даже 1 символ), видимо еще где-то какой-то размер чего-нибудь указывается :D

P.S. Как распаковывать/запаковывать .ff файлы писать не буду - Slinger обещался написАть :D
P.P.S. Вообще, попробовать разобраться в формате хранения каждого типа файла можно так: насколько я понимаю, утилита для запаковки ресурсов в .ff файл есть в свободном доступе, так вот, создаем 1 файл любого типа (iwi, например), упаковываем его в .ff, потом распаковываем .ff и смотрим во что он превратился, сравниваем с оригиналом и вычисляем формат. И так для каждого типа. Но я не настолько отмороженный на всю голову хацкер чтобы этим заниматься :D
Размещенное изображение
cod.proc.ru

#4 Slinger

Slinger

    технический спецЫалист

  • Staff
  • PipPipPipPipPipPipPipPip
  • 3131 Сообщений:
  • Пол:Мужской
  • Location:Moscow, Russia

Отправлено 14 July 2008 - 16:32

разорвал мозг Серёг. Но бум разбираться... уж больно понравилось мутации файла делать =)
Размещенное изображение

#5 Slinger

Slinger

    технический спецЫалист

  • Staff
  • PipPipPipPipPipPipPipPip
  • 3131 Сообщений:
  • Пол:Мужской
  • Location:Moscow, Russia

Отправлено 17 August 2008 - 17:05

Провёл забавный опыт. В фаст файле каждой карты есть сведения о некоторых (не совсем ещё ясно каких) моделях, то есть где именно они стоят, под каким углом и т.д. Пока проводил эксперименты на взрывающихся бибиках. Сначала попробовал тупо вырезать код моделей, но .ff файл успешно повис. Дальше попробовал поменять местоположение машины (координаты в пространстве) и получил забавный парадокс :

Размещенное изображение

На рисунке я стаю непосредственно ВНУТРИ машины, которая теоретически (так как в радианте я ничего не менял) находится на своём месте, а по факту (по мере загрузки фаст файла) изменила своё местоположение. Но её что характерно можно уничтожить и всё равно встать внутрь неё =)

Скрин сделан на промоде ради доказательства того, что это не в режиме devmap сделано =)

Продолжаю глум
Размещенное изображение

#6 sERGE-002

sERGE-002

    Подполковник

  • Офицеры
  • PipPipPipPipPip
  • 895 Сообщений:
  • Пол:Мужской

Отправлено 17 August 2008 - 18:11

Ты меняешь положение только видимой модели, а ее браш остается на месте
Размещенное изображение
cod.proc.ru

#7 Slinger

Slinger

    технический спецЫалист

  • Staff
  • PipPipPipPipPipPipPipPip
  • 3131 Сообщений:
  • Пол:Мужской
  • Location:Moscow, Russia

Отправлено 17 August 2008 - 18:40

наоборот по-моему браш сдвинулся, а видимая модель то на месте осталась =)
Размещенное изображение




1 посетителей читают эту тему

0 пользователей, 1 гостей, 0 анонимных пользователей