Перейти к содержанию
  • записей
    5
  • комментариев
    12
  • просмотров
    2 056

Старая, но все еще актуальная ммо


roma912

2 116 просмотров

Сегодня рассмотрим старую, но все еще актуальную ммо под названием Perfect World
Берем конечно же не актуальную версию официального клиента, а пиратский сервер с его старенькой версией 1.5.3 (Summer PW)
Официальная версия 1.6+

На данном пвп сервере изменены некоторые полеты для персонажа, введены некоторые, так называемые "рисованные" вещи которые довольно плохо влияют на баланс сервера
Да к тому же сервер заточен еще и под донат, т.к статы вещей могут быть рандомными (Классно...)

tNil8Fd.png

 

Как раз 4 стата и считаются рандомными, выпадают с некоторым шансом из общего пула.

Ну и начнем собственно, посмотрим что можно сделать в этой игре интересного
Начнем копать от локального игрока
Ищем его указатель. Это довольно просто, не возникает никаких трудностей
K5333wF.png

 

Указатель имеет всего одно смещение по типу *(LocalPlayer*) + 0x4 
И собственно так мы вышли на структуру персонажа
Далее нашли оффсеты до координат и прочего.

Самое интересное оказалось то, что можно изменить скорость персонажа прямо с клиента, а сервер будет воспринимать это как действительную скорость персонажа
Обычная скорость игроков на сервере порядка 5-6 м/с в зависимости от класса персонажа, довольно обычная расстановка в ммо играх
Raaky4F.png

 

Изменив скорость персонажа с клиента у сервера не возникло вопросов, а легально ли это и просто съело это.
Путем проб и ошибок я подобрал значение скорости [м/с] которое допустимо записью в адрес. Это 15 м/с
yKhzxt1.png

 

Скорость 15 м/с считается максимальной скоростью передвижения персонажа на сервере (Когда мы передвигаемся пешочком)
Но скорости в 15 м/с ведь мало , без каких либо бафов на ускорение и пр. :D
Поэтому пробуем увеличить до 20 м/с простой записью и персонажа начинает откидывать назад при перемещении
Тут у меня есть предположение исходя из пошаговой отладки, что  переходе через порог допустимого значения, сервер начинает сбрасывать скорость персонажа до 5-6 м/с опять же в зависимости от класса

Но на сервере есть всякие плюшки на ускорение персонажа, этим мы и воспользуемся
Установлено что максимальная скорость без бафов 5-6 м/с. С бафами 15-20 м/с

Опять же путем проб и ошибок было выяснено что можно преодолеть эти 15 м/с
А преодолеть их можно путем наложения бафа ускорения на персонажа, которое работает примерно по такому принципу
curSpeed = (15.0*2)
iuixhBD.png

 

Значит мы можем это легко использовать и нас не будет откидывать. Звучит неплохо
Делаем бинд на запись значения в адрес скорости. Пусть это будет 30 м/с, включаем баф на ускорение и радуемся скорости в 30 м/с без каких-либо откидываний назад
Правда такое будет работать только пока на нас весит баф на ускорение, т.е ровно 15 сек
А после окончания действия бафа нам придется довольствоваться скоростью в 15 м/с, но все равно это скорость останется постоянной и уже превышает скорость обычных игроков примерно в 2-3 раза :D
NaVC0z4.png

 

Вопрос остается в том, как же обойти или сделать так, чтобы значение подстраивалось в нужное когда на нас висит нужный баф
Делается довольно просто, путем чтения ID бафа на ускорение и его проверки на существование
Необходимо найти какой-то список бафов и после читать его каждые допустим 20 мс
А при нужном ID бафа просто менять значение скорости персонажа. Все довольно примитивно

Выйти на массив бафов нам поможет счетчик кол-ва бафов персонажа, который должен быть где-то в памяти игры
*Стандартные процедуры в СЕ. 1-2-3-4 бафа, сканируем, потом находим указатель на этот счетчик*
И в итоге оказывается что этот счетчик лежит прямо в структуре персонажа, хотя мб и логично
В некоторых играх может быть и иначе

SznBLog.png
Выше над счетчиком и лежит наш список бафов, смещение между бафами ровно в 0x12
1bChTn4.png

 

Узнаем наш ID ускорения и запоминаем

Остается теперь написать программу которая поможет нам делать все манипуляции с памятью
lWasND3.png

