Начало здесь: Как я Дота-лигу открывал (ч.1)
Конец 2007-го, снова зима, и снова время развиваться. Мы успешно перенесли лигу из умирающего Battle.Net в восходящий Good Game Client (позднее — Garena). Новые игроки приходят каждый день, лига растёт, всех радует отсутствие читеров, отличный пинг и лёгкий процесс начала игры. Игроки зазывали своих друзей в эту платформу из Battle.net, из локальных сетей и пиратских серверов — все шли в Garena. Холодный декабрь побуждал людей оставаться дома и играть. Постоянный онлайн игроков Warcraft на этой платформе в СНГ-секторе вырос с 1000 до 10 000 игроков. Очень скоро, Garena стояла в каждом компьютерном клубе, а онлайн-турниры проводились только на ней.
Всё отлично, и у нас был единственный и самый крутой бот на этой планете платформе…
Good Game Client
Платформа была чудесной и неизученной. Никто не знал, как именно она работает, и что интересного можно в ней накопать. Так как я был единственным человеком, принимающим решение, я начинал думать о будущем:
— где бы найти денег и спонсоров? как их найти, и где искать?
— куда дальше развивать лигу?
Простая и гениальная идея пришла довольно быстро — надо объединиться с самой лучшей и узнаваемой командой, и выпускать лигу от их имени! Им — пиар + спонсоры точно обрадуются, а нам — подарки от спонсоров, чтобы награждать победителей! Выбор сразу пал на лучшую на тот момент команду с дерзким названием SAY-PLZ, тем более она была из Москвы. Общий язык нашли, одобрение получили, лигу переименовали. Менеджер этой команды пообещал выбивать каждый сезон (3 месяца) по 1й видеокарте в приз самому лучшему игроку лиги. Это было лучше, чем ничего, и мы согласились. Тем более, они предоставили свой сайт как площадку, для ведения правил игры, разрешения споров и отбора игроков.
Лига получила новое дыхание, игроки почувствовали новый азарт — не только виртуальные очки, но и шанс выиграть лучшую на тот момент видеокарту от спонсора!
Конкуренция
Как полноценная лига, мы были в Garena одни. Тут не было конкурентов. Бот был только у нас. Это одновременно и хорошо (все лучшие игроки у нас), и плохо (без конкуренции сложно шевелиться что-то делать). Со временем, наши старые друзья из другой лиги попросили нас дать им такого-же бота, чтобы они переехали, наконец, из Battle.Net в Garena. С одной стороны это означало бы, что у нас станет меньше игроков. С другой стороны, это был бы интересный вызов — будет с кем соперничать! В итоге после недельки размышлений я дал им свою программу, под честное слово никому больше не давать, адаптировал их бота под Garena, и так у нас появился конкурент :). Забегая вперед скажу, что слово они своё сдержали, такой-же бот нигде не появлялся, они его никому не давали. Часть игроков начала перетекать между двумя лигами — если игрока забанили на пару часов на одной(например за плохое поведение), то он мог пойти играть на второй, и вернуться обратно. Мы ничего не стали с этим делать, и соблюдали нейтралитет по отношению друг к другу — они не лезли к нам, а мы не лезли к ним, каждый делает что хочет, и никто не говорит другому что надо делать. Так можно было брать только самое лучшее друг у друга.
Здравствуй, Garena !
Неожиданно для всех, платформу GGC переименовывают в Garena (от Global ARENA) и объявляют масштабный ребрендинг:
Следующие полгода народ плюётся и как только не называет новую платформу: Гангрена, Говнорена итд, но со временем все привыкли к такому неблагозвучному названию. Стиль интерфейса меняется с бело-желто-металлического на красно-депрессивный.
Пришло время поковырять наконец-то Garen’у, и посмотреть что можно из неё вытянуть. К сожалению, ассемблер я не знал от слова совсем, поэтому пытался как-то открыть служебные файлы, поискать какие-нибудь ресурсы платформы. Так мне попался на глаза некий файл RoomsEN.dat. На поверку оказался обычным файлом к базе данных SQLITE. Используя программу SQLite Expert, я открыл файл и обнаружил интересные таблицы: [Rooms], [Servers]
В таблице Rooms я смог найти свою комнату Say-Plz Dota League Room. У этой комнаты был свой числовой номер, а в соседней колонке server_id, принимавшее значение от 1 до 6.
Посмотрев таблицу Servers, я обнаружил эти самые 6 серверов:
Один из них был сервером моей комнаты и нескольких (сотен) других комнат. Т.е. все комнаты Garen’ы тогда располагались всего на 6 серверах.
Реверс-инжиниринг Garena
Копаем дальше — почему в качестве IP-адреса используется целое число? Где привычные глазу 86.60.90.164? Я провёл не один вечер, поняв, что это число (например 243037643) нужно представить в шестнадцатеричном виде (hex): 0E7C75CB , а затем зеркально развернуть его: CB.75.7C.0E и представить их в десятичном виде: 203.117.124.14. Вуаля, мы наконец-то поняли как можно конвертировать IP в целое и обратно(честное слово, я гуглил, но видимо подписка на гугл закончилась). Поэтому мы берём наш 127.0.0.1, представляем в HEX: 7F000001, разворачиваем его задом-на-перед: 0100007F , получаем 16777343, подставляем в Базу данных, запускаем клиент и вуаля! Наша программа-клиент наконец-то получила загадочный трафик, который клиент отправлял на сервер!
Теперь я начал получать непонятные данные в бинарном виде. Для удоства представлял их в HEX, но всё равно не мог ничего понять. Меня охватило желание разобраться в этом протоколе, что же шлёт клиент! Для начала я записал команду отправки слова «Test» в общий чат, перехватил отправляемые данные и сохранил их. Далее я попытался сымитировать отправку этого слова в чат, отправил и… не увидел результата — в общем чате моё сообщение не виднелось. Как выяснилось позднее, сообщение увидели все пользователи, кроме меня самого — клиент Garena не отображает отправленные собою же сообщения, а показывает их сам в момент отправки.
Уже было что-то. Значит, в отправляемой строке были зашифрованные данные! В общем и целом я провел 23 часа, без перерыва на сон, чтобы разобраться в этом протоколе, и наконец-то расколол этот орешек, используя AutoIt, калькулятор и бумагу с ручкой! Раньше я ничего подобного не делал, и никогда не изучал сетевые протоколы, поэтому всё было для меня в новинку.
2 байта — тип данных (вход в комнату, выход из комнаты, новое сообщение
остальные байты — полезная нагрузка, в зависимости от типа данных. Если это сообщение в чат, то тут был тип сообщения — публичное, личное, жирным. Далее шёл ID пользователя, и текст сообщения.
Один знакомый потом сказал, что протокол почти полностью повторяет протокол в Lineage II.
Был уже обед, а я не спал больше суток. Пора было лечь спать, и хорошенько выспаться, я чувствовал, что стоял на пороге нового прорыва!
Спал мало — так сильно было желание написать новую версию бота, которая работала бы уже без самого клиента Garena, а общалась бы с сервером напрямую. Еще 1 день, и у меня уже был рабочий прототип. Через 2 дня я перевёл бота на новую версию — клиент Garena уже не требовался, бот стал отвечать на сообщения практически мгновенно (раньше ответ занимал 2 секунды). Я не оставил попыток изучения протокола, и оказалось, что серверы Garena совсем не проверяют, от кого пришли данные. Вообще. Абсолютно. Можно было отправить пакет, что пользователь HeLRa написал в чат: «Hello». А можно было отправить в чат, что пользователь изменил иконку у своего ника (всего было доступно около 64 разных иконок на выбор). Это натолкнуло меня на мысль разукрасить чат, чтобы пометить игроков по их рангу, или уровню доступа. Администраторы были с самыми крутыми иконками, модераторы по проще, а все остальные — с иконкой минотавра.
Все пользователи были в шоке, какой «беспредел» творится в нашей комнате(канале), но это был наш канал, и в целом всех всё устраивало. Примерно через неделю, к нам зачастили какие-то люди с голубыми никами — оказалось, это глобальные администраторы Garena. Они заходили, тихонько ворчали, чего это мы тут беспредельничаем, но т.к. такой «взлом» был лишь в одной комнате(а не по всей гарене), то последствий не возникло, а через пару недель они этот баг пофиксили, вместе с уязвимостью отправки сообщения от имени другого пользователя.
Вступление в лигу
Уже март 2008, наша лига имеет самого крутого бота, у нас постоянно проходят игры на очень высоком уровне, а на форуме висит куча Vouch-request’ов(запросов на вступление в лигу).
Раньше, чтобы попасть к нам на лигу, игрок должен был разместить своё короткое резюме — в каких командах он играл, как долго играет, кто любимый герой, и приложить запись со своей самой лучшей игры, где он потел и старался. Через какое-то время, его заявку рассматривал какой-нибудь модератор и выносил решение — стоит он нашей лиги, или нет. Со временем, заявок стало так много, что модераторы уже не справлялись, а набирать больше — значит терять контроль над всем этим. Поэтому мы изменили схему, и теперь, чтобы попасть на лигу, нужно было собраться в определенный день в определенное время, и сразиться с другими желающими попасть на лигу(отборы, test game). За всем этим в прямом эфире наблюдал модератор, и отмечал самых полезных игроков, которым стоит дать приглашение.
Эта схема позволила модератору вместо просмотра часового реплея, за один раз рассматривать сразу 10 кандидатур, и приглашать по 1-3 человека(а иногда и никого). Отмечалось как персональный навык игры, так и игра в команде: иногда какой-то игрок начинал возникать: «как же так, я наубивал больше всех, у меня оказался самый сильный и раскачанный герой, а вы мне не дали приглашение!», на что ему отвечали, что он всю игру спокойно раскачивал героя в сторонке, в то время как вся оставшаяся команда кое-как отбивалась от нападений противника, и после 30 минут спокойной раскачки — этот герой естественно был самым сильным, и если бы не сильная команда, то они бы проиграли намного раньше.
Набор в лигу напоминал вступление в Бойцовский клуб — люди должны были доказать, что достойны 🙂
В доте все любят быть самыми убивателями, и гораздо меньше игроков, которые любят играть помощниками (support), которые лишь помогают своим более грозным героям убивать. Если вся команда будет убивать за убивателей, то непременно проиграет, т.к. помогать им будет некому. А т.к. наша лига была довольно сильной, то и игроки чаще всего любили играть за убивателей. По этой причине, на отборах модераторы очень позитивно относились к игрокам, которые за всю игру очень сильно помогали команде, и даже если счёт убийств/смертей у этого игрока отрицательный, то тоже могли выдавать приглашение, как полезному игроку. Опытный глаз модератора сразу видит хороших помощников.
Когда ты самый главный на лиге, и ты очень молодой, а сотни людей просятся на лигу, а другая просит тебя дать им админа, то волей-неволей у тебя появляется звёздная болезнь. Она поразила и меня. Стыдно об этом писать, но без этой стороны медали, вся история получится не полной: Я стал самым злым и беспощадным админом. Когда я садился поиграть в своей лиге, то со мной боялись играть. Если кто-то в команде тупил(нарочно, или нет), то я мог прямо во время игры выписать ему бан(на время), а то и выгнать с лиги! Просто, что он не оказался в нужное время в нужном месте. Со временем, дошло даже до того, что если я вступал в игру, то большинство вступивших сразу отменяли свою регистрацию, и никто не хотел зайти, потому-что боялись зайти. Я стал немного хитрее и стал использовать другие аккаунты, под которыми меня никто не знал, но всё равно выписывал баны. С одной стороны, я создавал самую крутую лигу, а с другой, сам же её и губил…
Лига отнимала всё моё время — я постоянно думал над улучшением бота, лиги, правил, и всего что мог улучшить. Лига была моей жизнью, моим детищем. Я пил, ел и спал за компьютером, читал чат, изучал поведение пользователей и их ошибки, и делал бота еще проще и понятнее.
Про деньги
Со временем, меня всё чаще посещала мысль: Как мне можно заработать на этом? Развращать лигу «разбаниванием за деньги», или «приглашение за деньги» я не хотел, поэтому искал новые возможности.
Спонсоры были довольно скудные, и давали только видеокарту раз в 3 месяца.
В платформе Garena можно было прокачать свой аккаунт, купив «Gold Account» — твой ник становился оранжевым(золотым), и ты мог заходить почти в любую комнату, даже если она заполнена. Вот только купить его можно было только через PayPal. В то время у многих небыло даже пластиковых карт, а из платежных систем самой популярной была WebMoney (Яндекс.деньги только-только появлялись, поэтому не в счёт). Купить Gold Account за WebMoney было нельзя, и так я стал посредником — покупал Gold Account’ы в Garena, и продавал их за WebMoney с наценкой. Я написал второго бота, который ходил по всем СНГ-комнатам в Garena и давал короткую рекламу о продаже Gold Account’ов. В месяц удавалось заработать до 2-х тысяч рублей. Разница между 0 и 2000 была огромной, и я почувствовал, что могу «легко зарабатывать в интернете». Время от времени мне писали люди, желающие купить Gold Account, но сомневающиеся — можно ли мне доверять. Самым весомым моим аргументом было то, что я главный администратор дота-лиги, и продаю аккаунты давно. Люди доверяли, покупали, приходили еще.
Новый поставщик
Уже во всю идёт лето 2008го года, мне пишет какой-то парниша, который может мне продавать Gold Account’ы в 2 раза дешевле. Я не стал задавать вопросы, и просто начал у него их закупать, увеличив свою прибыль. Как выяснилось позднее, он закупал краденные пластиковые карты на хакерских форумах, и закупал на них Gold Account’ы. И он такой был не один. Администрация Garena приняла мены, и запретила всем пользователям, кроме модераторов секций рассылать предметы. Теперь ни я, ни он, никто не мог отправлять предметы, и лавочка прикрылась (на какое-то время). У моего знакомого был аккаунт модератора секции, так-что он мог отправлять предметы, и я начал закупать GoldAcc как раньше.
Через какое-то время, мне снова пишет этот самый поставщик, который неплохо нажился на этих махинациях, и предложил мне сделку, от которой я не смог отказаться — он купит у меня доступы модератора за довольно внушительную для тех времён деньги
Мне очень сложно это объяснить, но у нас была «лига джентельменов», у нас не было принято что-то продавать, например продавать доступы на лигу, или повышения. У нас был принцип — "если достоин — будешь".
Но тут я пошел на нарушение этого негласного принципа, и часть модераторов и администраторов стали осуждать этот поступок, мол «продался». Со своей же стороны я считал себя имеющим полное право раздавать доступы тем людям, кому считал нужным, а учитывая свой вклад, который я внёс в лигу, создав её с нуля, я не считал нужным перед кем-то отчитываться. Это было началом конца…
Присмотри за сервером
В то время я помимо учёбы и лиги, успевал подрабатывать приходящим админом в небольшой гос.конторе. У них был безлимитный интернет и небольшой сервачок, на котором я по соседству и разместил своего бота. Успешно закрыв сессию, я уехал на каникулы в свои родные края, в которых с интернетом было всё очень плохо. Чтобы лига жила, я попросил самого технически-прошаренного админа B присматривать за ботами, и перезапускать их если что.
Лето прошло, я вернулся в Москву. За это время бот немного преобразился — этот админ B разобрался в моём коде, всё понял и даже его улучшил, сделав несколько давно ожидаемых вещей.
-«Ну что-ж, отлично!» — подумал я, и обрадовался, что у меня теперь есть помощник.
Начало конца
Наступил октябрь 2008 года. Противоречия в лиге достигли своего апогея, администраторы разбились на 2 лагеря: «Он имеет полное право распоряжаться своей лигой как хочет!», и: «Мы тоже вносили свой вклад в развитие лиги, и имеем такое же право на управление лигой!»
В этот критический момент, вдруг объявился менеджер профессиональной команды (которая распалась еще полгода назад). Он был и оставался владельцем сайта с форумом на котором всё крутилось. Ему пожаловался один недовольный админ B, и предъявил, в чём я его не устраиваю:
1. Что я протащил в модераторы своего человека, совершенно не годного на эту роль, и эту роль не выполнявшего (этот человек действительно не принимал участия в жизни и развитии лиги, а доступы ему нужны были как обычному человеку — ксива )
2. Что есть один очень старый админ A который очень давно не заходил в сеть, и у него надо отобрать высшие доступы админа (он просто переехал в новый дом, где не было интернета).
3. Что я вообще стал неадекватным и баню всех подряд.
Менеджер пишет эти претензии мне в ICQ, спрашивает — «что за дела? что ты творишь на моей лиге?». Очень странно было это читать от человека, который впервые в жизни объявился на лиге, и сказал, что это его лига.
Он требовал:
1. снять полномочия с модератора — «ок, сделаем»
2. быть поадекватнее — «конечно, не вопрос, но я баню только самых плохих игроков! честное слово!»
3. Убрать из админов А. — а вот этого я сделать не мог. Этот админ был одним из двух людей, которые были со мной с самого начала у истоков. Именно с ним я проговаривал и придумывал, как должна работать лига. Он сидел со мной в безлюдном чате в 3 часа ночи, ожидая, когда я допишу новый код, и тестируя его вместе со мной. Он был мне не просто другом, а товарищем. Я не мог снять с него доступы. Да и какая вообще разница, что у неактивного пользователя админские права? Я пошел на принцип, и отказался выполнять этот пункт.
Переворот
Дальнейшие события разворачивались очень быстро. Сначала меня забанили на нашем же канале в Garena. Затем забанили моего бота, а админ B имея доступы на сервер, всегда имел у себя последнюю версию бота. База данных была на сервере, которым также владел менеджер, поэтому пользователи ничего не почувствовали. На форуме меня забанили еще через 15 минут. Я остался без доступов к каналу, без доступа к сайту, без свежей базы данных пользователей. Единственная площадка, где я мог вести спор — относительно независимая продота. Там начались дичайшие разборки, грязь, кровь и помидоры.
Те администраторы, которые начали бунтовать против переворота, лишились админства очень быстро. Некоторые модераторы, поддержавшие переворот получили долгожданное повышение в админы. Власть перешла в другие руки.
Я считал, что правда на моей стороне. А раз правда за мной — то народ поймёт, что меня кинули, и не будет там играть. Я был слишком наивен. Я не знал, что можно используя хитрые слова и длинный язык перевернуть правду с ног на голову, выставить меня в грязи и выставить виноватым. Некогда молчаливые модераторы высказали мне всё, что обо мне думают, не рискуя лишиться доступов. Единственный пункт, с которым я был согласен — это то, что я неадекватно банил людей, но и это был не повод отбирать у меня моё детище, моё творение, годы моей жизни!
Спор на независимой площадке ни к чему не привёл. Администраторы Garena старались не вмешиваться активно в конфликт, но могли передать мне права на комнату, если я докажу, что я владелец бота. Им достаточно было, чтобы бот произнёс в чат: Бот написал Tims. К сожалению, админы Garena подключились слишком поздно, я уже потерял всякую власть, а все игроки были настроены против меня, и мне даже не хотелось возвращать себе лигу. Отныне у корабля новый капитан!
Я был раздавлен в лепёшку, я потерял всё, над чем работал, для чего работал. У меня не было больше лиги, у меня не было больше доступов, у меня не было игроков, которые пользовались бы моими программами. В добавок к этому на следующий день контора взяла себе нового постоянного админа(какое-то странное стечение обстоятельств), и мне по сути не надо было ходить на работу, а за пару дней до этих событий я расстался с девушкой.
Что там про судьбу?
Это был очень тяжелый период в моей жизни. Но я ведь парень предприимчивый, верно?
Смотря из будущего в прошлое могу сказать, что эти события развязали мне руки, освободили меня от тяжелой ноши следить постоянно за ботами, за лигой, за админами и за игроками, и позволили заняться наконец-то сайтостроением, до которого у меня так и не доходили руки. Только несколькими годами после я понял, что этот переворот позитивно отразился на моей жизни, чем если бы он не происходил. Как жаль, что в тот момент я этого не понимал — я сэкономил бы себе кучу нервов.
PS: Много лет спустя, я списался с админом B, мы друг друга простили, а я его даже поблагодарил за всё это.
Через месяц я собрался с силами, и сделал новый амбициозный проект, там же — в Garena.
Продолжение следует…
ссылка на оригинал статьи https://habrahabr.ru/post/316620/
Добавить комментарий