Модификация игры Метро Исход |
Здравствуйте, гость ( Авторизация | Регистрация )
Модификация игры Метро Исход |
13.03.2019, 17:04
Сообщение
#41
|
|
. Репутация: 750 Группа: Участник Сообщений: 7072 Награды: 4 Регистрация: 30.07.2010 |
Изначальная ф-ия имеется в виду, ее легко найти по брейкпоинту на NtCreateFile Нашел эту функцию, у меня она немного подругому выглядит чем твоём коде. Там первым параметром передаётся не указатель на ReaderData, а указатель на указатель. Память под ReaderData выделятеся в самой функции, и полей там побольше чем 3. Интересно что на вашем скрине куча файлов в папке "content/scripts" лежит, в то время как я в архиве только 2 файлика вижу huh.gif "content/scripts/material.bin" бы мне очень пригодился Они в config.bin на самом деле. Формат config.bin такой же как у scripts.bin в Метро 2033, так что разбить его на отдельные файлы не так уж трудно. Вопрос что с ними дальше делать, т.к. это конфиги, такие же как скелет, и почти все без отладочных данных. |
 
|
|
|
|
13.03.2019, 17:16
Сообщение
#42
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
ашел эту функцию, у меня она немного подругому выглядит чем твоём коде. Можешь выложить MD5 хэш MetroExodus.exe? Например вот этой -------------------- nop
|
 
|
|
13.03.2019, 17:24
Сообщение
#43
|
|
. Репутация: 750 Группа: Участник Сообщений: 7072 Награды: 4 Регистрация: 30.07.2010 |
autistic, 810d30f4e11bb047024261719aab1186
|
 
|
|
13.03.2019, 17:29
Сообщение
#44
|
|
BFG9000 owner
Половина землекопа Репутация: 247 Группа: Припаркованный аккаунт Сообщений: 1813 Награды: 3 Регистрация: 30.03.2010 |
Они в config.bin на самом деле Спасибо, загляну. Вопрос что с ними дальше делать Потихоньку ковырять. Я вон скелет уже поковырял немного (много). Мне сейчас материалы нужны. Попробую вытянуть из config.bin и поковырять. -------------------- Hello worlds!
|
 
|
|
13.03.2019, 21:28
Сообщение
#45
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
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 байт) -------------------- nop
|
 
|
|
13.03.2019, 21:33
Сообщение
#46
|
|
BFG9000 owner
Половина землекопа Репутация: 247 Группа: Припаркованный аккаунт Сообщений: 1813 Награды: 3 Регистрация: 30.03.2010 |
У меня такой же. Epic Store v0.1.0.13
Код e86a1c884d453db946e2668289c590a7 *MetroExodus.exe Может у Modera стим версия? Сообщение отредактировал iOrange - 13.03.2019, 21:34 -------------------- Hello worlds!
|
 
|
|
13.03.2019, 21:37
Сообщение
#47
|
|
. Репутация: 750 Группа: Участник Сообщений: 7072 Награды: 4 Регистрация: 30.07.2010 |
autistic, То что FilePointer в подменяемой функции никак не инициализируется это так и должно быть?
Сообщение отредактировал autistic - 13.03.2019, 21:45 |
 
|
|
13.03.2019, 21:44
Сообщение
#48
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Modera, структура уже проинициализированная приходит { -1, 0, 0 } но интересно другое: в дизассемблере оригинальной ф-ии и в суррогатной функции ф-ия open вызывается из разных источников. Думаю все-таки коррапт из-за разных библиотек/настроек компилятора.
-------------------- nop
|
 
|
|
13.03.2019, 21:50
Сообщение
#49
|
|
. Репутация: 750 Группа: Участник Сообщений: 7072 Награды: 4 Регистрация: 30.07.2010 |
autistic, так посмотри из какой библиотеки игра использует эту функцию, получи её хендл с помощью GetModuleHandle а потом по нему адрес функции с помощью GetProcAddress, и будет работать с любой версией студии. Настройки компилятора не тоже доллжны повлиять.
|
 
|
|
13.03.2019, 21:56
Сообщение
#50
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
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 при вызове этой ф-ии -------------------- nop
|
 
|
|
13.03.2019, 22:03
Сообщение
#51
|
|
. Репутация: 750 Группа: Участник Сообщений: 7072 Награды: 4 Регистрация: 30.07.2010 |
autistic, на x64 ключевые слова __cdecl, __stdcall и т.д. ничего не значат, всегда используется одно и то же соглашение.
|
 
|
|
13.03.2019, 22:06
Сообщение
#52
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Modera, я имею в виду манглинг, в метро эта ф-ия вызывается как ф-ия Си.
-------------------- nop
|
 
