Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Модификация игры Метро Исход
GAMEINATOR forums > Общие разделы > Создание и модификация игр. Геймдев.
Страницы: 1, 2
autistic
DaaGuda, мне кидай, ему и так неплохо живется в северной америке biggrin.gif Я коньяк предпочитаю, Remi Martin, если что smile.gif
Ну а если серьезно, подумываю о том чтобы отучить игру читать ресурсы из архивов, только тсс! ph34r.gif
DaaGuda
autistic, блин, ну коньяк дороговато. А может попробовать распаковать все архивы, удалить их - распакованные файлы оставить в папке content и попробовать запустить игру?
autistic
Цитата(DaaGuda @ 01.03.2019, 01:09) *
А может попробовать распаковать все архивы, удалить их - распакованные файлы оставить в папке content и попробовать запустить игру?

Это первое что я попробовал. Да и не я даже, hiker, еще десять лет назад попытался, перечитай тему про вскрытие Metro 2033.
Пока на уме вариант внедрить в адресное пространство метра свой код, который читал бы из файлов, а не из архивов. А в нужном месте, в metroexodus.exe, пропатчить вызов ф-ии чтения из архива на суррогатную. В принципе должно получиться, но посмотрим.
https://hastebin.com/diguvumese.m

\З.Ы. эх, не хотел больше светиться тут, но коньяк проклятый развязал язык biggrin.gif
Modera
autistic, а денува не помешает?
autistic
Цитата(Modera @ 01.03.2019, 01:40) *
а денува не помешает?

Дебажу уже несколько дней по вечерам, полет нормальный.


autistic
Цитата(zubr14 @ 02.03.2019, 00:30) *
Прямой вопрос - что из этого выйдет в перспективе? Всё таки модить на метрохе или все утащить в нашу классику?

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

Цитата(zubr14 @ 02.03.2019, 00:30) *
Я нихрена не понимаю в извлечении ресурсов и в целом в построении мода

Я лично готов поделиться любыми знаниями, коими обладаю сам, была бы возможность впитывать и нформацию и желание это делать.
zubr14
autistic, Я рад, что ты готов поделиться инфой, но пока я занимаюсь разгребанием жопы в реальной жизни и изучением нового, связанного с профессией и к модам отношусь, только как к игровому продукту, чтобы разгрузить мозг! Времени физически не хватает уже.

А вопрос вполне был прост - мне было интересно услышать, народ планирует ресурсы метро утащить по модам в сталкер или всё таки модить метро ( для этого его и вскрыли), а сталкеру дать покой временный smile.gif


И Почему тогда столько времени не могли вскрыть ресурсы? Три игры вышли! Некому было написать распаковщик или конкретно полуоткрытый мир взбудоражил умы? Мне реально интересно, я не в курсе.


iOrange, ты чего агришься? Не прав. Я честно написал, что я не шарю в модинге. Вы тут копаетесь, делаете что-то интересное и новое - молодцы. Чем тебя обидело моё "я нихрена не понимаю" - я вот не знаю. По моему вполне политкорректно. А так как, я не понимаю - я и пришел узнать, что за движуха намечается и какие перспективы.
autistic
Цитата(zubr14 @ 02.03.2019, 02:14) *
мне было интересно услышать, народ планирует ресурсы метро утащить по модам в сталкер или всё таки модить метро

Имхо, перво-наперво надо реализовать возможность поднимать игру из распакованных ресурсов, это даст возможность делать моды. Появится возможность - будут и моды.
DaaGuda
Чего плохого в том, что объекты растащат в сталкер? По мне хоть какое-то будет разнообразие, своё толком не делают, а пыс уже сильно приелось. Вот как будет более стабильный экспорт - я с радостью многое возьму для сталкера...
autistic
DaaGuda, из плохих новостей только одна - сталкер свое отжил. Нужно идти в ногу со временем и искать вкусности среди свежих игр.
DaaGuda
autistic, извините, но не все могут играть в современные игры, хотя бы на минимальных. И уж тем более на данном этапе метро в плане моддинга не интересен, я люблю сталкер за рпг - шутер не хочу делать) Я не против моддинга на метро, наоборот - это очень хорошо, но он не заменит сталкер (в плане моддинга).

Цитата(kiperenok @ 02.03.2019, 00:57) *
Но к моддингу самого Метро это ни как не относится.