Запускаем, проверяем

 

  • Понравилось 1
  • Плюс 2

9 Комментариев


Рекомендуемые комментарии

Цитата

Ищем его указатель. Это довольно просто, не возникает никаких трудностей

Если ты пишешь статью, необходимо объяснить, как именно ты находишь этот указатель. Даже если при этом не возникает никаких трудностей.

 

Цитата

Далее нашли оффсеты до координат и прочего.

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

 

 

  • Плюс 1
Ссылка на комментарий

Жаль только что это всё актуально лишь для пиратских серверов, на официальных ты даже без всяких внедрений в код можешь на месте застрять, например в ветках дерева, и будет откидывать будто ты пытаешься через текстуры пройти. Я так один раз в дереве застряла и не вылезти было, пришлось делать телепорт в город. Но статья хорошая ?

Ссылка на комментарий
4 часа назад, Xipho сказал:

Если ты пишешь статью, необходимо объяснить, как именно ты находишь этот указатель. Даже если при этом не возникает никаких трудностей

Ну мне нравится вариант комбинированный 

Т.е руками нахожу оффсет допустим здоровья, смотрю в каком адресе оно лежит

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

Несколько перезапусков, а потом выбор из оставшихся нескольких указателей

Получается комбинированный метод 

Часть руками, часть автоматически 

 

А координаты можно найти уже в том указателе, как правило они недалеко

Изменено пользователем roma91212
Ссылка на комментарий
В 20.06.2019 в 12:54, roma91212 сказал:

Ну мне нравится вариант комбинированный 

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

Ссылка на комментарий
1 минуту назад, Xipho сказал:

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

Ну если расписывать полный процесс реверсинга, от А до Я, то статья получится огромной. 

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

Считаю что на форуме уже много статей отдельно на поиск, а тут так вообще никаких проблем с нахождением, все на поверхности

Ссылка на комментарий
Только что, roma91212 сказал:

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

Обычный поиск разжевывать не надо. Надо разжевать, почему используется именно такой тип поиска, и тому подобные вещи. Еще раз перечитай свою статью, представь, что ты полный нуб, и посмотри, где могут у нуба возникнуть вопросы при чтении твоей статьи. 

Вот, например, у тебя написано
 

Цитата

Ну и начнем собственно, посмотрим что можно сделать в этой игре интересного
Начнем копать от локального игрока
Ищем его указатель. Это довольно просто, не возникает никаких трудностей

У начинающего сразу возникнет вопрос - "А как ты вышел на локального игрока? Как ты нашел его указатель?". Тут необходимо объяснить, что, например, ты нашел какую-то его характеристику, от нее вышел на структуру игрока, и по базовому адресу искал указатель.

Ссылка на комментарий
14 минут назад, Xipho сказал:

У начинающего сразу возникнет вопрос - "А как ты вышел на локального игрока? Как ты нашел его указатель?".

Ну если нуб захочет, то на форуме перед ним будет куча статей как выйти на указатель игрока

Либо автоматическим поиском, либо ручным поиском, либо вырезанием указателя на игрока из какого-либо регистра в метку СЕ. Все эти способы уже разложены на форуме

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

В данном случае обход 2мя способами

1. Наложением бафа, и последующем чтением его из программы на плюсах

2. Обход с помощью полёта или ездового животного (Тут я также не стал расписывать, для того чтобы статья окончательно не разбухла) 

Ссылка на комментарий

Еще раз. Не нужно в статье все разжевывать полностью. Но ты должен дать отправную точку, чтобы читатель мог понять, от чего отталкиваться.

Ссылка на комментарий
36 минут назад, Xipho сказал:

Еще раз. Не нужно в статье все разжевывать полностью. Но ты должен дать отправную точку, чтобы читатель мог понять, от чего отталкиваться.

Так я и дал читателю отправную точку

Эта точка - поиск указателя на игрока. Тут уже сам читатель должен подумать как его найти. А то получается так, что все разжевано, и пользователь пришел, сделал все по пунктам и спокойно ушел в туман. Никакой креативности, никаких раздумий, это неправильно. 

Практически никто и никогда не станет давать полной информации, как это делается от А до Я. Смысл как раз в том, чтобы человек к этому пришел сам. 

Куча статей про указатели читателю в помощь 

Прочтя статьи 2-3 уже можно попробовать что-то и поискать

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.