25.08.2020, 00:03
(24.08.2020, 23:18)Albeoris Написал:(24.08.2020, 18:08)Demoth Написал: чтобы в процесс игры подгрузить addon.dll. Аддон.длл делает всю полезную работу патча код игры в оперативной памяти.
Тот же самый вопрос.
Какой подход использует Addon.dll для модификации / перехвата вызовов?
MS Detours/вручную расставляет джампы/патчит машинный код/что-то ещё?
Интересует последний пункт, вдруг изобрели что-нибудь супер-удобное. о.о
Да прям какого-то единого подхода нет. Detours/minhook хорошо подходят для перехвата простых (stdcall/cdecl) функций и заменой их своими, но для аддона они, к сожалению, не очень подходят - только какие-то отдельные редкие (редкие именно для аддона) случаи можно решить с их помощью. Если вдруг я ошибаюсь и не знаю каких-то возможностей детурса, с помощью которых можно было бы и остальные аддоновские кейсы решить, то (без иронии) с удовольствием бы про них узнал. Так-то detours шикарнейшая вещь.
Вообще, многие патчи в аддоне тупо патчат отдельные байты оригинального движка (nop-ят оригинальный код, заменяют какой-нибудь push одной константы на push другой константы или всякое в таком духе).
Для более сложных случаев в старом коде аддона сделано просто - замена оригинальной инструкции, которую нужно перехватить, на jmp на naked-функцию (declspec(naked)) с ассемблерной вставкой. Для нового кода я сделал в чём-то похожую на detours либу для
1) перехвата функций,
2) для перехвата конкретных вызовов функций,
3) для перехвата кода внутри функции.
Первый кейс точно можно решить с помощью detours, но не уверен, что он умеет перехватывать thiscall-функции (хотя не удивлюсь, если уже умеет). Второй кейс в общем-то настолько простой, что для этого никакая либа особо не нужна. А вот с третьим кейсом всё намного сложнее и я сильно сомневаюсь, что его можно как-то автоматизировать.
Вот пример третьего случая: https://gist.github.com/koteyur/416a6804...93b8214554
Тут под "как можно автоматизировать" я имею в виду проверку кода, который будет запатчен, правильный выбор позиции оригинального кода (после выполнения хука или перед) и адаптацию этого кода. Поэтому в моей либе предполагается, что тот кто будет писать код сам хорошо понимает, что он делает. Так что в моей либе ничего инновационного нет - простой cpp на 300 строчек кода.