Ошибаетесь, как раз имеет прямое отношение. Данными утилитами человек дает возможность прикоснутся к ресурсам игры - без чего моддинг не возможен. И как уже писалось давно - у автора есть планах написать упаковщик контента в формат игры...
kiperenok
Цитата(DaaGuda @ 02.03.2019, 01:01) *
autistic, извините, но не все могут играть в современные игры, хотя бы на минимальных. И уж тем более на данном этапе метро в плане моддинга не интересен, я люблю сталкер за рпг - шутер не хочу делать) Я не против моддинга на метро, наоборот - это очень хорошо, но он не заменит сталкер (в плане моддинга).

Цитата(kiperenok @ 02.03.2019, 00:57) *
Но к моддингу самого Метро это ни как не относится.


Ошибаетесь, как раз имеет прямое отношение. Данными утилитами человек дает возможность прикоснутся к ресурсам игры - без чего моддинг не возможен. И как уже писалось давно - у автора есть планах написать упаковщик контента в формат игры...

Я еще раз повторяю, все эти утилиты он делал и для первых двух игр. Я что то модов на них не видел. Утилиты нужные, но не для Метро. А для того, чтобы его ресурсы использовать в модах для сталка !
DaaGuda
kiperenok, предыдущие метро кто-то смог заставить читать контент из папки или написали запаковщик?
kiperenok
Цитата(DaaGuda @ 02.03.2019, 01:07) *
kiperenok, предыдущие метро кто-то смог заставить читать контент из папки или написали запаковщик?

Ты думаешь это было невозможно сделать ? Просто этим ни кто не занимался, так как это ни кому не нужно. Всем были нужны ресурсы из игры.
Единственный мод который я помню, это где обложки книг Метро 2033 заменили на Анну Семенович. Там по моему заставили игру грузить ее ресурсы в распакованном виде.
Stalker_Monolit
Цитата(autistic @ 02.03.2019, 00:54) *
DaaGuda, из плохих новостей только одна - сталкер свое отжил. Нужно идти в ногу со временем и искать вкусности среди свежих игр.

Он отживет свое когда перестанут в него играть, а hl и кс1.6 перестали играть что ли? Игре 20 годиков скоро, а стулкеру уже больше десятка как то твои аргументы "отжил" не клюется с сегодняшними реалиями.
JackieR
Цитата(DaaGuda @ 02.03.2019, 01:07) *
kiperenok, предыдущие метро кто-то смог заставить читать контент из папки или написали запаковщик?

Для 2033 написали.
autistic
Цитата(JackieR @ 02.03.2019, 11:05) *
Для 2033 написали.
А где-нибудь сохранились наработки, можно взглянуть?

Попробовал внедриться в адресное пространство метра, вроде работает


Осталось только найти адрес нужной ф-ии и подменить ее вызов на свою ф-ию при помощи вот такой вот техники https://github.com/TsudaKageyu/minhook
Modera
Цитата(autistic @ 02.03.2019, 13:34) *
А где-нибудь сохранились наработки, можно взглянуть?

https://yadi.sk/public?hash=gbDUcaFxnr52Ug9...vQgKreGL%2BI%3D
Запаковщик написан на quickbms и батнике. laugh.gif

Да, ещё в пиратке была такая штука pack.exe. При установке сначала папка content извлекалась из инсталятора в распакованном виде, а потом уже собиралась в игровые архивы. Не знаю это в оригинале так было или пираты для лучше сжатия изобрели.
autistic
Modera, о, круто, спасибо!

Цитата(Modera @ 02.03.2019, 16:54) *
Запаковщик написан на quickbms и батнике.

Это не важно на чем написано, важно знать куда и что писать wink_old.gif
abramcumner
Цитата(Modera @ 02.03.2019, 14:54) *
Да, ещё в пиратке была такая штука pack.exe. При установке сначала папка content извлекалась из инсталятора в распакованном виде, а потом уже собиралась в игровые архивы. Не знаю это в оригинале так было или пираты для лучше сжатия изобрели.

Конечно в оригинале не было smile.gif
Про это писали у нас на форуме: https://www.gameru.net/forum/index.php?show...st&p=964813

