Перейти к содержимому


Фотография

Mafia 2 - разбор ресурсов


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 33

#1 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 13 August 2010 - 17:59

Поиграл в демо версию, понравилось. Кстати копался в ресурсах игры. Почти все ресурсы хранятся в sds файлах, которые запакованные в zlib формат потоком по 16 КБ. Также в конце каждого sds файла содержиться XML файл, содержаший информацию о типах, именах и размерах ресурсов. Особый интерес к файлам в папке "\pc\sds\missionscript". Там в sds-файлах есть скомпилированные Lua скрипты версии 5.1. Движок использует открытые библиотеки Physfs, Zlib, Lua. Разархивировав файл, попробывал декомпилировать скрипт M05ListOfParts.luac из файла m05main.sds, но возникали ошибки, так как оказалось, что там используется слегка измененная модификация Lua. Первое отличие, которое пока что удалось установить, что тип Number использует не double, а float. Вот сижу правлю исходники декомпилятора luadec. Кстати вот кусок кода, который удалось получить из файла M05ListOfParts.luac:

DecompiledFunction = function(l_1_0)
  if game.datastore:IsVariableExist("CON_DEMO") == false then
	player = game.game:GetActivePlayer()
	player:InventoryAddItem(55)
	game.speech:LoadStage(60)
	idMessages = common.messages.Id
	questComM05 = Lokace.Create(idMessages.Distillery, idMessages.QuestDirector)
	game.datastore:SetBool("tempDemoStart", true)
	kteryPartik = game.datastore:GetNumber("missionPart")
	kteraJeMise = game.datastore:GetNumber("missionNumber")
	player:SetFightAbility(false, enums.FightAbility.COUNTER)
	player:SetFightAbility(false, enums.FightAbility.COMBO)
	if kteryPartik == 1 then
	  M05Part1(l_1_0)
	elseif kteryPartik == 2 then
	  M05Part2(l_1_0)
	elseif kteryPartik == 3 then
	  M05Part3(l_1_0)
	elseif kteryPartik == 4 then
	  M05Part4(l_1_0)
	elseif kteryPartik == 5 then
	  M05Part5(l_1_0)
	elseif kteryPartik == 6 then
	  M05Part6(l_1_0)
	elseif kteryPartik == 7 then
	  M05Part7(l_1_0)
	elseif kteryPartik == 8 then
	  M05Part8(l_1_0)
	elseif kteryPartik == 9 then
	  M05Demo(l_1_0)
	elseif kteryPartik == 10 then
	  M05DemoDistFlat(l_1_0)
	end
  end
end)

Там в демке много таких скриптов (336).
Скачать их все можно отсюда:
http://www.mediafire...0z4b0ktomibb1yx

Так вот может у кого есть опыт работы с Lua скриптами и их модификациями. Может кто увидит в них чью-то модификацию с открытым кодом? Или поможет написать декопмилятор?

Сообщение отредактировал San'OG: 13 August 2010 - 18:01


#2 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 13 August 2010 - 18:35

круто) респект тебе! не думал что кто-то так быстро за моддинг второй мафии возьмется) а подробнее про структуру sds можешь рассказать? хмл файл я там тоже нашел, но как-то дальше не копал пока, не совсем все понятно, в этом хмл в большинстве случаев кроме названий файлов идут записи вида <SlotRamRequired __type='Int'>0</SlotRamRequired> <SlotVramRequired __type='Int'>0</SlotVramRequired> <OtherRamRequired __type='Int'>0</OtherRamRequired> <OtherVramRequired __type='Int'>0</OtherVramRequired> то есть все по нолям (особенно для текстур) , или может я плохо что-то искал..

#3 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 13 August 2010 - 22:13

Структура SDS файла:

------------------------------------------
SDS header (SDS - Source Data Streams (?)) (0x0A + 4) (0x1A)
------------------------------------------
int32 sdsSign ("SDS/0")
int32 version (0x13)
int32 platformSign ("PC/0/0")
int32 sdsHeaderHash 0x5FFB74F3
------------------------------
fileInfo (0x34 + 4)
------------------------------
void* typeHeader 
void* zlibHeader
void* xmlFile
int32 totalSlotRam
int32 totalSlotVram
int32 totalOtherRam
int32 totalOtherVram
int32 ? const 0x01
char[16] const "73979+"
int32 resrcCount
int32 fileInfoHash
-----------------------
typeHeader
-----------------------
int32 typeCount
-----------------------
typeDesc[typeCount]
-----------------------
int32 typeId
int32 typeStrSize
char[typeStrSize] typeName
int32 ? typeFlags
------------------------
zlibHeader
------------------------
int32 zlibSign ("UEzl")
int32 uncompressedStreamSize (по умолчанию 16384 байт или 16 КБайт)
byte version
-----------------------
streamHeader
-----------------------
int32 ? compressedStreamSizeWithHeader
bool ? если 0 идет какая-то неизвестная фигня вместо сжатого блока
int32 ? uncompressedStreamSize (по умолчанию 16384 байт или 16 КБайт)
int32 ?
int32 ?
int32 ?
int32 compressedStreamSize
int32 ?
int32 ?
int32 ?
-----------------------
streamData
-----------------------

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

Вот заголовок такого блока

------------------------
data block header
------------------------
int32 id
int32 nextBlockOffset
int16 ?
int32 fileSize
int32 ?
...
------------------------
Правда иногда размер файла больше смещения

Пока такая картина, если найдете ошибки прошу сообщить.
Ах да разархивировать можно с помощью WinHex, нужно всего лишь выделить streamData, скопировать в новый файл, а потом Edit->Convert (Zlib inflate 32KB target), и так с каждым куском, а потом склеить их все :rolleyes:.

Хеш-функция:
int getHash(unsigned char* data, unsigned int size, unsigned int initHash = 0x811C9DC5)
{
	unsigned int r = initHash;
	for(unsigned int i = 0; i < size; i++) r = data[i] ^ (r*0x01000193);
}

Сообщение отредактировал San'OG: 16 August 2010 - 06:11


#4 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 13 August 2010 - 22:19

San'OG
Практически все игровые движки использующие Lua, компилируются с float вместо double.
Некоторые идут дальше, добавляя свои типы (например, VCS имеет встроенный тип для entity (т.е. CPed, CAutomobile, CObject и т.д.).

В свое время я пытался применить luadec к скриптам Bully. Не вышло. Его проще переписать с нуля, чем заточить под такую задачу.
Основная проблема - не в размере number (это мелкая правка в luaconf.h и последующая перекомпиляция), а то, что в скомпилированных скриптах отсутствуют имена locals и upvalues (и соответствующие поля в заголовоках чанков нулевые). luadec на этом жестоко падает.
Я пробовал сделать автогенерацию local names, но это не решает проблему с upvalues. Здесь нужно анализировать опкод closure и сопоставлять локальные переменные внешней функции с upvalue внутренней.

Есть и еще одна, пока непонятная, беда. Похоже, там есть какие-то дополнения, потому что ChunkSpy на некоторых скриптах из мафии падает. С этим я пока не разбирался.

Если будет нормальная декомпиляция, с компиляцией проблем быть не должно. Если там нет никаких дополнений, то достаточно будет скомпилировать скрипты (все то, что из них не вырезает компилятор, будет просто проигнорировано). Если дополнения есть - придется править сам lua.

(Я, под это дело, решил заняться своим декомпиляторм lua, но пока меня больше интересует не 5.1, а 5.0.2 (т.е. Bully))
Если получится - по сделать поддержку 5.1 - не такая большая проблема. Если все пойдет идеально - как раз к релизу успею ;)
You think your day was surreal? Try mine.

#5 Seemann

Seemann

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 266 сообщений
  • Пол:Мужчина
  • Город:Россия, Иркутск/СПб

Отправлено 13 August 2010 - 23:13

Раз структура SDS-файлов более-менее понятна, почему бы не сварганить простенький unpacker? Или таковой уже имеется?

#6 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 13 August 2010 - 23:15

listener О, было бы не плохо. Так я вот думаю попробую повозиться с декомпиляцией , если не выйдет, то буду дальше копашить ресурсы :wacko: С Lua познакомился 2 дня назад, а уже сижу разбираюсь в декомпиляторе, хотя полного представляния о языке у меня нет :D, вот думаю за одно и в языке разберусь исходники ковыряя :lol:

#7 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 13 August 2010 - 23:17

Seemann О, блин здрасте =) давно не виделись, кстати я займусь этим, хочу попробывать на C# написать.

Сообщение отредактировал San'OG: 13 August 2010 - 23:17


#8 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 14 August 2010 - 11:05

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

Сообщение отредактировал San'OG: 15 August 2010 - 12:01


#9 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 14 August 2010 - 11:32

Есть BMS скрипт для распаковки sds файла: BMS script v2 by WRS
Прогу можно взять отсюда: QuickBMS
Правда он не читает заголовки распакованных файлов.
Здесь ведется активное обсуждение распаковки и скриптинга: клац

Сообщение отредактировал San'OG: 14 August 2010 - 11:37


#10 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 15 August 2010 - 11:35

спасибо большое за инфу, чуть позже покопаюсь тоже)

#11 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 16 August 2010 - 03:23

Появилась возможность выполнять Lua скрипты прямо в игре с помощью инжектора: http://forums.playgr...mafia_2/628170/. Можно сменить погоду, время суток, телепортироваться и много чего ещё. =)

З.Ы Разобрал функцию хеширования, скоро можно будет создавать свои SDS файлы.

Сообщение отредактировал San'OG: 16 August 2010 - 06:00


#12 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 17 August 2010 - 09:14

В архиве, на который была ссылка - скрипты битые. Они записаны в text mode (т.е., при записи после каждого 0x0D вставляется 0x0A).
You think your day was surreal? Try mine.

#13 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 17 August 2010 - 14:07

Да я знал это, забыл сообщить :rolleyes:

#14 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 17 August 2010 - 14:45

Пакостник. Я вчера полтора часа искал в дизассеблере ошибку.
You think your day was surreal? Try mine.

#15 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 17 August 2010 - 16:38

listener :lol:

#16 San'OG

San'OG

    Участник

  • Пользователи
  • PipPip
  • 12 сообщений
  • Пол:Мужчина
  • Город:Беларусь

Отправлено 17 August 2010 - 16:43

У меня декомпилирует любой код теперь, но остались некоторые внутренние проблемы: http://pastie.org/1098065

#17 Sergeanur

Sergeanur

    Активный участник

  • LCSTeam
  • PipPipPip
  • 270 сообщений
  • Пол:Мужчина


Отправлено 18 August 2010 - 20:40

Насколько я понял, SDS представляет собой следующее: 1) Заголовок, в котором прописывается, какие типы ресурсов упакованы в этот архив (звуки, анимация и т.п.) 2) Файлы, сжатые zlib'ом, которые в распакованном варианте весят 16 384 байт, а между ними какая-то несжатая информация. Теория: если все эти распакованные кусочки соединить, то получается вполне "логический" и понятный архив. 3) XML файл. Хз зачем он. Теория: в нём прописаны значения, необходимые для чтения. В звуковых файлах, например, хранятся файлы в формате wav, но без заголовков, а в XML хранятся параметры из этих заголовков.

Сообщение отредактировал Sergeanur: 18 August 2010 - 20:42

GTA Stories ships in...


#18 bykin

bykin

    Участник

  • Пользователи
  • PipPip
  • 19 сообщений

Отправлено 19 August 2010 - 02:11

мафию 2 я думаю быстро разберут в отличий от гта 4.

Сообщение отредактировал bykin: 19 August 2010 - 02:11


#19 Sergeanur

Sergeanur

    Активный участник

  • LCSTeam
  • PipPipPip
  • 270 сообщений
  • Пол:Мужчина


Отправлено 19 August 2010 - 09:03

Будем надеяться.

GTA Stories ships in...


#20 Sergeanur

Sergeanur

    Активный участник

  • LCSTeam
  • PipPipPip
  • 270 сообщений
  • Пол:Мужчина


Отправлено 02 September 2010 - 10:19

На игру уже появился мод фриплея. Хотя в игровых файлах скрипт фриплея и без мода есть.

GTA Stories ships in...





Количество пользователей, читающих эту тему: 5

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