на чем написана игра world of tanks
Движок игры
На каком языке в основном написан Клиент?
На каком языке в основном написан Сервер?
Какие программы вы используете на сервере игры?
Какие языки вы использовали при написании Сервера/Клиента?
Интересно что вы ответите
Do you know the way
Победителям Великой Отечественной:
Спасибо Вам за тишину, за наше небо голубое.
За то, что в страшную войну,
Сумели Мир Прикрыть Собою.
Xiaomi Mi Max 6.44″ . G o o g l e Android 6, Miui 8.
Три причины, по которым мне пришлось бросить игру World of Tanks и в чем суть патента В. Кислого
реклама
Игроком игры World of Tanks я явлюсь с 2012 года, вернее уже являлся, видел, так сказать воочию, как игра менялась на протяжении девяти лет. И на мой взгляд игра изменилась только к худшему, причем за последние года просто катастрофическими темпами. В какой-то момент играть в нее стало просто невозможно, чаша терпения переполнилась, и я решил бросить эту игру. Расскажу про причины, которые побудили меня это сделать.
1. Патент Виктора Кислого и Ивана Михневича.
Суть этого патента заключается в так называемой «поддержке интереса к игре». Как всегда, компании Wargaming мало прибыли, которую они имеют, и хочется еще большего. И эта технология призвана, не допустить ухода игроков из игры и повысить доходы компании. Она напрямую определяет алгоритмы игры, правила баланса, пробитий, промахов, рикошетов и т.д., и случайности здесь нет никакой. Помогая этим одним игрокам, и угнетая других, тем самым стирая разницу в игре между игроками, которые плохо играют, например, только начали играть, и опытными игроками. По мнению Wargaming здесь все логично, игрокам не нравится постоянно выигрывать в легких боях или постоянно проигрывать. Если опытные игроки попадают в бой с неопытными новичками, то новички разочаруются, а опытным игрокам станет скучно, и они оба могут бросить игру. Статистика игроков не должна сильно различаться, не должно быть побед у одних игроков 90 %, а у других 40%.
2. Жадность компании Wargaming
Повторюсь, что я являюсь игроком этой игры с девяти летним стажем. И помню те времена, когда игра была размеренной, новая прокачиваемая и премиальная техника выходила с периодичностью позволяющей игрокам понять эту технику, изучить ее, привыкнуть к ней. Хоть как то поддерживалась историчность игры, не было этой несуразной, не имеющей к историчности никакого отношения, колесной и некоторой другой техники. Не нерфили, и не апали технику в интересах Wargaming так беспардонно и бесцеремонно, как сейчас. Wargaming раньше жил с перспективой на будущее, думал о последствиях, к которым могут привести его действия и решения. А сейчас у меня сложилось такое впечатление, что Wargaming живет только сегодняшним днем, заботясь только о сегодняшних сверхдоходах, вовлекая World of Tanks в полный игровой хаос. Как будто завтрашнего дня уже не наступит, и весь куш нужно срубить именно сегодня. Но завтрашний день неминуемо наступает, и чтобы опять срубить по максимуму, игру ввергают в еще больший хаос, и так дальше происходит падение в пропасть хаоса и безумия.
реклама
Или еще другой вариант как вынудить игроков донатить. Выпустить новый премиальный танк, например тяжелый танк Crysler K GF (яркий пример нагиба за деньги), который практически не имеет в броне слабых мест, а в лоб так вообще бронебойными снарядами не пробивается. И только при использовании подкалиберных (голдовых) снарядов появляется шанс с ним справиться, тем самым совсем ненавязчиво подталкивая игроков покупать за реальные деньги голдовые снаряды, ведь не у всех имеется много игрового серебра для их покупки. И у самого Crysler K GF «запилено» суперпробитие на голдовых снарядах, хотя пушка такая же, как и у Т32, но пробитие при использовании голдовых снарядов значительно выше. Что и подталкивает лишний раз их владельцев на покупку голды за реальные деньги. Опытные игроки начавшие играть давно, видя, как сейчас, некогда культовая игра, просто катится в пропасть хаоса и безумия просто уходят из нее навсегда. А новички, на которых Wargaming делает ставку, всячески заманивая их в игру, немного покуражатся и все равно уйдут из нее, потому что без опытных игроков игра будет неинтересна.
3. Читы (запрещенные модификации) в игре
Читы – это официально запрещенные модификации, которые тем или иным способом дают значительное преимущество игроку в бою перед другими игроками.
реклама
Или еще пример, остаюсь я в конце боя наедине с одним или двумя противниками, и не знаю их место нахождения. Так находятся союзники, которые начинают мне подсказывать место положения врага, и действительно он оказывается там. Как они это узнают, да очень просто, используют чит «поваленные деревья и разрушенные объекты на миникарте», который на миникарте отображает условными знаками эти места.
реклама
Можно конечно и дальше очень долго продолжать приводить разные примеры использования игроками читов, с которыми я лично сталкивался в боях, но думаю для понимания масштабности катастрофы в игре World of Tanks этого достаточно.
Скачиваются и устанавливаются читы вообще, без каких либо проблем, и это вызывает у меня большое разочарование в этой игре.
По моему мнению, точка невозврата игрой World of Tanks уже пройдена, и вернуть ей ту прежнюю популярность и любовь игроков уже невозможно.
Надеюсь, статья для вас была интересна, и вы сделаете правильный выбор игры для себя.
Пишите в комментариях, часто ли вы сталкивались в игре со случаями читерства, и что думаете о дальнейшей судьбе игры World of Tanks.
Язык программирования WoT
Сервер написан на С++ (из вакансии)
Клиент на питоне(он ругался по питоньи при запуске в линуксе)
ну и на плюсах, следуя из цитаты.
возможно использовались и другие ЯП при написании клиента и сервера.
Сервер написан на С++ (из вакансии)
Клиент на питоне(он ругался по питоньи при запуске в линуксе)
ну и на плюсах, следуя из цитаты.
возможно использовались и другие ЯП при написании клиента и сервера.
А вот про сервер ничего сказать не могу. Не видел.
Клиент на питоне(он ругался по питоньи при запуске в линуксе)
Почему проекты Wargaming были неудачными, а некогда успешный World of Tanks стремительно угасает
реклама
Жизненный путь всех коммерческих проектов, в том числе и World of Tanks, состоит из трех стадий: становления, максимального состояния и угасания. В 2010 году компания Wargaming выпустила в свет игровой проект World of Tanks, популярность которого среди игроков постсоветского пространства быстро росла. И в 2012 – 2013 годах популярность достигла своего апогея. Объективно, игра World of Tanks была очень удачна, потому, что исторические страницы героических и победных свершений наших братских народов, некогда единой советской страны были тесно связаны с танками, и игра в те годы, можно сказать, приобрела душу. Это был период ее развития. Очень стремительный рост популярности World of Tanks сыграл с Wargaming злую шутку, как оказалось, не всегда это и хорошо. Войдя в эйфорию от успехов World of Tanks, руководство Wargaming в 2011 году заключило контракты с двумя известными компаниями на создание новых игровых проектов World of Warplanes и World of Warships. На эти проекты возлагались большие надежды, ожидалось, что их популярность будет не меньше, чем у World of Tanks. У руководства даже были планы, звучавшие вполне официально, по слиянию этих игровых проектов в один, где были бы грандиозные бои с участием всех видов техники из этих проектов. Под эти обещания World of Tanks еще быстрее набирала популярность, хорошо помогали и блогеры, которых поддерживала и поощряла Wargaming.
И вот, в 2013 году состоялся релиз World of Warplanes, и для Wargaming это был тревожный звоночек.
Wargaming перед релизом провела серьезную пиар компанию и, учитывая большую аудиторию World of Tanks, ожидала невероятную популярность нового проекта. И да, на старте был всплеск популярности, который достаточно быстро упал до катастрофически низкого уровня. Думаю, что этому поспособствовало процветание на то время самолетов в Warthunder, и то, что World of Warplanes просто не смогла заинтересовать аудиторию. Wargaming попыталась исправить ситуацию, дав игрокам нафармить прем в World of Warplanes, который компания позволяла использовать в World of Tanks. Но это лишь еще некоторое время удерживало, итак, уже небольшое количество игроков, в аккурат, до конца действия акции.
реклама
В сентябре 2015 года состоялся релиз игры World of Warships, которая также не имела никакой популярности. Онлайн был крайне низок, в общем, проект оказался полностью провальным.
Разработчики начудили в этом проекте с линкором «Миссури», чем достигли максимального недовольства игроков, изменили политику монетизации, чем еще большее количество игроков вынудили покинуть World of Warships.
реклама
Таким образом у Wargaming была только одна курочка – ряба, которая все еще стабильно несла золотые яйца – это World of Tanks.
В январе 2014 года игра набрала миллион онлайна, ради этого Wargaming провела беспрецедентную по масштабам рекламную компанию, в игре запустили щедрые акции, тогда, в общем-то, и стало понятно, что это было окончание пика популярности World of Tanks. Не совсем понятно, зачем собирался миллионный онлайн. Или это был маркетинговый план, или таким образом оценивали оставшийся потенциал игры, но с того момента популярность игры покатилась вниз, 2014 год явился переломным в плане развития игры. Если до 2014 года Wargaming работала над балансировкой танков, над развитием физики, графики, то после 2014 года она семимильными шагами начала вводить новые ветки танков, ЛБЗ, укрепрайоны и прочий контент, не способствующий развитию игры. Техника в новых ветках была ужасно имбалансна. Например, из-за введения ЛБЗ обесценился смысл победы в бою, ради которой, собственно говоря, и начинают игру. Теперь в игре каждый игрок начал преследовать свои цели, часто не имеющие ничего общего с действиями для достижения победы. Кто-то носится по карте сломя голову, выполняя задачу ЛТ-4, где нужно только сбивать гусеницы противникам, кто-то подставляется противнику выполняя задачу СОЮЗ-4, где в течении 5 боев нужно заблокировать не менее 8 снарядов, и что делает игрок в этом случае для победы, да ничего, только поставляется под противника, не пытаясь его уничтожить. Поэтому игроки, которые заходили в игру для победы, начали терять к ней всяческий интерес.
реклама
С одной стороны вроде бы и правильно, с ростом аудитории нужно было придумывать что-нибудь новое, в игре необходимо разнообразие. Но не так, как это сделала Wargaming, колоссально увеличив объем контента, совершенно забыв о его качестве. Wargaming всячески пыталась заставить свою единственную курочку – рябу нести больше золотых яиц.
Вот список проектов Wargaming, с помощью которых, ну или хотя бы некоторых из них планировалось зарабатывать деньги для компании.
Но, к сожалению, ни один из них успеха не сыскал. И Wargaming приняла решение, как можно дольше оттягивать финансовый крах компании, увеличивая всеми доступными методами доходы с World of Tanks, ввергая игру в черную бездну хаоса, из которой нет обратного пути. И разработчики знают обо всех проблемах игры, но делать ничего не будут, даже при желании, поскольку развитие игры приведет в ближайшей перспективе к снижению доходности. А задачи стоят другие, максимально выкачивать деньги из проекта, пока игра еще совсем не потеряла популярность. В течение последних пяти лет Wargaming потратила очень много денег на свои провальные проекты, но все еще ищет новую золотоносную жилу.
И я не уверен, что это у них получится. Им бы не потерять World of Tanks.
Надеюсь, статья была для вас интересна. Пишите в комментариях, что вы думаете о дальнейшей судьбе компании Wargaming.
Разбор протокола World Of Tanks
Часть первая: инструментарий мелкосерийного изобретения велосипедов
Почему и зачем: длинная и необязательная преамбула
Хорошо, что опыта игрового модостроительства у меня было немного — так, пару кастомных прицелов для Deer Hunter 2005 и «нелицензионный» недоклиент VATSIM/FSD с сопутствущим «взломом» протокола последнего. Ещё лучше, что ни разу не приходилось с головой погружаться в сколь-нибудь трудоёмкую и длительную отладку и дизассемблирование. То есть, с IDA и OllyDBG я поверхностно знаком, но не как с ежедневными рабочими инструментами.
Итак, я уверен, что в обозримом будущем никаких планов по введению полноценного режима спектатора в WOT нет и не будет. Под полноценным режимом спектатора я понимаю множественные подключения игроков в сеанс боя изначально как невзаимодействующих на игру «привидений»-наблюдателей, а не на технике. Это тот самый режим, из-за отсутствия которого комментаторы на чемпионатах WOT вынуждены заходить в бой 15-м танком, убиваемым своими на базе. Это тот самый режим, из-за которого появились моды «командирского zoom» и «кинематографической камеры» — по сути, просто костыли. А нужен такой режим затем, чтобы командир роты занимался командованием, а не скакал впереди на лихом танке по-чапаевски, чтобы он видел ситуацию на карте в целом непрерывно, а не отвлекался на неё в пылу нападения из засады. В идеале, командиру даже не нужны красоты трёхмерного мира — достаточно одной большой карты на весь монитор с игровой ситуацией в реальном времени — HP, повреждениями модулей, членов экипажа, направлениями стволов и прицелов союзной техники, засвеченных в каждый момент вражеских юнитов и прочей вспомогательной информации.
WOT предоставляет широкие возможности модостроительства, но такая идея выходит за рамки классического «заменить пару swf-файлов на свои». Потребуется перехват и разбор самого игрового протокола для того, чтобы иметь возможность передать на командирский планшет своё видение игровой ситуации.
Обход шифрования 0x0A-й дорогой
Первые робкие попытки пролезть в протокол танков я предпринял ещё в 2011 году. Начинать это, как и везде в подобных задачах, стоит с хорошего сниффера (кстати, в случае с VATSIM/FSD на этом можно и остановиться — внезапно оказалось, что протокол там текстовый), и я, вооружившись Microsoft Network Monitor’ом, ринулся в бой. За отчётные 3 года в схеме входа ничего кардинально не поменялось, кроме количества игровых кластеров. Сервис авторизации у каждого кластера живёт на одном IP, к нему уходит один пакет с логином-паролем, и от него приходит один пакет — как минимум, с идентификатором конкретного игрового сервера из этого же кластера, на который клиенту надо переключиться, и с чьим IP происходит весь дальнейший обмен. Выглядит это всё приблизительно так
Помеченные октеты, судя по тому, что изменяются они мало и более-менее предсказуемо — заголовок пакета. После них идёт равномерный битовый шум, то есть там уже включается шифрование. Тут можно было вспомнить, что записи боёв в WOT шифруются BlowFish’ем, и что ключ шифрования не изменялся с того момента, как стал известен широкой публике, и покопаться глубже — но смысла в этом особого не вижу. Для задуманного гораздо важнее то, что ходит между клиентом и сервером в процессе игры, чем то, как он авторизуется при входе.
Итак, если трафик проходит потоковое шифрование, логично предположить, что где-то в глубинах программы есть функция наподобие SendToServer(), в которой есть вызов вроде EncryptBuffer() и в которой, в конечном счёте, выполнение доходит до конкретного sendto(). Наша задача, для начала — найти, где это происходит. Загружаем танки в OllyDbg и перед нажатием на кнопку «Войти» ставим логирующий брейкпоинт на sendto().
Через несколько десятков срабатываний, уже в ангаре, вызовы sendto() становятся более монотонными, в том плане, что адрес буфера для отправки данных не меняется:
Чтобы узнать, где шифруется этот буфер, я сначала пошёл по неправильному пути — начал изучать графы вызовов в IDA и отслеживать вручную возвраты из функций. Где-то на 15-й такой функции мне это надоело, я полностью заблудился в коде и поставил брейк на запись по адресу буфера.
Брейк сработал внутри вот такой чудесной функции по адресу 0x00BAF76F, чудесность которой состоит в том, что в неё передаются 3 параметра — два адреса буфера и ещё один — их одинаковая длина. Тот самый EncryptBuffer(ptr_src,ptr_dest,len), который нам нужен. Что там лежит в незашифрованном виде, мы пока смотреть не будем, об этом позже.
Это что касается отправки данных. Как быть с приёмом? Немного сложнее, но, в целом, так же, поэтому не буду утомлять вас большими и страшными скриншотами отладчика. Схема такая — ставим брейк на recvfrom(), смотрим адрес буфера, куда складывается принятый зашифрованный пакет. Ставим брейкпоинт на чтение с адреса буфера и тут нам в очередной раз повезло — брейк срабатывает на вызове функции по адресу 0x00BAFB79, которая занимается расшифровкой блоков по 8 байт и находится, в свою очередь, в теле функции по адресу 0x00BAFB30. А уже эта функция почти такая же чудесная, как и та, что мы нашли выше: она принимает 4 параметра — два адреса буфера, их длину и какой-то флаг.
Назовём её DecryptBuffer(ptr_src,ptr_dest,len,flag). Адреса буферов, как видно, совпадают. Что полностью логично, так как при потоковом шифровании стоит ожидать одинаковой длины блоков исходного и шифротекста.
Осталась одна тонкость. Если функцию EncryptBuffer() достаточно перехватывать непосредственно перед её вызовом (т.е. ставим INT3-брейкпоинт вместо CALL) вытаскивая память по адресу ptr_src длиной len, то в момент вызова DecryptBuffer() оба указателя покажут на один и тот же блок, который ещё пока зашифрован. Поэтому перехватывать эту функцию надо перед самым возвратом, который у неё происходит командой RETN 10 по адресу 0x00BAFBA8. В этот момент на стэке лежат те же параметры, за исключением того, что ptr_src равен нулю (это нововведение версии 0.8.11, в предыдущей указатели как-то оставались равны) и адрес возврата. И ptr_dest, конечно, показывает на расшифрованный буфер. Теперь, когда мы знаем, где в клиенте WOT сообщения ещё не зашифрованы и где уже расшифрованы, нужно их оттуда автоматически вытаскивать для дальнейшего анализа.
Что же там внутри?
Здесь матёрые гуру реверс-инжиниринга, в духе «There’s an emacs command to do that» подумают: «ага, ну теперь можно написать на питоне\эзотерическом языке вот такой скрипт\плагин для ольки\иды, который будет делать с этими данными всё что хочешь и даже за пивом сбегает». Но мы пойдём другим путём. Я хочу сразу ориентироваться на то, что ещё до того, как дело дойдёт до разработки командирского планшета, то есть даже для самого полноценного разбора протокола WOT мне понадобятся помощники и тестировщики, далёкие от мира программирования. Им нужен будет простой инструмент с понятным интерфейсом, выдающий легко читаемые данные.
Так что предвидя скептические ухмылки, я засел за Lazarus и набросал в нём специализированный win32-отладчик, основной функцией которого является поставить два INT3-брекпоинта в нужных местах и по их срабатыванию вытаскивать данные по адресу и длине буфера, лежащим на стеке по известным смещениям. Ещё он умеет вести txt.gz лог с hexdump’ами пакетов и записывать все прошедшие пакеты так, что их потом можно заново «проиграть» через парсер. Вот что получилось. Так WOT клиент только начинает входить в ангар.
А вот так он себя ведёт уже находясь в ангаре.
Какие выводы можно сделать, даже не смотря на пояснения к пакетам, которые я поленился убрать для этих скриншотов? Сразу несколько.
Во-первых, видно, что все пакеты начинаются либо с 0x48, либо с 0x58, либо с 0x78; какой-нибудь закономерности на этот счёт я ещё не уловил, кроме того, что пакеты с уже известной функцией свой значащий байт не меняют.
Во-вторых, почти в каждом пакете есть один или несколько счётчиков сообщений; например, в keep-alive и ответах на них этим занимается третий и четвёртый байт в заголовке, кроме того сам пакет содержит ещё счётчик сообщений общий (включая keep-alive) и какой-то специфический (считающий пакеты без учёта количества keep-alive); всё это имеет отношение к контролю доставки пакетов, который пришлось прикрутить к UDP, вероятно, для оценки потерь и пересылки BLOBов (об этом позже).
Размеры всех пакетов выравнены по границам 8 байт, что ненавязчиво указывает нам на размер блока всё того же BlowFish; пока я до этого догадался, прошло немало времени в попытках обьяснить странную «контрольную сумму» в конце, да ещё и переменной длины. В конце концов, получив в этом паддинге вместо простого мусора слово «Flags» я, наконец, прозрел.
Ну и в лучших хакерских традициях, в конце каждого пакета находится сигнатура мёртвой говядины; кто бы мог подумать где мы её найдём 🙂
После получения Session ID от сервера приезжает пакет, содержащий номер игрока в неожиданно текстовом формате (792067). А вот пакет, который начинается на 0x78 0x00 на первом скриншоте — особо интересен. Сочетание сигнатуры 0x80 0x20 вкупе с тем, что перед каждым строковым литералом в нём стоит 0x55 и байт длины строки, а после каждого 0x71 находится возрастающий номер, должно насторожить опытных питонщиков — это же, чёрт побери, Python Pickle со своим запихиванием всего подряд в мемо! Вот он такой:
В следующей части, если она заинтересует уважаемых обитателей Хабра, я расскажу о том, как в протоколе WOT передаются файлы, размеры которых намного больше реалистичного размера UDP пакета и MTU. И о том, что эти файлы оказывается сжатыми zlib’ом а внутри у них всё тот же Python Pickle с разными неожиданными вещами.
Спасибо за внимание!
UPD. Свежие новости! По агентурным данным из самого сердца КВГ, мой лёгкий намёк на потенциал коммерческого использования командирского планшета поднял «небольшой бугурт» (дословно), в результате чего кровавые модераторы в полнейшей панике наконец заметили и слили в мусорник тему проекта на официальном форуме танков, а мне было доверительным шёпотом посоветовано замылить данные своего аккаунта на скриншотах.