Bmw-rumyancevo.ru

БМВ Мастер — Автожурнал
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Добавляем в игру мультиплеер с помощью и Frida

Добавляем в игру мультиплеер с помощью Node.JS и Frida. Часть 1

На Хабре уже есть пару упоминаний об инструменте Frida («Frida-node или немножко странного кода», «Точки соприкосновения JavaScript и Reverse Engineering»). В одной статье уже упоминается использование Frida на практике, однако почти везде инструмент используют как фреймворк для реверс-инжиниринга и исследования функционала программ (может даже взлом).

Я же хочу рассказать о процессе превращения одной любимой для меня однопользовательской игрушки в полноценную, многопользовательскую.

Сразу хочу предупредить: в подобном процессе я почти новичок, поэтому не удивлюсь, если в меня полетят гнилые помидоры от гуру системного программирования. С другой стороны я надеюсь, что моя статья позволит начать использовать Frida (и не только) другим новичкам, а из гневных комментариев гуру я почерпну что-то полезное для себя. Также продолжать написание статей (при положительных оценках конечно) я буду прямо в процессе разработки мультиплеера.

Дано:
Node.Js + Frida + frida-node
Игра Street Legal Racing: Redline
SLRR: java pack

Установка Frida

Что с игрой

Небольшая история игры.

Сама игра была выпущена в 2003 году компанией Activision. Игру разработала Венгерская компания Invictus Games. Случилось так, что игра, толи из-за плохого маркетинга, толи из за явного несоответствия интересам аудитории, не взлетела. Несмотря на это, у игры образовалось несколько сообществ фанатов, скорее всего из-за особенностей
геймплея: Автомобиль можно практически полностью разбирать и собирать, менять и настраивать детали, очень реалистичная (на тот момент) физика, деформация кузова, и поведение на дороге. Несколько раз сообщество пыталось заполучить исходные коды игры, подписывая петиции и отправляя их в Invictus. Разработчики отказывались их передавать, ссылаясь на проблемы с правами и компанией Activision, которой в данный момент принадлежат права. Несмотря на это, как-то случилось так, что в сеть утекло часть java кода игры. В саму игру встроена какая-то старая и урезанная версия JVM (Java Virtual Machine, даже без поддержки throw-catch), полностью отсутствуют функции для работы с сетью, а файлы сохраняются и открываются только во встроенном в игру формате.

На данный момент нашим земляком, с ником RAXAT был выпущен неофициальный патч 2.3.0LE, который стал
стандартом для этой игры. На базе этого патча я и решил добавить в игру поддержку мультиплеера.

Читать еще:  Что такое инжектор дизельного двигателя

Неудачные и удачные попытки

Сразу хочу заметить, что я не первый из сообщества, кто захотел реализовать мультиплеер в игре. Также я сам сделал несколько попыток добавить нужные функции в игру. Изначально я делал это с использованием dll, написанной на Delphi, которая инжектировалась в процесс. Такой метод работал, но добавлять что-либо в модуль было достаточно трудоемкой задачей.

На помощь пришел инструмент Frida, который позволяет внедрять в процесс JavaScript движок V8, и работать с процессом «изнутри». Самой важной задачей по началу являлось добавить обмен данными между JVM игры и внешним процессом Node.js.

Код проекта валяется на Github: https://github.com/lailune/SLRRMultiplayer однако представляет из себя исключительно тестовую версию, и то, что я имею на данный момент.

Ссылку на игру не привожу по понятным причинам.

Скрипт, загружаемый внутрь процесса будет называться injectScript.js. Название самого скрипта приложения не важно, я назвал его app.js.

Наш скрипт будет запускать бинарник игры, и передавать pid процесса модулю Frida для внедрения скрипта.

Сама функция AttachHook содержит весь код инициализации Frida:

  1. Подключаемся к процессу
  2. Загружаем наш внутренний скрипт во внедренный V8 (в это время V8 проверяет скрипт на ошибки и компилирует его в байт код)
  3. Ставим обработчик сообщений из скрипта
  4. Запускаем скрипт, и выводим сообщение об успехе или ошибке.

В случае прихода какой-либо «посылки» (payload) из нашего внедренного скрипта мы должны его обработать по своему. Для этого есть функция handleMessage, в которой, правда, пока реализован только прием информации о позиции игрока в виртуальном пространстве.

Теперь мы можем распоряжаться этими данными так, как нам захочется, например: передать их на сервер.

injectScript.js

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

  1. Так проще всего. Достаточно открыть файл с
    «нужным названием», внутри которого будут данные, которые мы передаем.
  2. Я так и не смог научить Frida искать нужный
    текст в памяти приложения, для дальнейшего использования определенной
    области памяти.
  3. Это работает.

Важный момент: в этом скрипте надо тщательно следить за созданием переменных и выделением памяти. Если будет создано слишком много переменных, то в один прекрасный момент запустится сборщик мусора, и процесс подвиснет на время намертво. Также если постоянно выделять память, получится утечка, с которой даже GC не справится.

Читать еще:  Двигатель бмв м44 тех характеристики

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

Немного Java

Поскольку игра использует внутри себя урезанную версию Java, придется немного написать на этом великолепном языке.

Интересный момент: прямо внутрь игры встроен компилятор java в байт код для JVM, достаточно положить java файл в соответствующую директорию внутрь папки src, и при запуске игры будет создан class файл.

Для теста я использовал класс City (реализует базовые функции для управления городом в игре). В дальнейшем планирую вынести реализацию своего псевдо-сокета в отдельный глобальный класс.

Пока реализует только передачу данных наружу.

Slrr как собрать двигатель новичку

Ребята всем Привет!

  • На сайт требуется Модератор и Администратор!

