Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Модификация игры Метро Исход
GAMEINATOR forums > Общие разделы > Создание и модификация игр. Геймдев.
Страницы: 1, 2
Modera
autistic, на x64 ключевые слова __cdecl, __stdcall и т.д. ничего не значат, всегда используется одно и то же соглашение.
autistic
Modera, я имею в виду манглинг, в метро эта ф-ия вызывается как ф-ия Си.
autistic
В общем причина по которой игра с установленным хуком не хотела запускаться установлена.

Цитата
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 различаются, это приводит к вылетам. Игра, как выяснилось посредством ProcessExplorer'a, использует библиотеки поддержки языка из набора инструментов платформы v140.



В общем, чтобы не ходить вокруг да около - лаунчер нужно собирать VS2015 SP3, тогда все будет работать как часы.
Следующим шагом нужно определить где и как игра запрашивает ресурсы из архивов и можно ли установить хук таким образом, чтобы подсунуть эти ресурсы из дисковых файлов.
iOrange
Цитата(autistic @ 17.03.2019, 18:34) *
Игра, как выяснилось посредством ProcessExplorer'a, использует библиотеки поддержки языка из набора инструментов платформы v140.

Цитата(autistic @ 17.03.2019, 18:34) *
лаунчер нужно собирать VS2015 SP3

Зачем такие сложности?

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

Если с этим нужна какая помощь - обращайтесь.

autistic
Цитата(iOrange @ 17.03.2019, 22:48) *
Зачем такие сложности?

Никаких проблем, у меня платная подписка на MSDN, спасибо текущему работодателю.

Цитата(iOrange @ 17.03.2019, 22:48) *
При запуске просто хукайте их и без разницы чем вы собираете свою программу.

Их не нужно хукать, если собрать внедряемую библиотеку с правильно настроенным окружением, то после загрузки в адресное пространство MetroExodus.exe она будет использовать именно эти библиотеки из папки с игрой.
iOrange
Цитата(autistic @ 17.03.2019, 20:13) *
у меня платная подписка на MSDN

Это прекрасно, поздравляю, только я писал о том что незачем было так сложно и долго выяснять какой рантайм использует игра, ведь рантайм-библиотеки лежат рядом с exe wink_old.gif

Цитата(autistic @ 17.03.2019, 20:13) *
Их не нужно хукать, если собрать внедряемую библиотеку с правильно настроенным окружением

Это если собирать так, но можно и проще - просто хукнуть эти dll и тогда собирайте хоть сигвином.
autistic
Цитата(iOrange @ 17.03.2019, 23:28) *
незачем было так сложно и долго выяснять какой рантайм использует игра, ведь рантайм-библиотеки лежат рядом с exe

Я ожидал их там увидеть меньше всего, потому что обычно рантайм библиотеки доставляют отдельным пакетом вместе с установкой продукта, а поскольку игра ставится из Эпик Стора, а не инсталлятором, разработчикам пришлось пойти на такой грязный хак. К тому же это не заняло у меня много времени wink_old.gif
autistic
Кажется нащупал подходящую функцию, вот список ресурсов которые у нее запрашивает игра при загрузке главного меню: гуглдиск
autistic
Цитата(Modera @ 13.03.2019, 17:29) *
Вообще не совсем понял зачем так делать, можно же адрес функции получить гораздо проще

Игра обновилась только что, все брейкпоинты в x64dbg слетели, а лаунчер как работал, так и работает. Смещение поменялось, а тело функции нет wink_old.gif

Кстати вот эта функция, которую предстоит модифицировать
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 посчитал, что я злоумышленник ph34r.gif


autistic
К другим новостям: я таки посмотрел таблицу экспорта 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


Как видно, там есть ф-ии D3DCompile, D3DCompile2, D3DDisassemble
Есть в планах следующий эксперимент:

1) Переименовать оригинальные DLL
2) Собрать проксирующие DLL которые реализуют точно такой же интерфейс
3) В DllMain проксирующих DLL при помощи LoadLibrary загружать оригинальные DLL и получать указатели на оригинальные ф-ии
4) При вызове прокси собрать передаваемые аргументы, сдампить их в файлы, и вызвать оригинальные ф-ии

Но на такой эксперимент времени пока нет, а выходные слишком короткие. Так что если меня кто-то "опередит" в этом деле и проведет такой анализ, сильно огорчаться не буду, главное результатами не забыть поделиться с общественностью wink_old.gif


Дополнительно можно посмотреть что за аргументы приходят сюда. Это метод компонента ID3D11Device который находится в d3d11.dll. Проксировать эту библиотеку самостоятельно не нужно, на гитхабах можно полно уже готовых проксей найти, даже в этой теме ссылку постили выше.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.