Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!
3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Модификация игры Метро Исход
autistic
сообщение 02.03.2019, 15:25
Сообщение #21


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

Сообщение отредактировал autistic - 02.03.2019, 15:25


--------------------
nop
Перейти в начало страницы
 
abramcumner
сообщение 02.03.2019, 15:33
Сообщение #22


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(autistic @ 02.03.2019, 15:25) *
abramcumner, если все срастется с чтением ресурсов из папки,

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

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

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

Вот мод на 2033: http://www.playground.ru/files/metro_2033_...drobovik-30798/
Запакован только измененный level.bin

Сообщение отредактировал abramcumner - 02.03.2019, 15:35
Перейти в начало страницы
 
autistic
сообщение 03.03.2019, 14:43
Сообщение #23


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Почитал что за зверь этот Denuvo, оказывается это VMProtect обыкновенный. Исходя из того что про него пишут VMProtect'ом обычно весь код не защищают, только какие-то важные его участки. Вот и в случае с Исходом ф-ии чтения архивов похоже не защищены, вот к примеру код ф-ии, которая на вход принимает имя файла, а на выходе возвращает файловый дескриптор
+

Смещение 0x114ADC7C


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


--------------------
nop
Перейти в начало страницы
 
autistic
сообщение 11.03.2019, 00:17
Сообщение #24


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

Краткая инструкция по сборке
Для сборки необходима 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. Ф-ия осуществляет поиск по первым нескольким байтам машинного кода нужной ф-ии. Чтобы получить указатель на какую-то другую функцию нужно определить и по аналогии с существующим кодом захардкодить ее первые несколько байт


Сообщение отредактировал autistic - 11.03.2019, 00:19


--------------------
nop
Перейти в начало страницы
 
iOrange
сообщение 11.03.2019, 07:33
Сообщение #25
BFG9000 owner

Половина землекопа
**************

Репутация:   247  
Группа: Припаркованный аккаунт
Сообщений: 1813
Награды: 3
Регистрация: 30.03.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Могу посоветовать обратить внимание на этот хукер - https://github.com/elishacloud/Hooking
Используется для многих патчеров / фиксеров.
В частности у нас в Silent Hill Widescreen Fix


--------------------
Hello worlds!
Перейти в начало страницы
 
autistic
сообщение 11.03.2019, 15:17
Сообщение #26


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(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

Сообщение отредактировал autistic - 11.03.2019, 15:21


--------------------
nop
Перейти в начало страницы
 
abramcumner
сообщение 11.03.2019, 15:25
Сообщение #27


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(autistic @ 11.03.2019, 15:17) *

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

Опенсорс. Прикольно...

Сообщение отредактировал abramcumner - 11.03.2019, 15:27
Перейти в начало страницы
 
autistic
сообщение 11.03.2019, 15:31
Сообщение #28


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

Ну там как повезет, если смещение между адресами меньше чем 2^32 - считай повезло smile.gif


--------------------
nop
Перейти в начало страницы
 
abramcumner
сообщение 11.03.2019, 15:53
Сообщение #29


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


На х86 всегда везет, там смещений больше 2^32 не бывает smile.gif
Перейти в начало страницы
 
autistic
сообщение 11.03.2019, 15:58
Сообщение #30


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


А, ну для х86 приложения - да, Я думал речь про джамп по 32 разрядному смещению в х64 приложениях. Оно иногда срабатывает, иногда нет, в зависимости от smile.gif


--------------------
nop
Перейти в начало страницы
 
autistic
сообщение 12.03.2019, 16:01
Сообщение #31


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Кажется понял что произошло. Т.к. хук устанавливается не просто на ф-ию, а на метод класса-наследника, похоже я сломал таблицу виртуальных ф-ий при присвоениии результата членам класса. Проверю позже.
Немного теории тут: https://github.com/gfreivasc/VMTHook


--------------------
nop
Перейти в начало страницы
 
jamakasi
сообщение 12.03.2019, 18:32
Сообщение #32


Доктор Игровых Наук
*******************

Репутация:   544  
Группа: Участник
Сообщений: 3657
Награды: 9
Регистрация: 12.07.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


А в форточках есть способ делать аналоги линуксовых pipe и filedescriptor в фс?
Перейти в начало страницы
 
autistic
сообщение 12.03.2019, 21:38
Сообщение #33


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


К сожалению никакой виртуальной таблицей там и не пахнет, дело в чем-то другом sad.gif

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

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

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

Microsoft POSIX subsystem была введена одновременно с началом развития семейства Windows NT


--------------------
nop
Перейти в начало страницы
 
jamakasi
сообщение 12.03.2019, 21:42
Сообщение #34


Доктор Игровых Наук
*******************

Репутация:   544  
Группа: Участник
Сообщений: 3657
Награды: 9
Регистрация: 12.07.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


autistic, тогда можно дескриптор\пайп сунуть на архив игры и написать маленькую прослойку проксирующую чтение файла. Будет гораздо проще разобрать как чтение файла происходит и соответственно понять структуры.
Перейти в начало страницы
 
autistic
сообщение 12.03.2019, 21:50
Сообщение #35


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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


--------------------
nop
Перейти в начало страницы
 
Modera
сообщение 12.03.2019, 22:28
Сообщение #36


.
**********************

Репутация:   750  
Группа: Участник
Сообщений: 7072
Награды: 4
Регистрация: 30.07.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


autistic, а можно эту твою штуковину MinGW собрать, или студия онли?
Перейти в начало страницы
 
autistic
сообщение 13.03.2019, 09:26
Сообщение #37


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

Там кстати полно разных сервис паков к ней, возможно хук не работает именно потому что разработчики используют не самый свежий СП, а я накатил самый последний. Надо пробовать с различными СП, я только в выходные смогу.

Сообщение отредактировал autistic - 13.03.2019, 09:31


--------------------
nop
Перейти в начало страницы
 
Modera
сообщение 13.03.2019, 15:29
Сообщение #38


.
**********************

Репутация:   750  
Группа: Участник
Сообщений: 7072
Награды: 4
Регистрация: 30.07.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


autistic, современный MinGW, который называется MinGW-w64 как-раз использует msvcrt.dll, это студия использует всякие там api-ms-win-блаблабла.dll.

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


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

Перейти в начало страницы
 
autistic
сообщение 13.03.2019, 16:03
Сообщение #39


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


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

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

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

Имхо, оно потому и не крешится, что оригинальную ф-ию позвал. А вот если открыть при помощи _open и вернуть дескриптор будет работать?
Изначальная ф-ия имеется в виду, ее легко найти по брейкпоинту на NtCreateFile


Сообщение отредактировал autistic - 13.03.2019, 16:12


--------------------
nop
Перейти в начало страницы
 
iOrange
сообщение 13.03.2019, 16:37
Сообщение #40
BFG9000 owner

Половина землекопа
**************

Репутация:   247  
Группа: Припаркованный аккаунт
Сообщений: 1813
Награды: 3
Регистрация: 30.03.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Modera @ 13.03.2019, 14:29) *
печатает имя скрипта в консоль

Интересно что на вашем скрине куча файлов в папке "content/scripts" лежит, в то время как я в архиве только 2 файлика вижу huh.gif
"content/scripts/material.bin" бы мне очень пригодился


--------------------
Hello worlds!
Перейти в начало страницы
 

3 страниц V  < 1 2 3 >
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28.03.2024, 21:37