habrahabr

Как я одержал победу над создателем чита для MMO-игры

  • вторник, 5 ноября 2024 г. в 00:00:09
https://habr.com/ru/companies/ruvds/articles/855258/

В конце 2000-х я работал в нишевой компании, разрабатывавшей MMO-игру. У нас была небольшая команда и скромная прибыль, зато верная аудитория. Игра опиралась именно на навыки, не предлагая привычных усилений, и игрокам такая система нравилась.

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

Имейте в виду, что всё, о чём я буду здесь говорить, уже давно неактуально. Наша игра поддерживала как Windows, так и Mac, но очевидной целью были именно системы Windows. Да и пользователи Mac составляли лишь 10% нашей аудитории.

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

В итоге я решил приобрести копию этого читерского ПО для своего домашнего ПК, так как мне не хотелось связывать с покупкой наши рабочие IP-адреса. У меня был ПК с Windows, поэтому я смог без проблем установить его и оценить, что же конкретно этот чит предлагает. На тот момент я мало работал с кодом игры под Windows, преимущественно разрабатывая версию для Mac и кроссплатформенное игровое ядро (это была игра на OpenGL).

Как выяснилось, чит давал вполне типичные преимущества: возможность видеть и стрелять сквозь стены, бесконечные патроны, дополнения карт и автоприцеливание. Став клиентом взломщиков, я также получил доступ к их форуму, поэтому мог видеть, что говорят другие покупатели о нашей компании (тогда нам ещё не хватало информации, чтобы их поймать). Не скажу, что участников обсуждения было много (возможно, с десяток), поэтому я надеялся, что и чит используют немногие. Его автор тоже писал на этом форуме, хотя в основном по делу и без лишних рассуждений. Как оказалось, за компанией стоят два человека. Один писал все читы, а другой занимался их реализацией. Стоимость чита составляла около $30/месяц, что превышало тариф на саму игру.

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

Честно говоря, это оказался, пожалуй, самый весёлый «проект» за всю мою карьеру, в процессе которого я два месяца сражался с грамотным противником!

Я несколько дней провёл за чтением про взлом игр под Windows и изучением всевозможных используемых для этого техник, игнорируя всё, что касалось более сложных игр от крупных компаний. Из прочтения форума я понял, что автор чита сам играет в нашу игру, хотя тогда ещё было непонятно, кто это конкретно. Стало ясно, что смысл в создании чита заключался не столько в заработке денег, сколько в его личном использовании для превосходства. Заработок здесь выступал просто приятным бонусом. Call of Duty или другие крупные проекты, которые эти ребята взломали, приносили куда больший доход.

После недолгого изучения чита я начал искать способы сделать его обновление в нашей игре более проблематичным. В основе игрового цикла лежал массив видимых на данный момент людей/транспортных средств (базово до 128 единиц). Эта фиксированная структура содержала основную часть динамики игры, поэтому ясно, что при написании чита она являлась лёгкой мишенью. Тем не менее, если в процессе вашего нахождения в игре сервер не получает регулярно heartbeat-пакеты, то через короткий промежуток времени вас отключает. Поэтому заниматься отладкой, находясь онлайн, было нереально. Мы также предлагали офлайн-режим для отработки навыков (в игре было множество транспортных средств и типов пехоты). Это был тот же игровой цикл в уникальной игровой «локации», не требующий подключения к сети. Получается, автор разрабатывал код своего чита офлайн.

Наша игра была написана на смеси C, C++, Lua и JavaScript почти за десять лет до того, как я пришёл в компанию. Код был страшен, раздражал, и работать с ним было тяжко. Тем не менее применение макросов C должно было упростить задачу. В итоге сперва с помощью макросов и функций доступа я проработал массив пехоты/транспорта, а затем для стандартных типов данных вроде локаций создал другие макросы, которые различным образом шифровали содержимое и сдвигали значения. В итоге у каждой сборки получались свои смещения. Я также создал теневые значения, которые дублировали (с различными сдвигами) важные данные, так как зачастую читы создаются путём отслеживания изменений памяти в процессе игры.