А в чем вообще проблема с запаковкой?
Создаются новые patch_*.vfx и vfs. В vfs можно файлы так класть, не сжимая.
autistic
abramcumner, если все срастется с чтением ресурсов из папки, то в конечном итоге хотелось бы иметь возможность модифицировать игру по следующей схеме:
- распаковка игровых ресурсов в папку
- модификация ресурсов с возможностью сразу запустить игру и проверить результат
- запаковка ресурсов обратно

Вот с последним пунктом неясно пока, либо все ресурсы с учетом изменений паковать как было в оригинале, либо только измененные ресурсы в патчи.
abramcumner
Цитата(autistic @ 02.03.2019, 15:25) *
abramcumner, если все срастется с чтением ресурсов из папки,

По идее не должно срастись. Иначе я не понимаю, чем денува вообще занимается? smile.gif И почему еще не сдампили в нормальный кряк.

Цитата
Вот с последним пунктом неясно пока, либо все ресурсы с учетом изменений паковать как было в оригинале, либо только измененные ресурсы в патчи.

В оригинале не было паковки всех ресурсов, только измененные.

Вот мод на 2033: http://www.playground.ru/files/metro_2033_...drobovik-30798/
Запакован только измененный level.bin
autistic
Почитал что за зверь этот Denuvo, оказывается это VMProtect обыкновенный. Исходя из того что про него пишут VMProtect'ом обычно весь код не защищают, только какие-то важные его участки. Вот и в случае с Исходом ф-ии чтения архивов похоже не защищены, вот к примеру код ф-ии, которая на вход принимает имя файла, а на выходе возвращает файловый дескриптор
+

Смещение 0x114ADC7C


Попробую реализовать обход этой ф-ии при помощи инструкции JMP и вызвать свою ф-ию, которая запишет в лог имя файла, а потом откроет его и вернет дескриптор. Если получится, значит можно двигаться дальше.
autistic
Подсунул свою функцию открытия файлов архивов, она вызывается несколько раз, а потом игра крешится где-то в другом месте. Непонятно, то ли денува виновата, то ли память побилась. Попробую написать небольшое тестовое приложение и перехватить его ф-ию, если сработает, значит что-то и впрямь нечисто с этой денувой.
На всякий случай выложу наработки, вдруг кому пригодится, а то терпение мое уже почти на исходе.

Краткая инструкция по сборке
Для сборки необходима Visual Studio 2013 (v12.0)
Если в системе кроме нее установлена более свежая версия, то при первом запуске система попросит обновить инструменты сборки, необходимо этот шаг пропустить.


Краткая инструкция по отладке
Путь к папке с игрой для запуска под отладчиком задается макросом GAME_DIRECTORY в файле common.h
В свойствах проекта MetroExodusLauncher необходимо в качестве рабочей директории прописать путь к папке в которую собираются бинари

Чтобы сработала точка останова на внедренной ф-ии, необходимо установить ее на 82 строке в dllmain.cpp. Затем установить точку останова на строку 288 в winmain.cpp запустить приложение под отладчиком и встать на нее. Далее нужно подцепиться отладчиком к процессу MetroExodus.exe и продолжить выполнение вплоть до срабатывания точки останова в dllmain.cpp

Если в процессе отладки что-то пошло не так, значит вы долго возились и истекло время таймаута, оно задается макросом TIMEOUT в common.h

Что еще
Поиск нужной ф-ии для подмены осуществляется ф-ией FindTargetFunctionAddress в адресном пространстве, в которое загружен MetroExodus.exe. Ф-ия осуществляет поиск по первым нескольким байтам машинного кода нужной ф-ии. Чтобы получить указатель на какую-то другую функцию нужно определить и по аналогии с существующим кодом захардкодить ее первые несколько байт
iOrange
Могу посоветовать обратить внимание на этот хукер - https://github.com/elishacloud/Hooking
Используется для многих патчеров / фиксеров.
В частности у нас в Silent Hill Widescreen Fix
autistic
Цитата(iOrange @ 11.03.2019, 09:33) *
Могу посоветовать обратить внимание на этот хукер - https://github.com/elishacloud/Hooking

Спасибо. Бегло просмотрел исходники, там вроде бы основной функционал нацелен на работу с таблицей экспорта из PE файла, в нашем случае от этого проку мало т.к. ф-ии которые хотелось бы похукать конечно же в таблицу экспорта не попали.
Ну и кроме того, есть подозрение, что в x64 битном адресном пространстве этот патчер работать не будет
Код
// Set HotPatch hook

        *patch_address = 0xE9; // jmp (4-byte relative)

        *((DWORD *)(patch_address + 1)) = (DWORD)hookproc - (DWORD)patch_address - 5; // relative address

        *((WORD *)apiproc) = 0xF9EB; // should be atomic write (jmp $-5)



