DaaGuda, мне кидай, ему и так неплохо живется в северной америке Я коньяк предпочитаю, Remi Martin, если что Ну а если серьезно, подумываю о том чтобы отучить игру читать ресурсы из архивов, только тсс!
DaaGuda
28.02.2019, 23:09
autistic, блин, ну коньяк дороговато. А может попробовать распаковать все архивы, удалить их - распакованные файлы оставить в папке content и попробовать запустить игру?
autistic
28.02.2019, 23:21
Цитата(DaaGuda @ 01.03.2019, 01:09)
А может попробовать распаковать все архивы, удалить их - распакованные файлы оставить в папке content и попробовать запустить игру?
Это первое что я попробовал. Да и не я даже, hiker, еще десять лет назад попытался, перечитай тему про вскрытие Metro 2033. Пока на уме вариант внедрить в адресное пространство метра свой код, который читал бы из файлов, а не из архивов. А в нужном месте, в metroexodus.exe, пропатчить вызов ф-ии чтения из архива на суррогатную. В принципе должно получиться, но посмотрим. https://hastebin.com/diguvumese.m
\З.Ы. эх, не хотел больше светиться тут, но коньяк проклятый развязал язык
Modera
28.02.2019, 23:40
autistic, а денува не помешает?
autistic
28.02.2019, 23:46
Цитата(Modera @ 01.03.2019, 01:40)
а денува не помешает?
Дебажу уже несколько дней по вечерам, полет нормальный.
autistic
02.03.2019, 00:03
Цитата(zubr14 @ 02.03.2019, 00:30)
Прямой вопрос - что из этого выйдет в перспективе? Всё таки модить на метрохе или все утащить в нашу классику?
Не очень понял вторую часть вопроса - что и куда утащить, но в перспективе хотелось бы именно получить возможность модифицировать игру Метро Исход.
Цитата(zubr14 @ 02.03.2019, 00:30)
Я нихрена не понимаю в извлечении ресурсов и в целом в построении мода
Я лично готов поделиться любыми знаниями, коими обладаю сам, была бы возможность впитывать и нформацию и желание это делать.
zubr14
02.03.2019, 00:14
autistic, Я рад, что ты готов поделиться инфой, но пока я занимаюсь разгребанием жопы в реальной жизни и изучением нового, связанного с профессией и к модам отношусь, только как к игровому продукту, чтобы разгрузить мозг! Времени физически не хватает уже.
А вопрос вполне был прост - мне было интересно услышать, народ планирует ресурсы метро утащить по модам в сталкер или всё таки модить метро ( для этого его и вскрыли), а сталкеру дать покой временный
И Почему тогда столько времени не могли вскрыть ресурсы? Три игры вышли! Некому было написать распаковщик или конкретно полуоткрытый мир взбудоражил умы? Мне реально интересно, я не в курсе.
iOrange, ты чего агришься? Не прав. Я честно написал, что я не шарю в модинге. Вы тут копаетесь, делаете что-то интересное и новое - молодцы. Чем тебя обидело моё "я нихрена не понимаю" - я вот не знаю. По моему вполне политкорректно. А так как, я не понимаю - я и пришел узнать, что за движуха намечается и какие перспективы.
autistic
02.03.2019, 00:27
Цитата(zubr14 @ 02.03.2019, 02:14)
мне было интересно услышать, народ планирует ресурсы метро утащить по модам в сталкер или всё таки модить метро
Имхо, перво-наперво надо реализовать возможность поднимать игру из распакованных ресурсов, это даст возможность делать моды. Появится возможность - будут и моды.
DaaGuda
02.03.2019, 00:41
Чего плохого в том, что объекты растащат в сталкер? По мне хоть какое-то будет разнообразие, своё толком не делают, а пыс уже сильно приелось. Вот как будет более стабильный экспорт - я с радостью многое возьму для сталкера...
autistic
02.03.2019, 00:54
DaaGuda, из плохих новостей только одна - сталкер свое отжил. Нужно идти в ногу со временем и искать вкусности среди свежих игр.
DaaGuda
02.03.2019, 01:01
autistic, извините, но не все могут играть в современные игры, хотя бы на минимальных. И уж тем более на данном этапе метро в плане моддинга не интересен, я люблю сталкер за рпг - шутер не хочу делать) Я не против моддинга на метро, наоборот - это очень хорошо, но он не заменит сталкер (в плане моддинга).
Цитата(kiperenok @ 02.03.2019, 00:57)
Но к моддингу самого Метро это ни как не относится.
Ошибаетесь, как раз имеет прямое отношение. Данными утилитами человек дает возможность прикоснутся к ресурсам игры - без чего моддинг не возможен. И как уже писалось давно - у автора есть планах написать упаковщик контента в формат игры...
kiperenok
02.03.2019, 01:04
Цитата(DaaGuda @ 02.03.2019, 01:01)
autistic, извините, но не все могут играть в современные игры, хотя бы на минимальных. И уж тем более на данном этапе метро в плане моддинга не интересен, я люблю сталкер за рпг - шутер не хочу делать) Я не против моддинга на метро, наоборот - это очень хорошо, но он не заменит сталкер (в плане моддинга).
Цитата(kiperenok @ 02.03.2019, 00:57)
Но к моддингу самого Метро это ни как не относится.
Ошибаетесь, как раз имеет прямое отношение. Данными утилитами человек дает возможность прикоснутся к ресурсам игры - без чего моддинг не возможен. И как уже писалось давно - у автора есть планах написать упаковщик контента в формат игры...
Я еще раз повторяю, все эти утилиты он делал и для первых двух игр. Я что то модов на них не видел. Утилиты нужные, но не для Метро. А для того, чтобы его ресурсы использовать в модах для сталка !
DaaGuda
02.03.2019, 01:07
kiperenok, предыдущие метро кто-то смог заставить читать контент из папки или написали запаковщик?
kiperenok
02.03.2019, 01:14
Цитата(DaaGuda @ 02.03.2019, 01:07)
kiperenok, предыдущие метро кто-то смог заставить читать контент из папки или написали запаковщик?
Ты думаешь это было невозможно сделать ? Просто этим ни кто не занимался, так как это ни кому не нужно. Всем были нужны ресурсы из игры. Единственный мод который я помню, это где обложки книг Метро 2033 заменили на Анну Семенович. Там по моему заставили игру грузить ее ресурсы в распакованном виде.
Stalker_Monolit
02.03.2019, 03:21
Цитата(autistic @ 02.03.2019, 00:54)
DaaGuda, из плохих новостей только одна - сталкер свое отжил. Нужно идти в ногу со временем и искать вкусности среди свежих игр.
Он отживет свое когда перестанут в него играть, а hl и кс1.6 перестали играть что ли? Игре 20 годиков скоро, а стулкеру уже больше десятка как то твои аргументы "отжил" не клюется с сегодняшними реалиями.
JackieR
02.03.2019, 09:05
Цитата(DaaGuda @ 02.03.2019, 01:07)
kiperenok, предыдущие метро кто-то смог заставить читать контент из папки или написали запаковщик?
Для 2033 написали.
autistic
02.03.2019, 13:34
Цитата(JackieR @ 02.03.2019, 11:05)
Для 2033 написали.
А где-нибудь сохранились наработки, можно взглянуть?
Попробовал внедриться в адресное пространство метра, вроде работает
Да, ещё в пиратке была такая штука pack.exe. При установке сначала папка content извлекалась из инсталятора в распакованном виде, а потом уже собиралась в игровые архивы. Не знаю это в оригинале так было или пираты для лучше сжатия изобрели.
autistic
02.03.2019, 14:59
Modera, о, круто, спасибо!
Цитата(Modera @ 02.03.2019, 16:54)
Запаковщик написан на quickbms и батнике.
Это не важно на чем написано, важно знать куда и что писать
abramcumner
02.03.2019, 15:06
Цитата(Modera @ 02.03.2019, 14:54)
Да, ещё в пиратке была такая штука pack.exe. При установке сначала папка content извлекалась из инсталятора в распакованном виде, а потом уже собиралась в игровые архивы. Не знаю это в оригинале так было или пираты для лучше сжатия изобрели.
А в чем вообще проблема с запаковкой? Создаются новые patch_*.vfx и vfs. В vfs можно файлы так класть, не сжимая.
autistic
02.03.2019, 15:25
abramcumner, если все срастется с чтением ресурсов из папки, то в конечном итоге хотелось бы иметь возможность модифицировать игру по следующей схеме: - распаковка игровых ресурсов в папку - модификация ресурсов с возможностью сразу запустить игру и проверить результат - запаковка ресурсов обратно
Вот с последним пунктом неясно пока, либо все ресурсы с учетом изменений паковать как было в оригинале, либо только измененные ресурсы в патчи.
abramcumner
02.03.2019, 15:33
Цитата(autistic @ 02.03.2019, 15:25)
abramcumner, если все срастется с чтением ресурсов из папки,
По идее не должно срастись. Иначе я не понимаю, чем денува вообще занимается? И почему еще не сдампили в нормальный кряк.
Цитата
Вот с последним пунктом неясно пока, либо все ресурсы с учетом изменений паковать как было в оригинале, либо только измененные ресурсы в патчи.
В оригинале не было паковки всех ресурсов, только измененные.
Почитал что за зверь этот Denuvo, оказывается это VMProtect обыкновенный. Исходя из того что про него пишут VMProtect'ом обычно весь код не защищают, только какие-то важные его участки. Вот и в случае с Исходом ф-ии чтения архивов похоже не защищены, вот к примеру код ф-ии, которая на вход принимает имя файла, а на выходе возвращает файловый дескриптор
+
Смещение 0x114ADC7C
Попробую реализовать обход этой ф-ии при помощи инструкции JMP и вызвать свою ф-ию, которая запишет в лог имя файла, а потом откроет его и вернет дескриптор. Если получится, значит можно двигаться дальше.
autistic
11.03.2019, 00:17
Подсунул свою функцию открытия файлов архивов, она вызывается несколько раз, а потом игра крешится где-то в другом месте. Непонятно, то ли денува виновата, то ли память побилась. Попробую написать небольшое тестовое приложение и перехватить его ф-ию, если сработает, значит что-то и впрямь нечисто с этой денувой. На всякий случай выложу наработки, вдруг кому пригодится, а то терпение мое уже почти на исходе.
Краткая инструкция по сборке
Для сборки необходима 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
11.03.2019, 07:33
Могу посоветовать обратить внимание на этот хукер - https://github.com/elishacloud/Hooking Используется для многих патчеров / фиксеров. В частности у нас в Silent Hill Widescreen Fix
Спасибо. Бегло просмотрел исходники, там вроде бы основной функционал нацелен на работу с таблицей экспорта из PE файла, в нашем случае от этого проку мало т.к. ф-ии которые хотелось бы похукать конечно же в таблицу экспорта не попали. Ну и кроме того, есть подозрение, что в x64 битном адресном пространстве этот патчер работать не будет
*((WORD *)apiproc) = 0xF9EB; // should be atomic write (jmp $-5)
Существует официальная библиотека от Microsoft которая позволяет вешать хуки, думаю ее опробовать и сравнить результат https://github.com/microsoft/detours
Там же х64 был за мегабабки. х86 на ластлайте работал отлично.
Опенсорс. Прикольно...
autistic
11.03.2019, 15:31
Цитата(abramcumner @ 11.03.2019, 17:25)
х86 на ластлайте работал отлично.
Ну там как повезет, если смещение между адресами меньше чем 2^32 - считай повезло
abramcumner
11.03.2019, 15:53
На х86 всегда везет, там смещений больше 2^32 не бывает
autistic
11.03.2019, 15:58
А, ну для х86 приложения - да, Я думал речь про джамп по 32 разрядному смещению в х64 приложениях. Оно иногда срабатывает, иногда нет, в зависимости от
autistic
12.03.2019, 16:01
Кажется понял что произошло. Т.к. хук устанавливается не просто на ф-ию, а на метод класса-наследника, похоже я сломал таблицу виртуальных ф-ий при присвоениии результата членам класса. Проверю позже. Немного теории тут: https://github.com/gfreivasc/VMTHook
jamakasi
12.03.2019, 18:32
А в форточках есть способ делать аналоги линуксовых pipe и filedescriptor в фс?
autistic
12.03.2019, 21:38
К сожалению никакой виртуальной таблицей там и не пахнет, дело в чем-то другом
Цитата(jamakasi @ 12.03.2019, 20:32)
А в форточках есть способ делать аналоги линуксовых pipe
Ну каналы связи это способ межпроцессного (в том числе) взаимодействия не только в линуксах, эта концепция существует независимо.
autistic, тогда можно дескриптор\пайп сунуть на архив игры и написать маленькую прослойку проксирующую чтение файла. Будет гораздо проще разобрать как чтение файла происходит и соответственно понять структуры.
autistic
12.03.2019, 21:50
Цитата(jamakasi @ 12.03.2019, 23:42)
можно дескриптор\пайп сунуть на архив игры и написать маленькую прослойку проксирующую чтение файла. Будет гораздо проще разобрать как чтение файла происходит и соответственно понять структуры.
Не очень понятно о чем конкретно идет речь, объясни подробней, пожалуйста. А общая суть понятна, нечто подобное (прослойку) я и пытаюсь реализовать, чтобы упростить разбор форматов и абстрагироваться от виртуальной файловой системы.
Modera
12.03.2019, 22:28
autistic, а можно эту твою штуковину MinGW собрать, или студия онли?
autistic
13.03.2019, 09:26
Modera, собрать-то может и можно, но будет ли работать? В комплекте с MinGW идет своя библиотека поддержки языка, которая несовместима на двоичном уровне со студийными msvcrt.dll По сути мы делаем безусловный переход из ф-ии собранной определенным компилятором в другую ф-ию, которая по идее должна быть собрана таким же. Я бы даже не рискнул использовать версию Visual Studio, отличную от той которой собирали игру. Установи VS2013 Community Edition, делов-то на 15 минут.
Там кстати полно разных сервис паков к ней, возможно хук не работает именно потому что разработчики используют не самый свежий СП, а я накатил самый последний. Надо пробовать с различными СП, я только в выходные смогу.
Modera
13.03.2019, 15:29
autistic, современный MinGW, который называется MinGW-w64 как-раз использует msvcrt.dll, это студия использует всякие там api-ms-win-блаблабла.dll.
Всё таки собрал, что-то оно у меня не находило функцию по начальным байтам. Вообще не совсем понял зачем так делать, можно же адрес функции получить гораздо проще LPBYTE(GetModuleHandle("metroexodus.exe"))+смещение_функции_относительно_imagebase.
Для эксперимента сделал вместо подмены функции открытия файла обёртку над функцией открытия скрипта, которая печатает имя скрипта в консоль и вызывает оригинальную функцию. Вполне себе работает, даже меню загрузилось.
autistic
13.03.2019, 16:03
Цитата(Modera @ 13.03.2019, 17:29)
Всё таки собрал, что-то оно у меня не находило функцию по начальным байтам. Вообще не совсем понял зачем так делать
Странно, должно находить. Сделал так из лени, чтоб переделать когда-нибудь потом, неохота было смещение высчитывать.
Цитата(Modera @ 13.03.2019, 17:29)
Для эксперимента сделал вместо подмены функции открытия файла обёртку над функцией открытия скрипта, которая печатает имя скрипта в консоль и вызывает оригинальную функцию. Вполне себе работает, даже меню загрузилось.
Имхо, оно потому и не крешится, что оригинальную ф-ию позвал. А вот если открыть при помощи _open и вернуть дескриптор будет работать? Изначальная ф-ия имеется в виду, ее легко найти по брейкпоинту на NtCreateFile
iOrange
13.03.2019, 16:37
Цитата(Modera @ 13.03.2019, 14:29)
печатает имя скрипта в консоль
Интересно что на вашем скрине куча файлов в папке "content/scripts" лежит, в то время как я в архиве только 2 файлика вижу "content/scripts/material.bin" бы мне очень пригодился
Modera
13.03.2019, 17:04
Цитата(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
13.03.2019, 17:16
Цитата(Modera @ 13.03.2019, 19:04)
ашел эту функцию, у меня она немного подругому выглядит чем твоём коде.
Можешь выложить MD5 хэш MetroExodus.exe? Например вот этой тулзой можно посчитать. Я вечером сверю со своим бинарем.
Modera
13.03.2019, 17:24
autistic, 810d30f4e11bb047024261719aab1186
iOrange
13.03.2019, 17:29
Цитата(Modera @ 13.03.2019, 16:04)
Они в config.bin на самом деле
Спасибо, загляну.
Цитата(Modera @ 13.03.2019, 16:04)
Вопрос что с ними дальше делать
Потихоньку ковырять. Я вон скелет уже поковырял немного (много). Мне сейчас материалы нужны. Попробую вытянуть из config.bin и поковырять.
autistic
13.03.2019, 21:28
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
13.03.2019, 21:33
У меня такой же. Epic Store v0.1.0.13
Код
e86a1c884d453db946e2668289c590a7 *MetroExodus.exe
Может у Modera стим версия?
Modera
13.03.2019, 21:37
autistic, То что FilePointer в подменяемой функции никак не инициализируется это так и должно быть?
autistic
13.03.2019, 21:44
Modera, структура уже проинициализированная приходит { -1, 0, 0 } но интересно другое: в дизассемблере оригинальной ф-ии и в суррогатной функции ф-ия open вызывается из разных источников. Думаю все-таки коррапт из-за разных библиотек/настроек компилятора.
Modera
13.03.2019, 21:50
autistic, так посмотри из какой библиотеки игра использует эту функцию, получи её хендл с помощью GetModuleHandle а потом по нему адрес функции с помощью GetProcAddress, и будет работать с любой версией студии. Настройки компилятора не тоже доллжны повлиять.
autistic
13.03.2019, 21:56
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 при вызове этой ф-ии
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.