HTML5-игры и GodMode: все просто!

«Война… Война никогда не меняется». Думаю, многим знакома эта фраза. Каждый пользователь ПК хоть раз запускал компьютерную игру. Много компьютерного железа пострадало в баталиях от горячей руки геймера, потерявшего последнюю «жизнь». Иногда появляется мысль: а не поискать ли «читы» и не накрутить ли себе жизней или ресурсов. Так начинается путь читера.

В этой статье я на двух примерах покажу, как с помощью подручных средств можно нечестно играть в игры на HTML5.

Ядро любой HTML5-игры — JavaScript. Единственной, на данный момент, защитой этого ядра является обфускация кода. Согласитесь, увидеть «простыню» в 10 000 строк обфусцированного кода без new-line — это поначалу страшно. Но если немного покопать — логика и архитектура приложения как на ладони. Главное — определить цель читерства (скорость, ресурсы, GodMode). В качестве инструмента используем Chrome и его Web Inspector. Во вкладке Sources можно «на горячую» изменять исполняемый код.

Google Doodles

Начну с простого примера: http://www. google. com/doodles/slalom-canoe-2012. Сравнительно свежий олимпийский Doodle.

Основная цель игры — пройти трассу как можно быстрее. В голову сразу приходят несколько уловок:

  • повысить скорость лодки;
  • убрать препятствия;
  • убрать замедление от столкновений;
  • «выпрямить» трассу;
  • что-нибудь сделать с таймером (обнулить, замедлить).

Чаще всего самая хорошая мысль — первая. На ней и остановимся. Открываем Chrome и его Web Inspector (основы работы — в замечательной статье ).

Нас интересует JavaScript-код игры.

Логично предположить, что это slalom_canoe12-2.js .

Исходный код… немного страшный, правда? Можно автоматом расставить new-line и отформатировать по синтаксису JavaScript. Читаемость значительно улучшиться и анализировать станет легче. Также можно обложить весь код брейкпоинтами и попытаться восстановить алгоритмы. Но не будем стрелять из С-400 по квадрокоптеру…

Начинаем рассуждать. По нажатию клавиши или при прохождении через ворота лодка ускоряется. Следовательно, где-то есть параметр «скорость» и он должен (скорее всего) инкрементироваться. Ищем по коду все операторы «+=» (благо объем и сложность кода позволяют), их находится всего 12. В принципе можно включить метод «научного тыка» и попробовать изменить все 12 по очереди. А можно и подумать.

  1. this. S+=b. duration — что-то связано с продолжительностью (спасибо, кэп!);
  2. this. B&&(e+=this. B*(Math. random()-0.5),f+=this. B*(Math. random()-0.5))… e+=this. o*(Math. random()-0.5))— random-0.5 как-то не похоже на скорость…
  3. R+=Qc*b — хм-м… и начальное значение, и какой-то коэффициент.

Остановимся и проверим. Обновляем страницу (на всякий случай). Открываем Sources slalom_canoe12-2.js. Находим R+=Qc*b. Предположим, что b — коэффициент ускорения. И заменим его на 500 (не забываем нажать Ctrl + S).

Жмем Play в игре и…

Бинго! Наш чудо-катер устремляется к финишу. Теперь можно похвастаться перед друзьями скоростью своих пальцев 🙂

Отмечу, что приведенный пример — это случай, в котором удалось обойтись малой кровью. И не потребовало глубоких знаний JavaScript, архитектуры, отладки. Только арифметика.

Перейдем к другому примеру.

Spelunky

В этом примере потребуется знать, что такое if и что такое =, а также базовое знание английского языка. Не так давно на Хабре была опубликована статья о Spelunky. Игра, безусловно, заслуживает внимания. Старый добрый хардкор! Но есть в ней несколько «косяков» с управлением и коллизиями, которые мешают пройти игру. Давайте попробуем нарисовать себе жизней, бомб, веревок и прочей радости.

Открываем сайт с игрой. В инспекторе находим index. js. это и есть код игры. Первая мысль: «Какой кошмар».

Однако стоп! Встречаются и понятные слова. Например Bomb, Rope. Это уже интересно. Значит можно попробовать найти кусок кода, который обрабатывает получение предмета. А там где-то должно увеличивать количество оного…

Ищем слово Bomb. Результатов немало — 79. Попробуем Bomb Bag. И вот оно, первым же результатом!

if((qzb(hzb. lhc).hjc==«Bomb Bag»))<

Тут мы видим, что что-то сравнивается с Bomb Bag и если это оно, то делаем global. loc+=3 и куда-то пишется «YOU GOT 3 MORE BOMBS!» соответственно в global. loc у нас лежит количество бомб. Анализируем код, расположенный рядом, и находим переменные, в которых хранятся веревки и прочие радости. Вот краткий список:

  • global. loc — бомбы;
  • global. soc — липкие бомбы;
  • global. woc — веревки.

Теперь пробуем изменить значения в самой игре. В инспекторе во вкладке Sources жмем Pause Script Execution (F8).

Открываем Console и вводим следующее.

Отпускаем паузу — и наслаждаемся полученным результатом! Не буду описывать, как нарисовать себе жизней. Пусть читатель сам попробует разобраться с этой переменной.

Вывод: умный в гору не пойдет. Изменение JavaScript-кода — это легче легкого. Обфускация — это не смертельно. Старайтесь мыслить логически. И еще: любое читерство постепенно убивает интерес к игре (во всяком случае у меня), аккуратней с этим.

Данная статья носит информационный характер.

Автор: Александр Полунин (hekser ).