вторник, 16 марта 2010 г.

Как работают читы для 3д шутеров

Уж очень часто приходится слышать от разных людей, что тот или иной игрок - читер. При этом приводятся определенные доводы, которые в большинстве своем абсолютно ничего не показывают, кроме того, что игрок либо играет хорошо, либо ему повезло, либо... он действительно читер? ;) Попробую популярно объяснить, как работают читы и почему те или иныи игровые ситуации не надо списывать на чит.

Сам я столкнулся с читами давно, играя по сетке в Counter Strike. Одновременно я работал в компании RevoltGames Multimedia ведущим программистом проекта Neuro. И даже однажды для эксперимента по-быстрому накидал простенький чит для CS, позволяющий видеть сквозь стены (Wallhack / Волхак).

Сразу оговорюсь - нижеописанное является верным для сетевых 3Д шутеров, построенных на системе Клиент-Сервер и клиенты которых работают под управлением Windows.

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

Так как (в идеале) игроки не имеют доступа к серверным файлам, то и программы-читы так же не могут повлиять на работу сервера. Остается оперирование данными, доступными клиенту. Вдаваться в подробности взлома и реверса кода клиента я не буду - это в данном случае никому не нужно. Просто скажу, что 99% читов имеют немного общего в принципах работы со значительно более полезной для честных игроков программой для захвата видео - PlayClaw.

Общее заключается в том, что они перехватывают методы отрисовки кадра и уже потом рендерят поверх кадра игры всю необходимую информацию (Overlays / Оверлеи). Собственно, из-за этого некоторые "продвинутые" системы защиты могут определять безобидные программы как потенциально опасные (например Hackshield Pro для шутера Combat Arms довольно туполоб в этом отношении).

Основные виды читов (их возможности)
100% клиентов сетевых 3д шутеров имеют доступ к положению игроков, которых видит наш игрок или потенциально может видеть. Потенциально видимый игрок может находиться за стеной или вообще невидим, но он находится рядом с нашим игроком. Чит отрисует всех видимых и потенциально видимых игроков (а так же возможно и предметы, и прочие полезные вещи) поверх кадра игры. Иногда для этого применяют выделение по цвету, чтобы даже полный дятел смог заметить врага. Такой вид читов называют Wallhack (видимость через стены). Это один из классических и распространенных видов читов.


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

Дополнительными ("мелкими") видами читов являются специфические для каждой игры возможности (радары, которые показывают все, индикаторы здоровья, оружия и проч.). Есть кое-что общее, например - No-Fog (отключение "тумана войны"), позволяющий игроку видеть максимально далеко. Тут никаких ухищрений программе-читу делать не надо, просто отключается небольшой кусочек рендера игры и все. Иногда для удобства читера отключают рендер фона, как результат - черное небо и контрастные игроки на этом фоне.


Как распознать читера?
В общем случае это сделать довольно сложно. А если читер умный и использует платные (или еще хуже - приватные) читы, то это практически нереально. Под словом "распознать" я понимаю определение игрока, который использует читы с вероятностью, близкой к 100%. Значительно хуже будет заклеймить честного игрока, чем не доказать виновность читера. Начнем по порядку.

Общие методы обнаружения читов - это античит программы, в частности Punkbuster, Valve Anti-Cheat, Hackshield Pro. Реализованы они по-разному, но смысл их действий один - сканируется память процесса игры на предмет обнаружения подозрительных модулей, проверяются на целостность критичные файлы игры, проверяются на целостность уже загруженные модули игры и т.д.

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

Valve Anti-Cheat не кикает игроков, а только банит в случае 100% обнаружения чита. Причем делает она это с задержкой от нескольких дней до нескольких недель. Говорят, это сделано специально для того, чтобы читер не смог понять, где он спалился.

С Hackshield Pro я знаком немного - в процессе "борьбы" за выживание PlayClaw в игре Combat Arms эта защита попила нехилое количество крови у меня. В результате PlayClaw то работает, то нет с этой игрой, но зато читеры там просто в масле катаются :) За пару-тройку часов игры в CA я их несколько штук успел увидеть.

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

Wallhack в руках грамотного читера распознать невозможно. Если же им пользуется дятел, то по записи в демке игры или по kill-cam (если игра это позволяет), можно заметить, как он ведет стволом за игроком, находящимся за стенкой или за углом и который должен сейчас выйти на читера. В самой игре это поймать довольно сложно - нужно учитывать специфику игры. Например, если вы уверены железно на 100%, что выруливаете из-за угла незамеченным и неслышимым и видите ствол, направленный в нос (или уже летящие снаряды, ракеты) и так повторяется несколько раз с одним и тем же игроком - это повод задуматься.

Aimbot распознается значительно проще, но одновременно вероятность ошибки тут велика. Если исходить из описания чита, то все очень просто - получаете постоянные хедшоты в любых положениях от одного и того же игрока - подозрительно. Этот игрок кладет по несколько противников за очередь - еще подозрительней. Но и профессионал может так же делать, не так ли? Тут оценка чисто субъективная. С очень высокой (практически 100%) вероятностью аимбот определяется, если посмотреть на демке за игроком или побегать за ним (в его же команде) - довольно часто неопытные читеры (или чит-программа не идеальна) палятся на том, что жмут на кнопку, аимбот срабатывает и наводит прицел, игрок стреляет и убивает и аимбот автоматически захватывает другую цель, которая может быть даже сзади игрока! Вот такие резкие "скАчки по головам" есть 100% аимбот.

Из дополнений, тот же NoFog можно определить, когда вам прилетает с другого конца карты :) Обычно такое используется совместно с аимботом.

Что читом не является
...естественно, при условии корректно написанного сервера и его прямой недоступности клиенту.

Читам не являются "бесконечное" здоровье, "бесконечные" боеприпасы, "вертлявость" или вообще Neo-Matrix-подобность, умение убивать всех сразу, умение проходить сквозь стены (тут бывают косяки игр, это не чит, это glitch) и прочая подобная бодяга. ВСЕ это обрабатывается на сервере и клиент не имеет возможности менять эти параметры или влиять на действия других игроков.

Просто запомните - клиент отсылает серверу информацию о нажатых кнопках и движениях мыши (контроллеров) и принимает координаты объектов и их свойства. И ЭТО ВСЕ.

Вот, постарался популярно объяснить, что это такое и с чем это есть. Можно было бы написать еще раза в 3 больше, но это уж слишком "многа букафф" :)

4 комментария:

  1. Очень познавательно - спасибо!)

    ОтветитьУдалить
  2. Полезная статья. Спасибо.

    ОтветитьУдалить
  3. Абзац про "читом не является" бред, тот же warface возьмём. Есть читы не проход сквозь стены, на "магнит противников" - враги отрисовываются в метре от тебя и ты можешь стрелять в них, при этом противник умирает совсем в другом месте. Так же высокие прыжки, бесконечные патроны и прочее. Все эти читы опробовал сам лично ради интереса, около полугода использовал в разных условиях и в разных версиях игры, аккаунт не забанили!

    ОтветитьУдалить