|
|
17.03.2019, 19:34
Сообщение
#53
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
В общем причина по которой игра с установленным хуком не хотела запускаться
Цитата When you pass C Run-time (CRT) objects such as file handles, locales, and environment variables into or out of a DLL (function calls across the DLL boundary), unexpected behavior can occur if the DLL, as well as the files calling into the DLL, use different copies of the CRT libraries. Нельзя передавать файловые дескрипторы между модулями игры и внедренной DLL т.к. версии CRT различаются, это приводит к вылетам. Игра, как выяснилось посредством В общем, чтобы не ходить вокруг да около - лаунчер нужно собирать VS2015 SP3, тогда все будет работать как часы. Следующим шагом нужно определить где и как игра запрашивает ресурсы из архивов и можно ли установить хук таким образом, чтобы подсунуть эти ресурсы из дисковых файлов. Сообщение отредактировал autistic - 17.03.2019, 19:57 -------------------- nop
|
 
|
|
17.03.2019, 20:48
Сообщение
#54
|
|
BFG9000 owner
Половина землекопа Репутация: 247 Группа: Припаркованный аккаунт Сообщений: 1813 Награды: 3 Регистрация: 30.03.2010 |
Игра, как выяснилось посредством ProcessExplorer'a, использует библиотеки поддержки языка из набора инструментов платформы v140. лаунчер нужно собирать VS2015 SP3 Зачем такие сложности? Эти dll-ки лежат в папке с игрой, тут даже исследовать не нужно. При запуске просто хукайте их и без разницы чем вы собираете свою программу. Если с этим нужна какая помощь - обращайтесь. -------------------- Hello worlds!
|
 
|
|
17.03.2019, 21:13
Сообщение
#55
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Зачем такие сложности? Никаких проблем, у меня платная подписка на MSDN, спасибо текущему работодателю. При запуске просто хукайте их и без разницы чем вы собираете свою программу. Их не нужно хукать, если собрать внедряемую библиотеку с правильно настроенным окружением, то после загрузки в адресное пространство MetroExodus.exe она будет использовать именно эти библиотеки из папки с игрой. -------------------- nop
|
 
|
|
17.03.2019, 21:28
Сообщение
#56
|
|
BFG9000 owner
Половина землекопа Репутация: 247 Группа: Припаркованный аккаунт Сообщений: 1813 Награды: 3 Регистрация: 30.03.2010 |
у меня платная подписка на MSDN Это прекрасно, поздравляю, только я писал о том что незачем было так сложно и долго выяснять какой рантайм использует игра, ведь рантайм-библиотеки лежат рядом с exe Их не нужно хукать, если собрать внедряемую библиотеку с правильно настроенным окружением Это если собирать так, но можно и проще - просто хукнуть эти dll и тогда собирайте хоть сигвином. -------------------- Hello worlds!
|
 
|
|
17.03.2019, 21:36
Сообщение
#57
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
незачем было так сложно и долго выяснять какой рантайм использует игра, ведь рантайм-библиотеки лежат рядом с exe Я ожидал их там увидеть меньше всего, потому что обычно рантайм библиотеки доставляют отдельным пакетом вместе с установкой продукта, а поскольку игра ставится из Эпик Стора, а не инсталлятором, разработчикам пришлось пойти на такой Сообщение отредактировал autistic - 17.03.2019, 22:09 -------------------- nop
|
 
|
|
18.03.2019, 00:22
Сообщение
#58
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Кажется нащупал подходящую функцию, вот список ресурсов которые у нее запрашивает игра при загрузке главного меню:
Сообщение отредактировал autistic - 18.03.2019, 00:23 -------------------- nop
|
 