Ребята всем Привет!

  • Машины
  • Гаражи
  • Подвеска
  • Машины
  • Машины
  • Гаражи
  • Подвеска
  • Машины
  • Машины
  • Гаражи
  • Подвеска
  • Машины
  • SLRRPorsche 911 (993) `1995
  • SLRRNissan Silvia S15 Rocket Bunny
  • SLRRДиски HRE 792RS
  • SLRRStreet Legal Racing: Redline 2.3.1 Build 933
  • SLRRSEAT Leon Cupra R
  • Suicide Squad: Kill the Justice League
  • Майнкрафт 1.1.5 на русском
  • Взлом игры Асфальт 9 на Андроид
  • Топ 5 самых ожидаемых игр 2020 года для PlayStation 4
  • Minecraft PE 1.16.0.51 с Адским обновлением на Android | Nether Update
  • Street Legal Racing Redline
  • Grand Theft Auto IV
  • Test Drive Unlimited 2
  • Need for Speed Shift
  • Need for Speed Shift2
  • Street Legal Racing: 2.3.1
    • Новости
    • Машины
    • Моды
  • Street Legal Racing: Redline
    • Игра
    • Патчи
    • Машины
    • Треки
    • Гаражи
    • Двигателя
    • Подвеска
    • Суппорты
    • Диски
    • Шины
    • Рули
    • Сиденья
    • Глушители
    • ENB Series
    • Текстуры
    • Деколи
    • Paint Job
    • Скрипты
    • Разное
  • BeamNG: Drive
    • Игра
    • Моды
    • Машины
    • Карты
    • Объекты
    • Программы
  • Grand Theft Auto: V
    • Новости
    • Игра
    • Моды
    • Машины
    • Видео
  • Grand Theft Auto: IV
    • Транспорт
    • Объекты
    • Скины
    • Оружие
    • Телефоны
    • Скрипты
    • Разное
    • Разное
    • Читы
  • Grand Theft Auto: SA
    • Игра
    • Транспорт
    • Оружие
    • CLEO скрипты
    • Программы
    • Разное
    • Все моды
    • Форум
    • Видео
    • Музыка

Итак,
Закидываю двигатель в игру, игра вылетает с ошибкой типа:»Unregistable node: partsenginesLama_performance_V12.rpk:00000001 (invalid parent parts.rpk:0000 AF5C )». Как видно из ошибки, мы имеем дело с Lama V12.
Корень проблемы: при создании своей сборки, Jack переделал каталог и соответственно файл parts.rpk
Решение:
Нам нужно подогнать наш V12 под каталог и parts.rpk Jack’a.
Для этого:
Берем Lama_performance_V12.rpk и конвертируем его в Lama_performance_V12.rpb (как это сделать я описывать не буду, на форумах есть много туторов по данному действию), после чего открываем Lama_performance_V12.rpb блокнотом, Notepad++, кому что по душе.
Видим очень много кода, похожего на XML(если юзать Notepad++, то советую в меню «Синтаксис» выбрать «XML» — для глаз полегше будет).
Далее открываем окно поиска и вбиваем ПОСЛЕДНИЕ 4 ЗНАКА ОШИБКИ, в нашем случае это » AF5C «.
Поиск приводит нас к отрезку кода:

Читать еще:  Двигатель 2ст дизель технические характеристики

typeof 8
superid 0x0002 AF5C
typeid 0x00000001
alias V12_block_stock
isparentcompatible 1.00

script partsenginesLama_Performance_V12scriptsLP_V12_engine_block_stock.class
native part partsenginesLama_Performance_V12scriptsblock_stock.cfg
lod_amp 4.000

данный код отвечает за объявление блока цилиндров(его class и cfg файлы), а наше букво-цифросочетание отвечает за положение данного блока в каталоге.
Ошибка вылетает потому что в parts.rpk не прописана ветка каталога с таким ID, а поскольку изменить сам каталог, что бы создать отдельную ветку именно для нашего V12, мы не можем, то наш двигатель появится в разделе Engines->Others. Возможно правильней будет менять сам parts.rpk, но я буду подгонять двигатель под parts.rpk, а не наоборот.

Итак, всё что нам нужно сделать, что бы наш блок появился в Engines->Others->Blocks нужно » AF5C » заменить на » AB5C «.
После изменения код будет выглядеть так:

typeof 8
superid 0x0002 AB5C
typeid 0x00000001
alias V12_block_stock
isparentcompatible 1.00

script partsenginesLama_Performance_V12scriptsLP_V12_engine_block_stock.class
native part partsenginesLama_Performance_V12scriptsblock_stock.cfg
lod_amp 4.000

В принципе все, НО. мы изменили лишь один блок, а нужно изменить ID ВСЕХ деталей данного движка, которые мы хотим видеть в каталоге, т.е. нужно все детали двигателя раскидать по нужным секциям каталога.
Поэтому на примере изложенного пройдите по всем деталям и замените 4 последние букво-цифры на ID соответствующей секции каталога.

Когда наткнетесь на код объявляющий киты двигателей(Engine kits), НЕ меняйте его ID, оставьте как есть!

Ниже приведу список ID секций каталога:
Blocks: AB5C
Crankshafts: AB5E
Connecting rods: AB7E
Pistons: 0AB6
Intake systems: A282
Exhaust systems: A26F
Fuel: A26B
Cylinder heads: A25D
Camshafts: A25F
Performance systems: 0AB4
Clutch/flywheel: A23C
Transmission: A24B
Misc: 0ABE

После того как вы заменили все ID, конвертируйте файл обратно в Lama_performance_V12.rpk и закидывайте его в папку двигателей. Если все сделали правильно, то зайдя в игру найдёте V12 в каталоге.

Ну вот как-то так. Надеюсь ничего не упустил и изложил доходчиво не только для себя, но и для других!
Критика приветствуется!
Удачи на дорогах!

Ссылка на основную публикацию
Adblock
detector