Эти меры не исключали чит полностью, но необходимое время для его обновления после каждого релиза стало значительно увеличиваться, плюс текущий чит становился менее эффективным до момента своего исправления. К тому же, за взломом стоял всего один человек, и трата лишнего времени на обновление чего-то, что приносит мало прибыли, явно его не радовала. Я также поменял пайплайн OpenGL в достаточной степени, чтобы сильно затруднить обновление чита, позволявшего видеть и стрелять сквозь стены.

У нас в игре был специальный вид «транспорта», который игровые менеджеры и сотрудники компании использовали для наблюдения за игрой пользователей. По умолчанию этот транспорт был невидимым, но маскировку можно было снимать, чтобы пугать своим появлением тех, кто нарушал правила. На форуме я прочёл, что пользователи чита видели наш транспорт всегда, поэтому в его присутствии старались вести себя нормально. В итоге мы с программистом сервера изменили код так, чтобы этот транспорт отсутствовал в общем списке транспортных средств, пока его не сделают видимым явно. После этого люди на форуме начали жаловаться, что перестали понимать, наблюдают ли за ними. Почему-то они продолжали думать, что мы (в данном случае я) дураки. Ха!

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

Тогда я решил, что для скачивания чита нужен открытый порт. В Windows есть API, который позволяет видеть, какие на машине открыты порты. С его помощью оказалось несложно выяснить, какие IP-адреса использовали взломщики. В итоге все, у кого были открыты порты для этих IP-адресов, наверняка использовали чит. Когда я это обнаруживал, то отправлял среди наших данных запуска безвредный бит (в нескольких местах), который игра считывала. Затем бинарник игры устанавливал другой безвредный бит в нескольких пакетах, отправляемых на сервер в процессе выполнения игры, чтобы код сервера видел и помечал этого пользователя как читера.

После выпуска релиза с обновлённым кодом мы смогли видеть, кто из наших клиентов использовал чит, включая его создателя (который наверняка был первым, поскольку ему нужно было протестировать новую версию). К счастью, всего таких пользователей оказалось с пару десятков. После этого мы с командой весело посовещались, решая, как поступить с полученной информацией. Среди идей звучало медленное снижение точности любого оружия в ходе игрового сеанса, изменение образа персонажа на клоуна Бозо или просто добавление в небе огромной стрелки, которая бы указывала на читера, но ему самому была не видна. В конечном итоге мы решили, что лучшим решением будет пару недель ничего не делать, а затем просто забанить читеров за общее нарушение условий оказания услуг.

После этого компания взломщиков сдалась и удалила свой чит. В конце концов, он реально того не стоил.

Сегодня уже эта история не актуальна. Но пару месяцев она нас развлекла, и я был доволен тем, что «победил» в этой небольшой схватке. Не понимаю, откуда у некоторых людей берётся тяга жульничать в играх. Мне кажется, что использование читов быстро делает игру скучной, и многие после этого просто переключаются на что-то другое. Весь смысл игр, особенно тех, которые основаны на развитии навыков, а не удаче — это противостояние. Если этот аспект убрать, то интерес к игре быстро пропадает. Кроме того, подобные читы портят игровой опыт для тех, кто получает удовольствие от честной игры, поскольку их навыков становится уже недостаточно.

Игры вроде World of Tanks (в которую я играю сегодня) регулируются сервером, поэтому все решения, основанные на поступающем от пользователя вводе, являются безопасными. Такое решение делает взлом игры для получения преимущества крайне сложным или даже невозможным. Но пути для читерства остаются. Например, в WoT популярна схема, когда люди платят компаниям за вход в игру в периоды низкой активности, предусмотрительно создавая множество «пассивных» танков, которые впоследствии уничтожают, получая огромное количество опыта и, собственно, повод для бахвальства.

Лично мне это кажется глупостью, и администраторы WoT должны иметь возможность выявлять таких игроков и аккаунты, используемые ими для создания «пассивных» танков. Но на деле этого не происходит. Хотя с учётом того, что серверы собирают аналитику по каждому игроку, каждому танку и каждой карте, это не должно составлять трудностей. Как и в случае большинства многопользовательских игр, здесь всё упирается в желание сделать качественный продукт и готовность выделять на это своё время и средства.

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

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

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