Generator for CTF-like challenge, written specifically for this article.
Небольшой генератор, тем не менее, таит в себе много опасностей. Проблема в том, что пароль кодирует только 4 бита, а все остальные приходится затыкать разными уловками, вроде условного распределения битов уровней по знакам в зависимости от счетчика фреймов. Сам генератор мог бы получиться меньше, если бы было меньше мороки с логикой самой игры: три уровня открываются после прохождения первого, один из фактически случайных байтов не может быть равен нулю и так далее.
Простенькая система паролей интересна криворукостью реализации: предполагается, что количество жизней обязано храниться в пароле, но под сегу это сделано настолько неаккуратно, что жизней всегда пять, даже если введен секретный пароль, который выставляет их в 99. Пароли подходят под Сегу и SNES. Впрочем, под SNES, оказывается, тоже есть баги: ввиду элементарного незнания создателем специфики использования флага переноса (bcc подразумевает bge, а не bgt после команды cmp), игра не хочет принимать количество жизней с цифрой 9.
Кроме трудностей с отладкой кода Сеговской игры, система паролей особых сюрпризов не приподнесла. Правда, JavaScript не знает ни word’ов, ни longword’ов, поэтому с написанием самого генератора пришлось повозиться. Для тех, кто хочет лицезреть все возможные пароли игры, есть брутфорс с исходниками.
В случае этой игры, основную сложность составлял размер самого пароля (31 символ), а значит и количество кодируемых в него параметров. К счастью, кроме большого объёма, HOT•B никак не стало усложнять мне жизнь… Ну, разве что фирменный стиль криптовки всего и вся. Однако, как вы можете убедиться, генератор вышел несколько больше своих предшественников, это расплата, в том числе и за возможность вводить имя игрока с клавиатуры. Генератор позволяет использовать в качестве имени игрока 8 пробелов (в игре такое имя заменится на ‘NONAME’) и в имени может быть дополнительный символ ‘&’, который не уместился в экран ввода имени, однако сохранился в таблицах кодировки внутри ROM’а.
Под переведенную игру есть русская версия генератора.
Система паролей в этой игре несколько сложнее тех, с чем я имел дело до этого. Не по наслышке зная о разработчиках HOT•B (надеюсь, когда-нибудь я добью их Blue Marlin c криптованными картами тайлов), я был готов к самому худшему. К счастью, неразрешимых проблем не возникло: генератор псевдослучайных чисел (его пришлось включить в генератор) несколько необычен и использует результат предыдущих итераций для своего нового зерна при криптовке каждого нового символа потока, что позволяет получать самые разнообразные по внешнему виду пароли. Поэтому он сохраняет первичное зерно в старшие 8 бит исходного потока. После чего вычисляется чексумма и полученный поток из 80 бит размазывается по 16 символам пароля (5 бит на символ).
Одна из игр, в которые я играл на железе обязана была получить свой генератор. Процедура более сложная, чем в Batman Returns: 45 бит значимых данных аккуратно размазываются в 5-битовой кодировке по 9 символам пароля.
В 2006-м я написал свой первый генератор паролей для этой игры на Delphi. Из-за отсутствия у меня должного опыта, он получился неполным. Зато теперь пришло время собирать камни: новый генератор получился функциональнее (выдает в 64 раза больше паролей на те же игровые ситуации) и в 184 (!) раза меньше по объему.