воскресенье, 31 июля 2011 г.

Конкурс от журнала ПРОграммист. Мотивация и подготовка

Решение принимать участие в конкурсе пришло по нескольким причинам. Во-первых занятная тема. Идея подбирать пароль к игрушке для консоли устаревшей лет эдак 10 назад, могла посетить только довольно извращенное сознание. Это внушает уважение. Во-вторых, одной из моих первых побед над машиной - было осознание принципа генерации паролей в игре metal gear для NES. Это была радость, и торжество интеллекта над машиной. Хорошо было бы повторить. И, наконец, сега была моей недостижимой мечтой в детстве. Вскрытие игры под нее должно стать прекрасной местью этой злой платформе. Тратить я буду около часа в сутки, прогресс записывать в этот документ.
Для начала попытаюсь определиться с методиками подбора пароля. На настоящий момент я вижу 3 способа:
1) Брутфорс. Программно или вручную перебрать все комбинации. Если комбинация успешна - смотреть на какие параметры она повлияла. Этот метод я, пожалуй, оставлю людям с нарушенной психикой.
2)Аналитический. Изменять параметры в игре, смотреть как меняется пароль, находить зависимости. Уже лучше, но нужно играть в игру. Кроме того, вероятность того что получится открыть какие-то секретные параметры, невелика.
3) Хакерский. Реверсинг алгоритма проверки пароля.
Несложно догадаться, что я остановился на 3-м пункте, который тем интереснее, что платформу я вижу в первый раз.
Прежде всего, мне нужен эмулятор. Сразу же нахожу gens. Прекрасный во всех отношениях эмулятор, за исключением того, что инструментов для отладки в нем никаких. По истечении нескольких минут неистового гугления нахожу эмулятор regen со встроенным отладчиком. Запускаю игру, перехожу в меню набора пароля.
Теперь мне нужно найти код, который отвечает за проверку пароля. Если бы я исследовал win32 приложение, то нашел бы пароль в памяти и поставил бы точку останова на чтение. Попробую это же сделать здесь. Набираю тестовый пароль XWWW WWWW WWWW. К сожалению, все что можно сделать с памятью в эмуляторе - это сохранить на диск. Но это уже нелохо. Делаю дамп, открываю полученный файл в total comander, и ищу строку. Строка находится по адресу F754. Ставлю точку останова на этот адрес, запускаю выполнение кода, и вижу первю неудачу. К сожалению, в этом эмуляторе невозможно одновременная отладка и выполнение кода программы. То есть, я не могу нажать в игре кнопку старт, чтобы программа начала проверку пароля. Эмулятор пока не закрываю, но пробую найти другой, с инструментами получше.
15 минут поисков приводят к осознанию того, что это лучшее что можно найти для отладки приложений для SEGA в широком доступе. И неудивительно. Энтузиастов, которые готовы отлаживать игры для такой древней платформы, и создавать инструменты для этого, довольно немного. А те которые есть, видимо суровы настолько, что могут отлаживать код в чем угодно и как угодно, хоть в консоли, хоть в уме.
Раз уж нет хороших инструментов для отладки под sega, воспользуюсь хорошими инструментами под windows платформу. В этом нет ничего странного, потому что на данный момент, исследуемая игра является ничем иным, как скриптом для windows приложения (нашего эмулятора). А под windows есть прекрасный отладчик OllyDbg, и не менее прекрасная программа ArtMoney. Присоединяюсь к эмулятору в отладчике (если помните, эмулятор я не закрывал), запускаю ArtMoney, открываю игру. Сейчас мне нужно найти регистр команд. Для этого ищу с помощью ArtMoney его текущее значение (0x89e8). Нашло всего два числа. Когда делаю шаги в отладчике - числа меняются. Теперь, опять же, с помощью Artmoney, ищу строку пароля. Нашло в единственном экземпляре по адресу 0x00B05675. Перехожу к этому адресу в дампе OllyDbg, и ставлю точку останова на чтение. Как и ожидалось, точка останова срабатывает по нажатию на end в игре. Командный регистр указывает на адрес 0x8E1B.

Часть дела сделана. Дело за малым - анализировать процедуру проверки. Изучать ее в убогом отладчике эмулятора, который не что иное как листбокс со строками кода, нет никакого желания. Открываю ROM файл в программе IDA Pro, делаю выбираю процессор Motorolla 68000, перехожу по адресу 0x8E1B, преобразую байты в код. Вижу замечательную картинку. С ней-то и прийдется
работать.

1 комментарий: