1. Персонаж падает с большой высоты и разбивается
Ищем адрес скорости прыжка прыгая под speedhack. Находим эту скорость. Ставим бряк на доступ. Прыгаем.
Инструкции на чтение добавляем в список адресов и там начинаем нопить
- Либо по одной
- Либо рискнем по половине от половины
- Либо рискнем и все сразу занопим
Если повезет, а должно повезти, то инструкция не прочитает то значение скорости, которое уложило бы персонажа на землю и можно будет прыгать на огромную высоту.
2. Как делать супер прыжок
Ищем под speedhack скорость float (назовем её velocityZ, Z - вертикальная ось) по вертикальной оси прыгая персонажем. Когда прыгаем. то скорость в один момент увеличивается. Затем, скорость постоянно уменьшается от положительного до отрицательного значения. Когда на земле, то скорость быстро записывается и равна нулю.
Дальше смотрим что это рабочий адрес. Прыгаем и замораживаем значение. Если адрес рабочий, то персонаж зависает в воздухе или движется.
Дальше ставим бряк на запись на этот адрес и снимаем speedhack
Прыгнули и увидели инструкции. Например одна из них будет
movss [rdi+0000010C],xmm0
и работает каждый раз при прыжке по одному разу за прыжок (прыгнули — сработала, прыгнули — сработала).
Вот в неё и легко сделать инъекцию с рядом стоящими адресами с умножением на scale величину. Все и персонаж будет с суперпрыжком. Чтобы он не разбивался при прыжке смотрим пункт1
Еще один вариант — не писать инъекцию кода, а искать адрес силы прыжка в структуре.
Это можно сделать меняя значения в структуре где-то рядом с [rdi+0000010C] и смотреть что происходит в игре. Можно найти, а можно и не найти, и возможно этот процесс будет долгий.
Еще можно в пошаговой отладке пройтись, посмотреть стек, протресить и попробовать найти адрес в структуре (при чем структура не обязательно будет с адресом в rdi) без рандомного поиска в структуре. Но у последнего есть свои плюсы, можно найти разные параметры движения игрока и увидеть изменения в игре.
3. Менять данные в структурах или менять код?
В примере выше пришлось создать два новых поля
scaleXY:
dd (float)4
scaleZ:
dd (float)4
И умножать их на скорости X,Y,Z персонажа.
С одной стороны больше кода писать и добавлять новые поля, а с другой стороны выделить время и найти подход к поиску значения стартовой скорости в структуре. Можно в структуре ничего не искать, а написать скрипт выше и это может быть быстрее чем искать в структуре. С другой стороны если в структуре рандомно ставить параметры в течении времени X на 4К байт, то можно найти: адрес скорости, адрес гравитации, адрес чувствительности и много чего еще.
И еще одно ограничение. Расструктуризация не всегда правильная. Упорно вместо float может видеть 4 байта. Это в лучшем случае, в худшем разные смешения смержены и выводятся разные типы данных.
В общем исследование игровой структуры эта тема интересная. Можно сказать это поиск свойств, по которым будет меняется поведения персонажа в игре. Структуру желательно обследовать какой оффест, что делает и какого он типа (через брейкпоинт). Это всего 4К байт проанализировать. Каждое смещение подписать и сохранить. Сделав это вы скажите себе я исследовал всю структуру и знаю, что делает смещение.
Lua может помочь автоматизировать анализ структур и пока я думаю об этом. Данные структур могут сильно повлиять на поведение персонажа, на прохождение потоком отладочных инструкций игры по разным условиям — выполнять и не выполнять ответвления кода с разными условиям. В общем есть над чем подумать.
Всегда было приоритетным менять код, но теперь стал задумываться о том чтобы больше смотреть в сторону правки данных структур. Фактически код мы не правим, а меняем данные и код работает уже с другими данными.