Pull to refresh

Машина Тьюринга восстановлена из уплотнённого кода

JavaScript *Game development *Reverse engineering *
День назад праздновали день рождения Тьюринга, и на сайте Гугла был дудл с джаваскриптовой машинкой Тьюринга. Уже не первый раз поисковик показывает нетривиальные и интересные скрипты, которые потом, после дня празднования, исчезают в небытие. Странно, что на странице всех дудлов о них есть немного слов, но нет работающих моделей, как, например, по рассматриваемому дудлу машины Тьюринга (UPD4 (26.06.2012, 5:20) — по этой ссылке появился живой скрипт, можно играть; но обфусцированный ещё сильнее, чем был на странице). Возможно, они где-то есть, но поиск в интернете не привёл к результату. Такое своевольное поведение стихии интернета начало надоедать, поэтому вчера я без особого напряжения и старания, но решил извлечь работающий код и попытаться им управлять.

Для этого понадобилось деобфусцировать гугловские коды страницы поиска (которую уже и поиском не назовёшь, судя по массе скриптов) и отвязать движок от родительского сайта. Получилось запустить алгоритм счётчика, который зашит в движок по умолчанию, но не работает механизм прохождения логических задач, который, судя по коду, в нём содержится, но не стартует по клику на кнопке с треугольником. Тем не менее, процентов 20 работы сделано, и не хотелось бы, чтобы она пропадала. Возможно, в другое свободное время я им займусь, а, возможно, кто-то подхватит и сделает форк с реквестом, и у него (или у нас вместе) получится запустить задания.

Выкладываю всё вытащенное на Гитхаб, уже с деобфускацией. Если авторы выскажут недовольство и потребуют удаления — что-нибудь придумаем, как уйти от авторских материалов (очень много кода из самого дудла, анимации спрайтов — там выполнять необязательно), а пока что проект рассматривается как образовательный. Ведь задача реинжиниринга игрушки не несёт иной цели, как обучиться методам реинжиниринга и деобфускации, а также знакомства с кухней непомерно разросшихся скриптов такого простого поначалу сайта. Поэтому в репозиторий я положил не только сам скрипт машинки, но и все присутствующие на странице скрипты — бара, футера, и чего-то ещё. Это может быть полезно как для знакомства, так и для восстановления функций игрушки (машины Тьюринга), потому что в ней как-то различаются 2 состояния пользователя — пришедшего первый раз и прошедшего первые 6 уровней (по числу букв «Google»).

В конечном итоге, вся игра заключена в одном файле turing12.3.js и в 2 картинках спрайтов (turing12-hp-deferredsprite.png, turing12-hp-sprite.png). Всё остальное для основной задачи несущественно.

Далее, запуск самой игры сформирован (вручную) в файле gTuring01.htm (при этом начинает работать встроенный двоичный счётчик на машине), а запуск страницы поиска для ознакомления с оболочкой и всеми прочими файлами rs.js, ssl_gb.js — в googleTuring.htm, но сама игра в последнем файле не запущена, только на первом. extern_chrome_ca.js — файл из канадского Гугла, неизвестно, что делает, к игре не относится. Если понадобятся сжатые исходники — они есть, но быть нужными не должны, деобфусцировано нормально, этим сервисом.

Найденный симулятор машины Тьюринга (JS) с доработками 2012 года.
Open-Turing-Project / OpenTuring (язык C)



UPD: rrock в комментариях рассказал, как запустить игру дальше и начать проходить уровни. Хотя это ещё не полное решение, но продолжение есть!

UPD2 (26.06.2012, 1:30): перед коммитом в Гитхаб (пока не сделан) — копаем немного дальше.

Просмотр кода turing12.3.js показывает, что в var T = function (a) {… (строка примерно 3638) записаны задания и программы для машины к каждому из них. Первое задание ( U = [{… z: "", p: "",) — это, видимо, программа счётчика, запускаемого по умолчанию.

Далее, почему удалось запустить из страницы поиска и не удалось из искусственно созданной — потому что событие клика повешено на внешний по отношению к геймплею объект — блок с id=«hplogo». От него и стартует первое задание, видимо, через строку " if ((Y = document.getElementById(«hplogo»)) && "… — единственное место, где ид встречается.

Также, легко догадаться и предположить, что все U[...] — это выбор правил уровня задания, а U[0] и место "m.aa(U[0].a.Va, e);" — запуск счётчика по умолчанию, Ab() и «a.onload = Ab» — функция запуска по умолчанию. (Однако, подстановка U[1] к запуску 1-го уровня не приводит, хотя поведение меняет. Имеет значение контекст.)

Цель копаний сейчас — создать ссылку, по которой запустится 1-й уровень игры со страницы gTuring01.htm.

UPD3 (26.06.2012, 3:30): сделан коммит. Цель на %75 достигнута — оба HTM-файла запускаются и играют по нескольку уровней. Подробности поведения и запоминания состояний не исследованы. Главное пока — работают.
Вариант rrockgithub.com/rrockru/GoogleTuring.

UPD4 (26.06.2012, 5:20): и, однако, мы зря беспокоились, что этот скрипт они не оживят — ещё вечером там была картинка, а сейчас — работающий скрипт! www.google.com/doodles/alan-turings-100th-birthday. Но! Там он закопан ещё глубже в обфускацию (как вам это нравится? src="/doodles/js/doodle_javascript.js"), а здесь он читаемый и открытый.

UPD5 (26.06.2012, 6:00): рабочий пример здесь: spmbt.kodingen.com/gTuringMachine/index.htm

Tags:
Hubs:
Total votes 84: ↑75 and ↓9 +66
Views 6K
Comments Comments 30