Существует официальная библиотека от Microsoft которая позволяет вешать хуки, думаю ее опробовать и сравнить результат
https://github.com/microsoft/detours
abramcumner
Цитата(autistic @ 11.03.2019, 15:17) *

Там же х64 был за мегабабки. х86 на ластлайте работал отлично.

Опенсорс. Прикольно...
autistic
Цитата(abramcumner @ 11.03.2019, 17:25) *
х86 на ластлайте работал отлично.

Ну там как повезет, если смещение между адресами меньше чем 2^32 - считай повезло smile.gif
abramcumner
На х86 всегда везет, там смещений больше 2^32 не бывает smile.gif
autistic
А, ну для х86 приложения - да, Я думал речь про джамп по 32 разрядному смещению в х64 приложениях. Оно иногда срабатывает, иногда нет, в зависимости от smile.gif
autistic
Кажется понял что произошло. Т.к. хук устанавливается не просто на ф-ию, а на метод класса-наследника, похоже я сломал таблицу виртуальных ф-ий при присвоениии результата членам класса. Проверю позже.
Немного теории тут: https://github.com/gfreivasc/VMTHook
jamakasi
А в форточках есть способ делать аналоги линуксовых pipe и filedescriptor в фс?
autistic
К сожалению никакой виртуальной таблицей там и не пахнет, дело в чем-то другом sad.gif

Цитата(jamakasi @ 12.03.2019, 20:32) *
А в форточках есть способ делать аналоги линуксовых pipe

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

Цитата(jamakasi @ 12.03.2019, 20:32) *
и filedescriptor в фс?

Microsoft POSIX subsystem была введена одновременно с началом развития семейства Windows NT
jamakasi
autistic, тогда можно дескриптор\пайп сунуть на архив игры и написать маленькую прослойку проксирующую чтение файла. Будет гораздо проще разобрать как чтение файла происходит и соответственно понять структуры.
autistic
Цитата(jamakasi @ 12.03.2019, 23:42) *
можно дескриптор\пайп сунуть на архив игры и написать маленькую прослойку проксирующую чтение файла. Будет гораздо проще разобрать как чтение файла происходит и соответственно понять структуры.

Не очень понятно о чем конкретно идет речь, объясни подробней, пожалуйста. А общая суть понятна, нечто подобное (прослойку) я и пытаюсь реализовать, чтобы упростить разбор форматов и абстрагироваться от виртуальной файловой системы.
Modera
autistic, а можно эту твою штуковину MinGW собрать, или студия онли?
autistic
Modera, собрать-то может и можно, но будет ли работать? В комплекте с MinGW идет своя библиотека поддержки языка, которая несовместима на двоичном уровне со студийными msvcrt.dll По сути мы делаем безусловный переход из ф-ии собранной определенным компилятором в другую ф-ию, которая по идее должна быть собрана таким же. Я бы даже не рискнул использовать версию Visual Studio, отличную от той которой собирали игру. Установи VS2013 Community Edition, делов-то на 15 минут.

Там кстати полно разных сервис паков к ней, возможно хук не работает именно потому что разработчики используют не самый свежий СП, а я накатил самый последний. Надо пробовать с различными СП, я только в выходные смогу.
Modera
autistic, современный MinGW, который называется MinGW-w64 как-раз использует msvcrt.dll, это студия использует всякие там api-ms-win-блаблабла.dll.

Всё таки собрал, что-то оно у меня не находило функцию по начальным байтам. Вообще не совсем понял зачем так делать, можно же адрес функции получить гораздо проще LPBYTE(GetModuleHandle("metroexodus.exe"))+смещение_функции_относительно_imagebase.


Для эксперимента сделал вместо подмены функции открытия файла обёртку над функцией открытия скрипта, которая печатает имя скрипта в консоль и вызывает оригинальную функцию. Вполне себе работает, даже меню загрузилось.

autistic
Цитата(Modera @ 13.03.2019, 17:29) *
Всё таки собрал, что-то оно у меня не находило функцию по начальным байтам. Вообще не совсем понял зачем так делать

Странно, должно находить. Сделал так из лени, чтоб переделать когда-нибудь потом, неохота было смещение высчитывать.

Цитата(Modera @ 13.03.2019, 17:29) *
Для эксперимента сделал вместо подмены функции открытия файла обёртку над функцией открытия скрипта, которая печатает имя скрипта в консоль и вызывает оригинальную функцию. Вполне себе работает, даже меню загрузилось.

Имхо, оно потому и не крешится, что оригинальную ф-ию позвал. А вот если открыть при помощи _open и вернуть дескриптор будет работать?
Изначальная ф-ия имеется в виду, ее легко найти по брейкпоинту на NtCreateFile
iOrange
Цитата(Modera @ 13.03.2019, 14:29) *
печатает имя скрипта в консоль

Интересно что на вашем скрине куча файлов в папке "content/scripts" лежит, в то время как я в архиве только 2 файлика вижу huh.gif
"content/scripts/material.bin" бы мне очень пригодился
Modera
Цитата(autistic @ 13.03.2019, 16:03) *
Изначальная ф-ия имеется в виду, ее легко найти по брейкпоинту на NtCreateFile

Нашел эту функцию, у меня она немного подругому выглядит чем твоём коде. Там первым параметром передаётся не указатель на ReaderData, а указатель на указатель. Память под ReaderData выделятеся в самой функции, и полей там побольше чем 3.

Цитата(iOrange @ 13.03.2019, 16:37) *
Интересно что на вашем скрине куча файлов в папке "content/scripts" лежит, в то время как я в архиве только 2 файлика вижу huh.gif
"content/scripts/material.bin" бы мне очень пригодился

Они в config.bin на самом деле. Формат config.bin такой же как у scripts.bin в Метро 2033, так что разбить его на отдельные файлы не так уж трудно. Вопрос что с ними дальше делать, т.к. это конфиги, такие же как скелет, и почти все без отладочных данных.
autistic
Цитата(Modera @ 13.03.2019, 19:04) *
ашел эту функцию, у меня она немного подругому выглядит чем твоём коде.

Можешь выложить MD5 хэш MetroExodus.exe? Например вот этой тулзой можно посчитать. Я вечером сверю со своим бинарем.
Modera
autistic, 810d30f4e11bb047024261719aab1186
iOrange
Цитата(Modera @ 13.03.2019, 16:04) *
Они в config.bin на самом деле

Спасибо, загляну.

Цитата(Modera @ 13.03.2019, 16:04) *
Вопрос что с ними дальше делать

Потихоньку ковырять. Я вон скелет уже поковырял немного (много).
Мне сейчас материалы нужны. Попробую вытянуть из config.bin и поковырять.
autistic
Modera, разные у нас с тобой бинари.
+
MD5: e86a1c884d453db946e2668289c590a7
Version Code = 491191
Version Content = 491177
time date stamp Fri Feb 22 16:50:39 2019
12.00 linker version
6.00 operating system version
165D8000 size of image
600 size of headers
Размер файла: 347 МБ (364 583 424 байт)
iOrange
У меня такой же. Epic Store v0.1.0.13
Код
e86a1c884d453db946e2668289c590a7 *MetroExodus.exe


Может у Modera стим версия?
Modera
autistic, То что FilePointer в подменяемой функции никак не инициализируется это так и должно быть?
autistic
Modera, структура уже проинициализированная приходит { -1, 0, 0 } но интересно другое: в дизассемблере оригинальной ф-ии и в суррогатной функции ф-ия open вызывается из разных источников. Думаю все-таки коррапт из-за разных библиотек/настроек компилятора.
Modera
autistic, так посмотри из какой библиотеки игра использует эту функцию, получи её хендл с помощью GetModuleHandle а потом по нему адрес функции с помощью GetProcAddress, и будет работать с любой версией студии. Настройки компилятора не тоже доллжны повлиять.
autistic
Modera, ну я так и планировал, времени пока нет свободного. Из разных ли библиотек пока не знаю, но соглашения о вызовах разные. В моей версии CRT open объявлена как:
Код
extern "C++" _Check_return_ _CRT_INSECURE_DEPRECATE(_sopen_s) _CRTIMP int __cdecl _open(_In_z_ const char * _Filename, _In_ int _Openflag, _In_ int _PermissionMode = 0);

В то время как в метро используется cdecl при вызове этой ф-ии
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.