|
|
26.03.2019, 23:13
Сообщение
#59
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Вообще не совсем понял зачем так делать, можно же адрес функции получить гораздо проще Игра обновилась только что, все брейкпоинты в x64dbg слетели, а лаунчер как работал, так и работает. Смещение поменялось, а тело функции нет Кстати вот эта функция, которую предстоит модифицировать mov qword ptr ss:[rsp+18],rbx mov qword ptr ss:[rsp+20],rbp push rsi push rdi push r12 push r13 push r14 sub rsp,30 xor r13d,r13d mov r12d,r9d mov r14,r8 mov rsi,rdx mov rdi,rcx cmp dword ptr ds:[rdx+C],r13d je metroexodus.14F245504 mov r9,r8 mov qword ptr ss:[rsp+28],r13 mov r8,qword ptr ds:[rdx] mov ebp,1 xor edx,edx mov dword ptr ss:[rsp+20],ebp mov rcx,rsi call metroexodus.140A32830 mov rbx,rax test rax,rax je metroexodus.14F245504 movzx ecx,word ptr ds:[rax+6] mov qword ptr ss:[rsp+60],r15 mov qword ptr ss:[rsp+68],r13 lea rdx,qword ptr ds:[rcx+rcx*2] shl rdx,4 lea rcx,qword ptr ds:[1415D7990] add rsi,rdx call qword ptr ds:[<&RtlEnterCriticalSection>] mov rdx,qword ptr ss:[rsp+80] test rdx,rdx je metroexodus.14F245438 mov eax,dword ptr ds:[rbx+8] cmp eax,dword ptr ds:[rbx+C] cmove eax,r13d mov dword ptr ds:[rdx],eax lea rcx,qword ptr ds:[rsi+D0] call metroexodus.140A32770 mov edx,dword ptr ds:[rbx+10] xor r8d,r8d mov r15,rax mov ecx,dword ptr ds:[rax] call qword ptr ds:[<&_lseek>] cmp eax,FFFFFFFF je metroexodus.14F245460 mov dword ptr ds:[r15+4],eax jmp metroexodus.14F245468 mov rcx,r14 call metroexodus.140A34090 test r12d,r12d je metroexodus.14F245475 mov esi,dword ptr ds:[rbx+C] mov r8d,r13d jmp metroexodus.14F24547C mov esi,dword ptr ds:[rbx+8] mov r8d,dword ptr ds:[rbx+C] mov edx,esi mov rcx,r15 call metroexodus.140A2CC90 <<<<<===== mov r15,rax call metroexodus.140A26030 mov rcx,rax mov r14,rax inc dword ptr ds:[rax+140] call qword ptr ds:[<&RtlEnterCriticalSection>] mov rcx,qword ptr ds:[r14+30] mov edx,30 call metroexodus.140A28630 mov rbx,rax test rax,rax jne metroexodus.14F2454BB call metroexodus.140A25E40 mov rcx,r14 call qword ptr ds:[<&RtlLeaveCriticalSection>] mov qword ptr ds:[rbx+8],r13 lea rax,qword ptr ds:[1413432D0] mov dword ptr ds:[rbx+10],r13d lea rcx,qword ptr ds:[1415D7990] mov dword ptr ds:[rbx+14],r13d mov qword ptr ds:[rbx+18],r15 mov dword ptr ds:[rbx+20],r13d mov dword ptr ds:[rbx+24],esi mov dword ptr ds:[rbx+28],r13d mov qword ptr ds:[rbx],rax call qword ptr ds:[<&RtlLeaveCriticalSection>] mov qword ptr ds:[rdi],rbx lock add dword ptr ds:[rbx+14],ebp mov r15,qword ptr ss:[rsp+60] jg metroexodus.14F245507 mov qword ptr ds:[rdi],r13 mov rbx,qword ptr ss:[rsp+70] mov rax,rdi mov rbp,qword ptr ss:[rsp+78] add rsp,30 pop r14 pop r13 pop r12 pop rdi pop rsi ret Стрелочкой отмечена функция, которая возвращает буфер с содержимым запрашиваемого файла, вместо нее будет вызываться другая ф-ия, которая будет читать содержимое дискового файла. P.S. Тут кстати маленькая неприятная проблемка нарисовалась, Defender посчитал, что я злоумышленник -------------------- nop
|
 
|
|
27.03.2019, 00:28
Сообщение
#60
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
К другим новостям: я таки посмотрел таблицу экспорта d3dcompiler_46.dll / d3dcompiler_47.dll и вот что за ф-ии оттуда экспортируются:
+ 1 0 0009DE90 D3DAssemble 3 1 0009DB60 D3DCompile 4 2 0009DBE0 D3DCompile2 5 3 0009DCE0 D3DCompileFromFile 6 4 000A0700 D3DCompressShaders 7 5 0009C710 D3DCreateBlob 8 6 000A0AA0 D3DDecompressShaders 9 7 0009C560 D3DDisassemble 10 8 000B4CE0 D3DDisassemble10Effect 11 9 0009C640 D3DDisassemble11Trace 12 A 0009C5A0 D3DDisassembleRegion 13 B 0009F830 D3DGetBlobPart 14 C 0009FB50 D3DGetDebugInfo 15 D 0009FBB0 D3DGetInputAndOutputSignatureBlob 16 E 0009FB70 D3DGetInputSignatureBlob 17 F 0009FB90 D3DGetOutputSignatureBlob 18 10 0009C600 D3DGetTraceInstructionOffsets 19 11 0009F0C0 D3DPreprocess 20 12 0009C730 D3DReadFileToBlob 21 13 0009C680 D3DReflect 22 14 002F5F50 D3DReturnFailure1 23 15 0009F850 D3DSetBlobPart 24 16 0009FBD0 D3DStripShader 25 17 0009C940 D3DWriteBlobToFile 2 18 002AEBD0 DebugSetMute Как видно, там есть ф-ии Есть в планах следующий эксперимент: 1) Переименовать оригинальные DLL 2) Собрать проксирующие DLL которые реализуют точно такой же интерфейс 3) В DllMain проксирующих DLL при помощи LoadLibrary загружать оригинальные DLL и получать указатели на оригинальные ф-ии 4) При вызове прокси собрать передаваемые аргументы, сдампить их в файлы, и вызвать оригинальные ф-ии Но на такой эксперимент времени пока нет, а выходные слишком короткие. Так что если меня кто-то "опередит" в этом деле и проведет такой анализ, сильно огорчаться не буду, главное результатами не забыть поделиться с общественностью Дополнительно можно посмотреть что за аргументы приходят -------------------- nop
|
 
|
|
Текстовая версия | Сейчас: 27.04.2024, 19:35 |