Pull to refresh

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

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

В этой статье я на двух примерах покажу, как с помощью подручных средств можно нечестно играть в игры на 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»)){
{global.loc+=3;hzb.unc=ilc(qzb(hzb.lhc).exb,(qzb(hzb.lhc).fxb-14),195);qzb(hzb.unc).khc=603;{var moc=uzb(hzb.lhc);for(var noc in moc){var ooc=moc[noc];{nlc(ooc);}}};gg(hzb,izb,global.ync);hzb.lhc=0;global.bnc=«YOU GOT 3 MORE BOMBS!»


Тут мы видим, что что-то сравнивается с 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).
Tags:
Hubs:
+52
Comments 20
Comments Comments 20

Articles

Information

Website
www.ptsecurity.com
Registered
Founded
2002
Employees
1,001–5,000 employees
Location
Россия