Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Любишь ли ты винтажные игры? Я — очень, поэтому сегодня мы про них и поговорим. Вернее, не про сами игры, а про внутреннее устройство таких программ, созданных с использованием древней темной магии технологии DarkBASIC.
Уже как минимум полвека разработчики стараются писать компьютерные игры не на низкоуровневых языках программирования и выдумывают какой‑то свой скриптовый интерпретатор, заточенный под собственную игровую платформу. Казалось бы, должно быть прямо наоборот: игры — это, пожалуй, наиболее требовательный к скорости и оптимизации кода продукт. Соответственно, логичнее было бы и разрабатывать его на чем‑то близком к машинному коду — на С или ассемблере.
Тем не менее даже в благословенные 80-е и 90-е годы, когда компьютеры были большими и медленными, шла борьба за каждый такт процессора и байт дискового пространства, большинство топовых игр имело прокладку между железом и графикой в виде разнообразных гейм‑интерпретаторов и скриптовых движков. Причина банальна: дело даже не в упрощении разработки, а в максимальной поддержке кросс‑платформенности — в те времена существовал целый зоопарк всевозможных консолей и приставок, который нужно было охватить максимально быстро и дешево.
В конце прошлого века, вскоре после появления DirectX, контора The Game Creators создала специально заточенный под эту технологию игровой движок DarkBASIC. Как следует из названия, в The Game Creators, не мудрствуя лукаво, прикрутили 3D DirectX к языку Basic и принялись клепать 3D-игры на нем. Впоследствии идея так понравилась другим разработчикам, что ее взяли на вооружение (благо первые версии DarkBASIC были open source). Потом, в 2010 году, эта технология мутировала в DarkBASIC Professional с нативным компилятором. К настоящему моменту проект изжил себя, и даже нагуглить какую‑то техническую информацию по исходному DarkBASIC достаточно сложно.
Тем не менее реализованные на нем старые винтажные игры остались, и олдфаги их помнят. Сегодня мы разберем, как вернуть к жизни любимую игру молодости.
Итак, условие задачи. У нас есть старая космическая стрелялка. Незарегистрированная версия работает в режиме триала — полтора часа (точнее, 89 минут 59 секунд). Оставшееся время триала отображается при загрузке игры в нижней части одного из стартовых экранов.
Триал можно израсходовать как сразу, так и за несколько игр — при каждой новой загрузке счетчик оставшегося времени запоминается, и по его истечении игру запустить уже нельзя. В этом случае вместо экрана с остатком триального времени появляется сообщение с предложением купить игру.
Попробуем пойти по пути наименьшего сопротивления — сделаем бесконечный (ну или хотя бы неисчерпаемо длинный) триал. Detect It Easy нам тут не помощник — он такой винтаж не понимает и распознаёт содержимое программы как банальный Microsoft C++. На то, что это наш пациент, указывают многочисленные упоминания в коде языка DarkBASIC, на сайт которого даже ссылка есть, к сожалению протухшая за давностью лет. Кроме того, мы обнаруживаем, что программа чуть менее чем полностью состоит из оверлея, смахивающего на файловый ресурс. Собственно из исполняемого кода там крохотный по масштабам программы, около 5 мегабайт, загрузчик.
В оверлее чего только нет: и графические файлы, и текстовые, причем исходные названия файлов тоже хранятся рядом в открытом неупакованном виде — мечта реверс‑инженера (хотя многие, конечно, скажут, что это неспортивно). Поискав ключевую фразу Demo Mode, обнаруживаем внедренный в ресурс целый текстовый файл со строками и их кодами.
Загружаем программу в отладчик x64dbg. Разумеется, при старте игры этой фразы в памяти процесса нет, однако, прервав загрузку в первом доступном для этого месте, мы находим уже целые две ссылки на нужные нам слова.
Первая нам не особо интересна — судя по всему, это исходный текстовый файл из ресурса, загруженный в буфер целиком.
А вот вторая похожа на уже распарсенные данные: вероятно, в дальнейшем программа будет работать именно с ней. Попробуем проверить. Ставим на эту строку аппаратную точку останова и пускаем программу дальше. Мы угадали, эта точка останова срабатывает именно перед загрузкой экрана, на котором отображается время триального периода.
Пускай тебя не пугает такая странноватая ассемблерная конструкция — это всего‑навсего одна из реализаций банального strlen
. А вот вызывающая эту функцию процедура выглядит уже по‑настоящему интересно (для наглядности приведу ее начало в IDA’шном псевдокоде).
Источник: xakep.ru