Как разрабатываются моды для игр, которые не поддерживают моды (на примере Beat Saber) — часть 1: внедряемся в код игры

Простым языком о dll-файлах, Unity, Mono, паре хакерских методов и о крутости open-source-сообщества.

Источники изображений: <a href="https://www.oculus.com/experiences/quest/2448060205267927/" rel="nofollow noreferrer noopener" target="_blank">1</a>, <a href="https://youtu.be/OH4txDD23_c" rel="nofollow noreferrer noopener" target="_blank">2</a>
55 показов
15K15K открытий
33 репоста

Дико познавательно, спасибо большое!

Только один вопрос, как поддельная winhttp.dll подгружает правильную? 
там такой же `LoadLibrary` происходит ведь? Он не возвращает указатель на уже загруженную в память либу?

Ответить

Кстати, хороший вопрос, я даже не задумывался об этом)
Судя по коду, он сначала пытается загрузить библиотеку с суффиксом "_alt", т.е. в данном случае это winhttp_alt.dll. Не знаю точно, для чего это нужно.

В дискорде видел такой вопрос:
adde0109 (12.01.2020)
Does mod assistant fix the wine bug by renaming winhttp to winhttp_alt.dll???

Обсуждение было про mod assistant, а не про _alt библиотеки, поэтому я так и не узнал, был ли он прав. Но, похоже, направление правильное. Типа если запускаешь в линуксе под Wine, то там какие-то проблемы с системной winhttp.dll, и вместо нее подсовывают winhttp_alt.dll в той же папке. По крайней мере звучит правдоподобно.

Ну а если _alt библиотека не найдена, то дальше все примитивно: просто берется путь к системным библиотекам и winhttp загружается по абсолютному пути:

GetSystemDirectoryW(dll_path, system_dir_len);
... (конкатенировать системную директорию и имя библиотеки)
handle = LoadLibraryW(dll_path);

Пруфы тут: https://github.com/nike4613/UnityDoorstop-BSIPA/blob/master/Proxy/proxy.h

Ответить