Лю­бишь ли ты вин­тажные игры? Я — очень, поэто­му сегод­ня мы про них и погово­рим. Вер­нее, не про сами игры, а про внут­реннее устрой­ство таких прог­рамм, соз­данных с исполь­зовани­ем древ­ней тем­ной магии тех­нологии 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».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии