Конференция DEFCON 19. Взламываем MMORPG ради веселья и прибыли. Часть 1
Джош Филлипс: как мы говорили, все хаки довольно просты, и их использование иногда не требует никаких навыков, достаточно просто творческого подхода к делу. Для использования «суперсилы» вам не обязательно нужно быть богом реверс-инжиниринга, но это определенно помогает таким вещам, как целочисленное переполнение или недостаточное наполнение, и вы с легкостью сможете изменять нужные значения от 0 до максимума, например, чтобы нанести смертельный ущерб противнику.
![](https://habrastorage.org/r/w780q1/webt/xf/pd/mz/xfpdmzbawewixkbh-2xuitzw-ve.jpeg)
Майк Доннелли: да, всё сводится к способности мастерить хаки, например, максимально усилить свои доспехи. Такое происходит в World of Warcraft — у нас был парень, который, сидя в столице орков Оргриммаре, 100 раз снял и одел свой шлем, накачав этим свою силу со 2 до 32 уровня.
Джош Филлипс: это действительно произошло, или может быть, он просто использовал редактор памяти и сделал скриншот?
Майк Доннелли: возможно, ты прав!
Джош Филлипс: мой любимый режим – GM Mode. Некоторые компании выпускают игры с открытой возможностью реверс-инжиниринга, так что вы, став «хозяином игры» GM, сможете телепортироваться к людям, уничтожать вещи, отдавать команды и делать прочие интересные штуки. Существует ещё такой интересный хак, так кража предметов у неигровых персонажей NPC. Игра Age of Conan была одной из первых, в которой имелась уязвимость, позволяющая убить GM, и я не думаю, что её разработчиков это осчастливило.
Майк Доннелли: уязвимость заключалась в возможности подмены ID ключевых игроков?
Джош Филлипс: ну да, типа того, что вы говорили серверу: «Я гейм-мастер и собираюсь сейчас умереть».
Майк Доннелли: иногда игровой сервер верит вам, когда вы заявляете, что являетесь другим игровым персонажем, говоря: «Я такой-то и я это продаю»!
Джош Филлипс: я уже говорил, что разработчики игр наивные люди. Взлом UI Hack менее ценен. Он пригодится, если вы хотите видеть игровое пространство очень далеко или носиться над картой игровой местности, как призрак, оставаясь при этом на месте.
![](https://habrastorage.org/r/w780q1/webt/j2/ri/b9/j2rib95gfhrhaa7q0q7nbbn-rha.jpeg)
Майк Доннелли: ещё можно использовать такую вещь, как «дикий» перевод языка, из-за чего, например, игроки Alliance перестанут понимать игроков Ward. Здесь взлом происходит на стороне клиента так, что во время диалога текст противника, отосланный игроку, просто не будет отображаться. Это довольно легко сделать, однако я сомневаюсь, что кто-то буде платить за взлом такого рода.
Джош Филлипс: следующий раздел презентации называется: «Я на вашей базе, парни, чтобы убить вас»! Я попытаюсь объяснить вам, как написать хак для телепортации. Для этого существует легкий путь и сложный путь.
Легкий путь – это найти позицию игрока в памяти, переписать её и вызвать функцию игры, ответственную за изменение местоположения игрока для телепортации в выбранное место. Так, если вы знаете, где расположен код, отвечающий за местоположение игрока, и можете вызвать его напрямую с помощью какой-то функции, это может быть заклинание телепортации, которое на языке Lua обозначается «cast spell», то вы сможете придать ему нужное значение места телепортации игрока. При этом сервер не сможет распознать, являетесь ли вы обычным воином или магом, который может использовать заклинания. Этот способ работает во многих играх.
Сложный путь – это подделка пакетов движения. Здесь потребуются математические вычисления и знание того, как они обновляются, реверс-инжиниринг пакетов движения и тому подобное. Возможно, вам понадобятся настроить метку времени, чтобы телепортироваться или бегать быстрее.
![](https://habrastorage.org/r/w780q1/webt/vd/d_/ih/vdd_ihuvtlku0gasf0kwcxcbtrc.jpeg)
Следующий хак – это атаки логики игры путем замены в пакете оригинального ID желаемым ID, о чем мы упомянули в контексте Age of Conan. Это атаки торговых навыков игрока, критический урон или полное уничтожение Fall damagе как персонажей, так и игровых предметов, а также атаки NPC-торговцев с целью ограбления. В Age of Conan можно было нанести критический урон любому персонажу игры и даже убить GM, назначив ему миллион Fall damagе, после чего он просто умирал.
Майк Доннелли: да, это было забавно!
Джош Филлипс: в этой игре можно было также использовать вредоносный код, так, что кто-то вступал с вами в торговые отношения, даже не зная об этом. Вы могли заставить NPC продать вам что-либо, и этот приём до сих пор используют многие игроки, кроме меня, потому что я не люблю воровать у компьютерных персонажей. И я не думаю, что кто-то из вас должен так поступать.
Майк Доннелли: это вызывает цифровые слёзы…
Джош Филлипс: далее следует dupes, или клонирование предметов. Многие игры имеют уязвимости типа проблем разграничения по линии сервера. Например, Age of Conan, EverQuest, Final Fantasy XII и Ultima Online имеют зонирование, то есть если вы произносите заклинание на одной стороне и после этого пересекаете линию сервера, то находите там противника, который вас победил, и можете продолжить битву. Хак методом повторения заключается в том, что вы с огромной скоростью, например 1000 раз в секунду, перемещаете вещи туда — обратно из окна торговли в свой рюкзак. В результате этого сервер перестаёт отслеживать вещи, и они полностью заполняют ваш рюкзак. Все знают игру Diablo 1, где вы просто скидываете предмет на землю, подбегаете к нему, наводите на него курсор, пробуя поднять, и он тут же оказывается у вас в рюкзаке, одновременно оставаясь на земле, так что это довольно забавный способ взлома.
Взлом игровых ресурсов, или Asset hacking, как я упоминал, не стоящее дело, разве что кто-то другой не опубликовал для вас свою работу, которую вы можете одолжить. Те, кто играл в WoW, знают, что кто-то волшебным образом может появиться на вашей стороне – не знаю, как она правильно называется…
Майк Доннелли: battleground, поле боя.
Джош Филлипс: собственно, я никогда не играл в World of Warcraft, для меня это слишком скучно. Так вот, игроки используют телепортацию, чтобы мгновенно перенестись с поля боя на вражескую базу и поубивать там всех противников. Они также могут модифицировать игровую карту и создать туннель, чтобы пробежать под землёй в нужную область так, что никто этого не увидит. Возможно, вы увидите его крохотное имя – таг, перемещающееся по карте, но не увидите самого игрока. Но в любом случае, эти способы взлома не стоят затраченных усилий.
Раздел «Взлом игр 420» я начну с цитаты Макиавелли: «Ничто великое никогда не достигалось без опасности», так что вас могут даже засудить.
Майк Доннелли: да-да-да.
Джош Филлипс: думаю, что это действительно так. Вы можете использовать в игре бота, кто-то говорил о таком пару лет назад о таком, и мне захотелось его ударить, потому что это было довольно не интересно. Итак, для этого вы делаете что-то вроде чтения пикселей и автоматизируете этот процесс, здесь нет никакого реверс-инжиниринга. Например, одним быстрым нажатием клавиш вы перерисовываете «красные» критические очки собственного урона так, что они становятся не красными, и вы не умираете. Это хак очень ограниченного масштаба, и ваши действия останутся незамеченными, если действовать очень быстро.
Майк Доннелли: именно так, нужно действовать очень быстро. Кто-нибудь знает, почему обнаружение работает так плохо? Поймите меня правильно, я не хочу приукрашивать положение с обнаружением на стороне клиента, здесь все кажутся очень мудрыми…Очевидно, производителям игр не нравится всё, о чем мы сейчас говорим, поэтому они пытаются обнаружить ваше программное обеспечение в игре, и если находят, та банят вас. Если вы читерите ради забавы, то максимум, что вы можете потерять – это собственный игровой аккаунт, но если у вас имеется 100 тысяч клиентов, это большая проблема, потому что если забанят всех ваших клиентов, вы просто прогорите.
![](https://habrastorage.org/r/w780q1/webt/o2/tk/b3/o2tkb3e8xonnw36kwv5uifst1ii.jpeg)
Поэтому предотвращения обнаружения читерства очень важно. Позже мы поговорим об этом, но сейчас хочу заметить, что обнаружение вашего ПО на стороне клиента очень важно.
Джош Филлипс: кто-нибудь из вас задумывался, почему волна банов прокатывается примерно раз в 3 месяца? Дело в том, что когда вы баните по 50 тысяч аккаунтов каждую неделю, люди, которые перепривязывают эти 50 тысяч аккаунтов, никогда не сделают этого повторно по причине дороговизны. Но если вы баните их не чаще раза в 3 или 4 месяца, то они повторно купят аккаунты, так как это будет выгодно. Компании думают примерно так: мы обнаружили этих парней, которые используют, скажем, бот Glider, но не собираемся их банить, потому что если мы станем банить их слишком часто, они принесут нам не более 50 долларов прибыли.
Майк Доннелли: да, это правда.
Джош Филлипс: ещё один способ взлома – это инъекция кода, когда вы вставляете небольшой код ассемблера, чтобы сделать какую-то мелочь, например, удалённый вызов какой-то процедуры RPC. При этом поверхность вашей атаки может увеличиться, я имею в виду, что вы можете действительно использовать что-то вроде DLL инъекции в большой кусок кода, написанного на языке высокого уровня C или C++, который действительно легко обнаружить. Вы пишите загрузчик DLL, который исправляет весь ваш импорт и все такое.
Вы можете атаковать уровень сетевых пакетов и сделать такую хорошую вещь, как реверс-инжиниринг сетевого протокола. Это весьма трудоёмкая работа, потому что существует не слишком много игр, позволяющих анализ контента такого рода. Это до сих пор является нелегкой задачей, и если вы считаете себя профи, то можете написать свой собственный игровой клиент. Люди часто считают, что это им под силу и зря тратят много времени, но если вы действительно способны написать хороший клиент, как те парни, которые уничтожили меня пару месяцев назад, то сможете заработать на этом пару сотен тысяч в месяц.
Майк Доннелли: написание пользовательского клиента – это не то, что вы собираетесь продать, а «золотой фарминг» и операции с реальными деньгами. Если вы написали свой игровой клиент, то можете попросить своего партнера запустить десять миллионов экземпляров игры на сервере фарминга. Если ваш игровой клиент не требует выполнения большого количества операций 3D-рендеринга, то его прекрасного можно использовать для масштабирования золотого фарминга.
Джош Филлипс: если обычно на компьютере можно запустить 2-3 игровых клиента, а вы смогли запустить 200-300 клиентов, это будет довольно большое масштабирование.
Рассмотрим теперь вещь, которая называется «анти-античит». В её помощью можно бороться с ПО, которое вычисляет и банит читеров. Часто это очень трудная задача, однако иногда очень важно не быть обнаруженным, иначе можно всё потерять. На слайде я привожу ещё одну цитату Сунь-Цзы, который сказал: «Будьте чрезвычайно тонки вплоть до бесформенности. Будьте крайне таинственным вплоть до безмолвия».
Майк Доннелли: хочу заметить, что существует не так много технических аспектов обнаружения, но вы должны подойти к этому стратегически, этого нет в книге «MMO Hacking». Наверное, есть такая книга?
![](https://habrastorage.org/r/w780q1/webt/jm/1e/sn/jm1esnbcbi3zfukcmlkraeq2pj0.jpeg)
Джош Филлипс: да, её написал один из моих друзей.
Майк Доннелли: этого парня ликвидируют в первую очередь. Так вот, вроде этого нет в книге, но если говорить о стратегическом подходе к делу, то следует побеспокоиться о двух основных вещах, касающихся вашего программного обеспечения. У вас есть поверхность атаки, которая определяет, насколько трудно будет обнаружить ваше ПО, и анти-античит в этом случае может просто увеличить код обнаружения, если она невелика. Во-вторых, у вас должно быть то, что я просто называю «разведкой», то есть насколько хорошо вы осведомлены о том, что делает противник, вы должны понимать, как работают его программы обнаружения, потому что это очень важно. Обе эти вещи работают вместе, и если поверхность атаки слишком большая, будет трудно сказать, что в ответ предпринимает противник, потому что его усилия могут быть минимальны – достаточно написать одну строчку кода, который обнаружит вашего бота. Если вы сделаете что-то действительно крутое, типа моего бота, который отреагирует в течение 2-х миллисекунд, если монстр что-то сделает, то сможете избежать обнаружения.
Так что это решение, которое вы должны принять, когда выбираете функции и разрабатываете то, что просят у вас клиенты. Вы должны решить, хотите ли рисковать, увеличивая поверхность атаки добавлением таких функций.
Перед тем, как показать следующий слайд, я хочу рассказать о том, что случалось со мной и другими разработчиками программного обеспечения World of Warcraft. Один парень разработал ПО, назовём его Innerspace, которое работало путём инъекции dll в довольно большую игру. Этот парень прекрасно разбирался в реверс-инжиниринге, поэтому он принял все меры против обнаружения программами Blizzard. Но он всё равно оставлял dll в памяти, которую хотел «запутать», и что более важно, он должен был пропатчить одну из функций Blizzard. Поэтому он просто перешёл к началу этой функции и вставил туда «дальний прыжок» в нужное место кода, будучи уверен, что достаточно замаскировался и его никто не найдёт.
На следующем слайде показана функция со вставленным кодом, обратите внимание на значения, выделенные красным цветом, мы увеличим этот фрагмент, чтобы всем было видно.
![](https://habrastorage.org/r/w780q1/webt/6s/-s/lh/6s-slhfk__bjqc6yytj15jv3elk.jpeg)
Это кусок кода, вставленный внутрь игры, но это не World of Warcraft…
Джош Филлипс: потому что Майка преследует Blizzard…
Майк Доннелли: я просто думаю, что приводить пример из WoW было бы не слишком хорошей идеей. В этом отрывке кода вы видите, что в игре используется запрос списка друзей askForBuddiesList, который имеет опционный параметр, который никогда ранее не использовался. Он воспринимается как номер пакета, или номер команды, или номер B.O.B. – «Brothers Over Bitches». Этот необязательный параметр «вклеивается» в это место кода и отправляется на сервер, всё очень просто.
Так вот, этот «вклеенный» код – давайте прокрутим на пару строчек вниз к комментариям — говорит: старый код был askForBuddiesList (0), он равен 0, и вместо него теперь используется новый код с параметром опции _asm, который никогда прежде не использовался.
![](https://habrastorage.org/r/w780q1/webt/ye/_-/9d/ye_-9dyxewceyylweawqcruumm4.jpeg)
Итак, Blizzard собралась найти в коде игры функцию, исправленную этим парнем. Для этого они поменяли этот вызов функции на маленький образец кода. Они задействовали регистры, выполнили некоторые математические вычисления, так, что IDA не увидит другой ссылки на эту функцию. Затем они переходят к исправленной функции, вытаскивают первый байт своего кода и отсылают его как параметр, который прежде никогда не использовался. Что же при этом происходит? Они отсылают один байт своего собственного кода каждый раз, когда делают этот запрос, и, конечно же, на стороне сервера они просто «прочёсывают» его, и если находят вместо ноля E9 – готово, дело сделано!
Что интересно в этом программном обеспечении – это то, что здесь вы не видите ничего, похожего на «если этот парень бот, скажи об этом серверу». Вы просто видите, что я беру этот байт и отправляю его, и это крошечный кусочек кода, который даже не меняет основной сетевой код, там нет никаких новых параметров, ничего нового. Единственный способ его найти – это каким-то образом наблюдать за тем, как собираются эти данные, и тогда можно сказать: «ага, эта штука всегда равнялась 0, а теперь она равна 9, это нехорошо»!
Итак, когда они это проделали, этот парень потерял всех своих клиентов, потому что они ждали несколько недель, пока их разбанят, а затем компания наносила удар снова и снова.
Это хороший пример того, как много значит поверхность атаки, потому что исправление всего одной функции игры привело к таким ответным мерам. Дело в том, что если вы думаете, что знаете, где находится код обнаружения, всегда имеется шанс, что это не так, как вам кажется. В случае Blizzard они никогда не размещали свой код обнаружения вне «смотрителя» Warden, они «держали все свои яйца в одной корзине», пряча детекторы в «смотрителе». Но потом они поумнели и сказали, что мы просто будем размещать наш крохотный код, где захотим – и всё.
Поэтому необычайно важно оставаться трудным для обнаружения. Если бы они придумали что-то вроде нового вызова ядра, или запустили монитор частных API, их активность можно было бы засечь, но когда они совершили всего лишь один крохотный шаг, вы сразу же попались. Поэтому очень важно наблюдать за тем, что они делают и как они создают новые инструменты для мониторинга того, как должны выглядеть потоки данных в системе.
Что касается Glyder, то у нас были инструменты, которые предупреждали нас, например, о том, что Warden обновился и теперь имеет 9 точек входа вместо 8, и после такого предупреждения я бежал к себе в офис и начинал лихорадочно фиксить Glyder, приводил его в порядок и снова запускал. Так что всегда есть выход, главное – не лениться. В этом деле действительно много работы, но она окупается.
Джош Филлипс: да, я думаю, что нам обоим приходилось работать без перерыва по 36 часов.
Майк Доннелли: когда Blizzard обновили «смотрителя», то добавили в него новый сканер. Этот сканер берет зашифрованную внутри «смотрителя» строку, получает ключ сервера, расшифровывает эту строку и вызывает функцию GetProcAddress, которая извлекает адрес экспортируемой функции из заданной динамически подключаемой библиотеки, в данном случае kernel32.dll. Если я утомил вас, не переживайте, дальше будет веселей.
Таким образом, они берут строку, какой бы она ни была, и если она регулируется этой функцией, то к ней применяется GetProcAddress без всяких параметров. Таким образом, если я ищу этот код и игра закрыта для патча, то я не смогу его найти, потому что у меня нет ключа и я не вижу, что он собирается расшифровать. То есть я вижу функцию, которая предназначена для вызова чего-то из kernel32.dll без всяких параметров, и не понимаю, в чём здесь смысл.
Итак, я смотрю на этот код несколько часов и ничего не могу понять, после чего решаю поговорить с одним умным парнем, Майком, который занимался Hellgate: London. Мы опять не можем ничего понять и решаем просто поднять эту тему, вставляем в код точки останова и запускаем игру, и они отправляют нам ключ! Майк говорит: «это же ключ! Давай посмотрим, что это за строка»!
![](https://habrastorage.org/r/w780q1/webt/yy/qq/ck/yyqqckccrt2jxj0enozzkagz5b8.jpeg)
Мы её расшифровываем, и выясняется, что это URL — адрес видео на YouTube! То есть они пропускают этот адрес через GetProcAddress, ProcAddress говорит, что ничего не происходит, я же, получив его, будто бы вставляю этот адрес в свой браузер, так что они просто троллят меня рекламным роликом! Не знаю, как много людей они поймали на эту удочку. Так что это было эпично, они действительно хорошо это проделали. Вот и всё, о чём я хотел рассказать, это действительно был самый эпичный ricroll, которой я когда-либо видел!
Джош Филлипс: у нас осталось мало времени, так что я постараюсь говорить побыстрей. Итак, преодолеть анти-читы с клиентской стороны можно с помощью запутывания следов, проверки памяти, обнаружения отладчика, обнаружения детектора dll и распаковки. Если вы достаточно умны, то можете заняться майнингом данных на стороне сервера. Для этого некоторые аналитики и Blizzard кинули нам действительно большую кость, типа «эй, чувак, вот как я обнаруживаю людей – я просто пишу несколько случайных запросов, а затем прихожу на следующее утро и отправляю этих людей в бан».
Также существуют вещи, которые можно использовать и на стороне клиента, и на стороне сервера, в основном это методы command & control с использованием сети ботнет, которые борются со «смотрителем» Warden и античитом Punkbaster. В данном случае вы посылаете свой игровой клиент десяти миллионам игроков WoW, это кусок кода, который исполняется на их компьютерах.
Майк Доннелли: это как ботнет и вредоносное программное обеспечение для обнаружения ботов.
Джош Филлипс: да, это довольно забавно. Punkbaster в основном ищет строки, чтобы забанить людей, я имею ввиду строки или двоичные данные в игровом клиенте пользователя. В большинстве случаев это строки типа window.name, которые обнаруживает Punkbaster. Смысл этих строк примерно такой: «эй, мне не нравится этот клан, он всегда надирает мне задницу, поэтому я собираюсь войти в их IRC канал и отправить несколько строк всем членам этого клана, а потом вернуться в игру и посмотреть, как всех их забанят за читерство».
Естественно, Punkbaster скажет: «нет-нет, это работает совсем не так!», но в действительности это работает именно таким образом.
Итак, мы дошли до защиты докторской диссертации на тему продвинутого взлома игр. Это очень глубокий колодец, в который могут утечь все ваши деньги, если вы не являетесь экспертом в этой области. Продвинутый взлом включает в себя работу с обновлениями игр и полную автоматизацию игрового процесса. У нас осталось меньше двух минут, так что мы пропустим немного слайдов.
Майк Доннелли: хочу упомянуть одну вещь, которую разработчики представили на прошлой неделе, это аукционный дом Diablo 3.
![](https://habrastorage.org/r/w780q1/webt/zn/tc/2m/zntc2m7-vt6tq1mqh0pucnasah4.jpeg)
Прошу обратить ваше внимание на новинку, которая там появилась – вы видите значок доллара перед цифрами? Теперь Blizzard разрешает вам продавать игровые вещи за реальные деньги. Так что теперь вы можете подключать платежные системы напрямую к своему игровому аккаунту Blizzard и продавать золото или покупать золото. Конечно, вы не сможете конкурировать со мной, потому что я «сделал» Blizzard, но это всё равно очень интересно.
Джош Филлипс: да, это действительно интересно. Я бы хотел поблагодарить всех наших друзей из Польши, Германии, Новой Зеландии и Австралии, которые не смогли присутствовать здесь по причине дороговизны авиаперелёта.
Майк Доннелли: думаю, их арестуют в любом случае…
Джош Филлипс: надеюсь, у нас осталось ещё немного времени, так что перейдём в комнату вопросов и ответов и продолжим наше общение.
Майк Доннелли: Благодарим за внимание, DefCon!
![](https://habrastorage.org/r/w780q1/webt/6k/tl/d2/6ktld2crqb0crq_bes2ju_0iuoe.jpeg)
Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).
VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps до весны бесплатно при оплате на срок от полугода, заказать можно тут.
Dell R730xd в 2 раза дешевле? Только у нас 2 х Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 ТВ от $249 в Нидерландах и США! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?
Джош Филлипс: как мы говорили, все хаки довольно просты, и их использование иногда не требует никаких навыков, достаточно просто творческого подхода к делу. Для использования «суперсилы» вам не обязательно нужно быть богом реверс-инжиниринга, но это определенно помогает таким вещам, как целочисленное переполнение или недостаточное наполнение, и вы с легкостью сможете изменять нужные значения от 0 до максимума, например, чтобы нанести смертельный ущерб противнику.
![](https://habrastorage.org/webt/xf/pd/mz/xfpdmzbawewixkbh-2xuitzw-ve.jpeg)
Майк Доннелли: да, всё сводится к способности мастерить хаки, например, максимально усилить свои доспехи. Такое происходит в World of Warcraft — у нас был парень, который, сидя в столице орков Оргриммаре, 100 раз снял и одел свой шлем, накачав этим свою силу со 2 до 32 уровня.
Джош Филлипс: это действительно произошло, или может быть, он просто использовал редактор памяти и сделал скриншот?
Майк Доннелли: возможно, ты прав!
Джош Филлипс: мой любимый режим – GM Mode. Некоторые компании выпускают игры с открытой возможностью реверс-инжиниринга, так что вы, став «хозяином игры» GM, сможете телепортироваться к людям, уничтожать вещи, отдавать команды и делать прочие интересные штуки. Существует ещё такой интересный хак, так кража предметов у неигровых персонажей NPC. Игра Age of Conan была одной из первых, в которой имелась уязвимость, позволяющая убить GM, и я не думаю, что её разработчиков это осчастливило.
Майк Доннелли: уязвимость заключалась в возможности подмены ID ключевых игроков?
Джош Филлипс: ну да, типа того, что вы говорили серверу: «Я гейм-мастер и собираюсь сейчас умереть».
Майк Доннелли: иногда игровой сервер верит вам, когда вы заявляете, что являетесь другим игровым персонажем, говоря: «Я такой-то и я это продаю»!
Джош Филлипс: я уже говорил, что разработчики игр наивные люди. Взлом UI Hack менее ценен. Он пригодится, если вы хотите видеть игровое пространство очень далеко или носиться над картой игровой местности, как призрак, оставаясь при этом на месте.
![](https://habrastorage.org/webt/j2/ri/b9/j2rib95gfhrhaa7q0q7nbbn-rha.jpeg)
Майк Доннелли: ещё можно использовать такую вещь, как «дикий» перевод языка, из-за чего, например, игроки Alliance перестанут понимать игроков Ward. Здесь взлом происходит на стороне клиента так, что во время диалога текст противника, отосланный игроку, просто не будет отображаться. Это довольно легко сделать, однако я сомневаюсь, что кто-то буде платить за взлом такого рода.
Джош Филлипс: следующий раздел презентации называется: «Я на вашей базе, парни, чтобы убить вас»! Я попытаюсь объяснить вам, как написать хак для телепортации. Для этого существует легкий путь и сложный путь.
Легкий путь – это найти позицию игрока в памяти, переписать её и вызвать функцию игры, ответственную за изменение местоположения игрока для телепортации в выбранное место. Так, если вы знаете, где расположен код, отвечающий за местоположение игрока, и можете вызвать его напрямую с помощью какой-то функции, это может быть заклинание телепортации, которое на языке Lua обозначается «cast spell», то вы сможете придать ему нужное значение места телепортации игрока. При этом сервер не сможет распознать, являетесь ли вы обычным воином или магом, который может использовать заклинания. Этот способ работает во многих играх.
Сложный путь – это подделка пакетов движения. Здесь потребуются математические вычисления и знание того, как они обновляются, реверс-инжиниринг пакетов движения и тому подобное. Возможно, вам понадобятся настроить метку времени, чтобы телепортироваться или бегать быстрее.
![](https://habrastorage.org/webt/vd/d_/ih/vdd_ihuvtlku0gasf0kwcxcbtrc.jpeg)
Следующий хак – это атаки логики игры путем замены в пакете оригинального ID желаемым ID, о чем мы упомянули в контексте Age of Conan. Это атаки торговых навыков игрока, критический урон или полное уничтожение Fall damagе как персонажей, так и игровых предметов, а также атаки NPC-торговцев с целью ограбления. В Age of Conan можно было нанести критический урон любому персонажу игры и даже убить GM, назначив ему миллион Fall damagе, после чего он просто умирал.
Майк Доннелли: да, это было забавно!
Джош Филлипс: в этой игре можно было также использовать вредоносный код, так, что кто-то вступал с вами в торговые отношения, даже не зная об этом. Вы могли заставить NPC продать вам что-либо, и этот приём до сих пор используют многие игроки, кроме меня, потому что я не люблю воровать у компьютерных персонажей. И я не думаю, что кто-то из вас должен так поступать.
Майк Доннелли: это вызывает цифровые слёзы…
Джош Филлипс: далее следует dupes, или клонирование предметов. Многие игры имеют уязвимости типа проблем разграничения по линии сервера. Например, Age of Conan, EverQuest, Final Fantasy XII и Ultima Online имеют зонирование, то есть если вы произносите заклинание на одной стороне и после этого пересекаете линию сервера, то находите там противника, который вас победил, и можете продолжить битву. Хак методом повторения заключается в том, что вы с огромной скоростью, например 1000 раз в секунду, перемещаете вещи туда — обратно из окна торговли в свой рюкзак. В результате этого сервер перестаёт отслеживать вещи, и они полностью заполняют ваш рюкзак. Все знают игру Diablo 1, где вы просто скидываете предмет на землю, подбегаете к нему, наводите на него курсор, пробуя поднять, и он тут же оказывается у вас в рюкзаке, одновременно оставаясь на земле, так что это довольно забавный способ взлома.
Взлом игровых ресурсов, или Asset hacking, как я упоминал, не стоящее дело, разве что кто-то другой не опубликовал для вас свою работу, которую вы можете одолжить. Те, кто играл в WoW, знают, что кто-то волшебным образом может появиться на вашей стороне – не знаю, как она правильно называется…
Майк Доннелли: battleground, поле боя.
Джош Филлипс: собственно, я никогда не играл в World of Warcraft, для меня это слишком скучно. Так вот, игроки используют телепортацию, чтобы мгновенно перенестись с поля боя на вражескую базу и поубивать там всех противников. Они также могут модифицировать игровую карту и создать туннель, чтобы пробежать под землёй в нужную область так, что никто этого не увидит. Возможно, вы увидите его крохотное имя – таг, перемещающееся по карте, но не увидите самого игрока. Но в любом случае, эти способы взлома не стоят затраченных усилий.
Раздел «Взлом игр 420» я начну с цитаты Макиавелли: «Ничто великое никогда не достигалось без опасности», так что вас могут даже засудить.
Майк Доннелли: да-да-да.
Джош Филлипс: думаю, что это действительно так. Вы можете использовать в игре бота, кто-то говорил о таком пару лет назад о таком, и мне захотелось его ударить, потому что это было довольно не интересно. Итак, для этого вы делаете что-то вроде чтения пикселей и автоматизируете этот процесс, здесь нет никакого реверс-инжиниринга. Например, одним быстрым нажатием клавиш вы перерисовываете «красные» критические очки собственного урона так, что они становятся не красными, и вы не умираете. Это хак очень ограниченного масштаба, и ваши действия останутся незамеченными, если действовать очень быстро.
Майк Доннелли: именно так, нужно действовать очень быстро. Кто-нибудь знает, почему обнаружение работает так плохо? Поймите меня правильно, я не хочу приукрашивать положение с обнаружением на стороне клиента, здесь все кажутся очень мудрыми…Очевидно, производителям игр не нравится всё, о чем мы сейчас говорим, поэтому они пытаются обнаружить ваше программное обеспечение в игре, и если находят, та банят вас. Если вы читерите ради забавы, то максимум, что вы можете потерять – это собственный игровой аккаунт, но если у вас имеется 100 тысяч клиентов, это большая проблема, потому что если забанят всех ваших клиентов, вы просто прогорите.
![](https://habrastorage.org/webt/o2/tk/b3/o2tkb3e8xonnw36kwv5uifst1ii.jpeg)
Поэтому предотвращения обнаружения читерства очень важно. Позже мы поговорим об этом, но сейчас хочу заметить, что обнаружение вашего ПО на стороне клиента очень важно.
Джош Филлипс: кто-нибудь из вас задумывался, почему волна банов прокатывается примерно раз в 3 месяца? Дело в том, что когда вы баните по 50 тысяч аккаунтов каждую неделю, люди, которые перепривязывают эти 50 тысяч аккаунтов, никогда не сделают этого повторно по причине дороговизны. Но если вы баните их не чаще раза в 3 или 4 месяца, то они повторно купят аккаунты, так как это будет выгодно. Компании думают примерно так: мы обнаружили этих парней, которые используют, скажем, бот Glider, но не собираемся их банить, потому что если мы станем банить их слишком часто, они принесут нам не более 50 долларов прибыли.
Майк Доннелли: да, это правда.
Джош Филлипс: ещё один способ взлома – это инъекция кода, когда вы вставляете небольшой код ассемблера, чтобы сделать какую-то мелочь, например, удалённый вызов какой-то процедуры RPC. При этом поверхность вашей атаки может увеличиться, я имею в виду, что вы можете действительно использовать что-то вроде DLL инъекции в большой кусок кода, написанного на языке высокого уровня C или C++, который действительно легко обнаружить. Вы пишите загрузчик DLL, который исправляет весь ваш импорт и все такое.
Вы можете атаковать уровень сетевых пакетов и сделать такую хорошую вещь, как реверс-инжиниринг сетевого протокола. Это весьма трудоёмкая работа, потому что существует не слишком много игр, позволяющих анализ контента такого рода. Это до сих пор является нелегкой задачей, и если вы считаете себя профи, то можете написать свой собственный игровой клиент. Люди часто считают, что это им под силу и зря тратят много времени, но если вы действительно способны написать хороший клиент, как те парни, которые уничтожили меня пару месяцев назад, то сможете заработать на этом пару сотен тысяч в месяц.
Майк Доннелли: написание пользовательского клиента – это не то, что вы собираетесь продать, а «золотой фарминг» и операции с реальными деньгами. Если вы написали свой игровой клиент, то можете попросить своего партнера запустить десять миллионов экземпляров игры на сервере фарминга. Если ваш игровой клиент не требует выполнения большого количества операций 3D-рендеринга, то его прекрасного можно использовать для масштабирования золотого фарминга.
Джош Филлипс: если обычно на компьютере можно запустить 2-3 игровых клиента, а вы смогли запустить 200-300 клиентов, это будет довольно большое масштабирование.
Рассмотрим теперь вещь, которая называется «анти-античит». В её помощью можно бороться с ПО, которое вычисляет и банит читеров. Часто это очень трудная задача, однако иногда очень важно не быть обнаруженным, иначе можно всё потерять. На слайде я привожу ещё одну цитату Сунь-Цзы, который сказал: «Будьте чрезвычайно тонки вплоть до бесформенности. Будьте крайне таинственным вплоть до безмолвия».
Майк Доннелли: хочу заметить, что существует не так много технических аспектов обнаружения, но вы должны подойти к этому стратегически, этого нет в книге «MMO Hacking». Наверное, есть такая книга?
![](https://habrastorage.org/webt/jm/1e/sn/jm1esnbcbi3zfukcmlkraeq2pj0.jpeg)
Джош Филлипс: да, её написал один из моих друзей.
Майк Доннелли: этого парня ликвидируют в первую очередь. Так вот, вроде этого нет в книге, но если говорить о стратегическом подходе к делу, то следует побеспокоиться о двух основных вещах, касающихся вашего программного обеспечения. У вас есть поверхность атаки, которая определяет, насколько трудно будет обнаружить ваше ПО, и анти-античит в этом случае может просто увеличить код обнаружения, если она невелика. Во-вторых, у вас должно быть то, что я просто называю «разведкой», то есть насколько хорошо вы осведомлены о том, что делает противник, вы должны понимать, как работают его программы обнаружения, потому что это очень важно. Обе эти вещи работают вместе, и если поверхность атаки слишком большая, будет трудно сказать, что в ответ предпринимает противник, потому что его усилия могут быть минимальны – достаточно написать одну строчку кода, который обнаружит вашего бота. Если вы сделаете что-то действительно крутое, типа моего бота, который отреагирует в течение 2-х миллисекунд, если монстр что-то сделает, то сможете избежать обнаружения.
Так что это решение, которое вы должны принять, когда выбираете функции и разрабатываете то, что просят у вас клиенты. Вы должны решить, хотите ли рисковать, увеличивая поверхность атаки добавлением таких функций.
Перед тем, как показать следующий слайд, я хочу рассказать о том, что случалось со мной и другими разработчиками программного обеспечения World of Warcraft. Один парень разработал ПО, назовём его Innerspace, которое работало путём инъекции dll в довольно большую игру. Этот парень прекрасно разбирался в реверс-инжиниринге, поэтому он принял все меры против обнаружения программами Blizzard. Но он всё равно оставлял dll в памяти, которую хотел «запутать», и что более важно, он должен был пропатчить одну из функций Blizzard. Поэтому он просто перешёл к началу этой функции и вставил туда «дальний прыжок» в нужное место кода, будучи уверен, что достаточно замаскировался и его никто не найдёт.
На следующем слайде показана функция со вставленным кодом, обратите внимание на значения, выделенные красным цветом, мы увеличим этот фрагмент, чтобы всем было видно.
![](https://habrastorage.org/webt/6s/-s/lh/6s-slhfk__bjqc6yytj15jv3elk.jpeg)
Это кусок кода, вставленный внутрь игры, но это не World of Warcraft…
Джош Филлипс: потому что Майка преследует Blizzard…
Майк Доннелли: я просто думаю, что приводить пример из WoW было бы не слишком хорошей идеей. В этом отрывке кода вы видите, что в игре используется запрос списка друзей askForBuddiesList, который имеет опционный параметр, который никогда ранее не использовался. Он воспринимается как номер пакета, или номер команды, или номер B.O.B. – «Brothers Over Bitches». Этот необязательный параметр «вклеивается» в это место кода и отправляется на сервер, всё очень просто.
Так вот, этот «вклеенный» код – давайте прокрутим на пару строчек вниз к комментариям — говорит: старый код был askForBuddiesList (0), он равен 0, и вместо него теперь используется новый код с параметром опции _asm, который никогда прежде не использовался.
![](https://habrastorage.org/webt/ye/_-/9d/ye_-9dyxewceyylweawqcruumm4.jpeg)
Итак, Blizzard собралась найти в коде игры функцию, исправленную этим парнем. Для этого они поменяли этот вызов функции на маленький образец кода. Они задействовали регистры, выполнили некоторые математические вычисления, так, что IDA не увидит другой ссылки на эту функцию. Затем они переходят к исправленной функции, вытаскивают первый байт своего кода и отсылают его как параметр, который прежде никогда не использовался. Что же при этом происходит? Они отсылают один байт своего собственного кода каждый раз, когда делают этот запрос, и, конечно же, на стороне сервера они просто «прочёсывают» его, и если находят вместо ноля E9 – готово, дело сделано!
Что интересно в этом программном обеспечении – это то, что здесь вы не видите ничего, похожего на «если этот парень бот, скажи об этом серверу». Вы просто видите, что я беру этот байт и отправляю его, и это крошечный кусочек кода, который даже не меняет основной сетевой код, там нет никаких новых параметров, ничего нового. Единственный способ его найти – это каким-то образом наблюдать за тем, как собираются эти данные, и тогда можно сказать: «ага, эта штука всегда равнялась 0, а теперь она равна 9, это нехорошо»!
Итак, когда они это проделали, этот парень потерял всех своих клиентов, потому что они ждали несколько недель, пока их разбанят, а затем компания наносила удар снова и снова.
Это хороший пример того, как много значит поверхность атаки, потому что исправление всего одной функции игры привело к таким ответным мерам. Дело в том, что если вы думаете, что знаете, где находится код обнаружения, всегда имеется шанс, что это не так, как вам кажется. В случае Blizzard они никогда не размещали свой код обнаружения вне «смотрителя» Warden, они «держали все свои яйца в одной корзине», пряча детекторы в «смотрителе». Но потом они поумнели и сказали, что мы просто будем размещать наш крохотный код, где захотим – и всё.
Поэтому необычайно важно оставаться трудным для обнаружения. Если бы они придумали что-то вроде нового вызова ядра, или запустили монитор частных API, их активность можно было бы засечь, но когда они совершили всего лишь один крохотный шаг, вы сразу же попались. Поэтому очень важно наблюдать за тем, что они делают и как они создают новые инструменты для мониторинга того, как должны выглядеть потоки данных в системе.
Что касается Glyder, то у нас были инструменты, которые предупреждали нас, например, о том, что Warden обновился и теперь имеет 9 точек входа вместо 8, и после такого предупреждения я бежал к себе в офис и начинал лихорадочно фиксить Glyder, приводил его в порядок и снова запускал. Так что всегда есть выход, главное – не лениться. В этом деле действительно много работы, но она окупается.
Джош Филлипс: да, я думаю, что нам обоим приходилось работать без перерыва по 36 часов.
Майк Доннелли: когда Blizzard обновили «смотрителя», то добавили в него новый сканер. Этот сканер берет зашифрованную внутри «смотрителя» строку, получает ключ сервера, расшифровывает эту строку и вызывает функцию GetProcAddress, которая извлекает адрес экспортируемой функции из заданной динамически подключаемой библиотеки, в данном случае kernel32.dll. Если я утомил вас, не переживайте, дальше будет веселей.
Таким образом, они берут строку, какой бы она ни была, и если она регулируется этой функцией, то к ней применяется GetProcAddress без всяких параметров. Таким образом, если я ищу этот код и игра закрыта для патча, то я не смогу его найти, потому что у меня нет ключа и я не вижу, что он собирается расшифровать. То есть я вижу функцию, которая предназначена для вызова чего-то из kernel32.dll без всяких параметров, и не понимаю, в чём здесь смысл.
Итак, я смотрю на этот код несколько часов и ничего не могу понять, после чего решаю поговорить с одним умным парнем, Майком, который занимался Hellgate: London. Мы опять не можем ничего понять и решаем просто поднять эту тему, вставляем в код точки останова и запускаем игру, и они отправляют нам ключ! Майк говорит: «это же ключ! Давай посмотрим, что это за строка»!
![](https://habrastorage.org/webt/yy/qq/ck/yyqqckccrt2jxj0enozzkagz5b8.jpeg)
Мы её расшифровываем, и выясняется, что это URL — адрес видео на YouTube! То есть они пропускают этот адрес через GetProcAddress, ProcAddress говорит, что ничего не происходит, я же, получив его, будто бы вставляю этот адрес в свой браузер, так что они просто троллят меня рекламным роликом! Не знаю, как много людей они поймали на эту удочку. Так что это было эпично, они действительно хорошо это проделали. Вот и всё, о чём я хотел рассказать, это действительно был самый эпичный ricroll, которой я когда-либо видел!
Джош Филлипс: у нас осталось мало времени, так что я постараюсь говорить побыстрей. Итак, преодолеть анти-читы с клиентской стороны можно с помощью запутывания следов, проверки памяти, обнаружения отладчика, обнаружения детектора dll и распаковки. Если вы достаточно умны, то можете заняться майнингом данных на стороне сервера. Для этого некоторые аналитики и Blizzard кинули нам действительно большую кость, типа «эй, чувак, вот как я обнаруживаю людей – я просто пишу несколько случайных запросов, а затем прихожу на следующее утро и отправляю этих людей в бан».
Также существуют вещи, которые можно использовать и на стороне клиента, и на стороне сервера, в основном это методы command & control с использованием сети ботнет, которые борются со «смотрителем» Warden и античитом Punkbaster. В данном случае вы посылаете свой игровой клиент десяти миллионам игроков WoW, это кусок кода, который исполняется на их компьютерах.
Майк Доннелли: это как ботнет и вредоносное программное обеспечение для обнаружения ботов.
Джош Филлипс: да, это довольно забавно. Punkbaster в основном ищет строки, чтобы забанить людей, я имею ввиду строки или двоичные данные в игровом клиенте пользователя. В большинстве случаев это строки типа window.name, которые обнаруживает Punkbaster. Смысл этих строк примерно такой: «эй, мне не нравится этот клан, он всегда надирает мне задницу, поэтому я собираюсь войти в их IRC канал и отправить несколько строк всем членам этого клана, а потом вернуться в игру и посмотреть, как всех их забанят за читерство».
Естественно, Punkbaster скажет: «нет-нет, это работает совсем не так!», но в действительности это работает именно таким образом.
Итак, мы дошли до защиты докторской диссертации на тему продвинутого взлома игр. Это очень глубокий колодец, в который могут утечь все ваши деньги, если вы не являетесь экспертом в этой области. Продвинутый взлом включает в себя работу с обновлениями игр и полную автоматизацию игрового процесса. У нас осталось меньше двух минут, так что мы пропустим немного слайдов.
Майк Доннелли: хочу упомянуть одну вещь, которую разработчики представили на прошлой неделе, это аукционный дом Diablo 3.
![](https://habrastorage.org/webt/zn/tc/2m/zntc2m7-vt6tq1mqh0pucnasah4.jpeg)
Прошу обратить ваше внимание на новинку, которая там появилась – вы видите значок доллара перед цифрами? Теперь Blizzard разрешает вам продавать игровые вещи за реальные деньги. Так что теперь вы можете подключать платежные системы напрямую к своему игровому аккаунту Blizzard и продавать золото или покупать золото. Конечно, вы не сможете конкурировать со мной, потому что я «сделал» Blizzard, но это всё равно очень интересно.
Джош Филлипс: да, это действительно интересно. Я бы хотел поблагодарить всех наших друзей из Польши, Германии, Новой Зеландии и Австралии, которые не смогли присутствовать здесь по причине дороговизны авиаперелёта.
Майк Доннелли: думаю, их арестуют в любом случае…
Джош Филлипс: надеюсь, у нас осталось ещё немного времени, так что перейдём в комнату вопросов и ответов и продолжим наше общение.
Майк Доннелли: Благодарим за внимание, DefCon!
![](https://habrastorage.org/webt/6k/tl/d2/6ktld2crqb0crq_bes2ju_0iuoe.jpeg)
Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).
VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps до весны бесплатно при оплате на срок от полугода, заказать можно тут.
Dell R730xd в 2 раза дешевле? Только у нас 2 х Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 ТВ от $249 в Нидерландах и США! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?