Lost Программа Таймер

Lost Программа Таймер

Реверс инжиниринг игры Lost Vikings Хабрахабр. После интересной обратной разработки игрового движка Comprehend см. Recomprehend я подбирал новый проект для реверс инжиниринга игры под DOS. За долгие годы разные люди реверсировали множество старых популярных игр и опубликовали для них спецификации и инструменты. Например, на сайте shikadi. Я обнаружил, что для реверс инжиниринга игры The Lost Vikings компании Blizzard тогда она называлась Silicon and Synapse, похоже, не предпринималось никаких серьзных попыток. Игра была выпущена в 1. Инструкция Кислородные Манометры. DOS, и очень нравилась мне в юности. Lost Программа Таймер' title='Lost Программа Таймер' />The Lost Vikings это головоломка платформер, в которой игрок управляет тремя викингами, каждый из которых имеет собственные умения. Викингам нужно объединить свои силы для решения загадок и прохождения уровней с различной тематикой космический корабль, доисторический мир, Древний Египет. На изображении ниже показан первый уровень игры источник Strategy Wiki Казалось, что эту игру разобрать будет довольно просто. Уровни основаны на тайловых картах и содержат простые загадки кнопки, включающие и отключающие объекты, передвижные ящики и поднимающий предметы кран. И на самом деле, б. У игры есть один пакетный файл данных, содержащий сжатые блоки файлов. Блоки кодируют различные ресурсы игры, такие как спрайты, карты, звуки и т. Я написал несколько утилит, которые можно использовать для просмотра ресурсов игры The Lost Vikings Tools. Виртуальная машина. Интересный аспект работы движка заключается в том, что объекты в игре используют шаблонную систему классов. Lost Программа Таймер' title='Lost Программа Таймер' />Для каждого мира в файле данных есть блок, определяющий набор классов объектов. Например, на показанном выше первом уровне обе двери аварийного выхода имеют тип класса 0x. Реверс инжиниринг кода классов объектов привл к следующей функции Пропуская пока альтернативный путь к адресу 0x. Lost Программа Таймер' title='Lost Программа Таймер' />Программы для выключения компьютера могут быть очень полезными при длительных операциях, после которых необходимо завершить работу компьютера. Например, вечером при просмотре фильма удобно поставить таймер на выключение сразу после окончания фильма. Также, автоматическим. Lost Программа Таймер' title='Lost Программа Таймер' />Пока что не чего снятьТак что вот валял дурака,с такой программой, имитирующей станцию Лебедь, из сериала LOST. В нашем случае я использовал поле field. Когда таймер достигает нуля, башня. Показанная выше программа транслируется в виртуальную машину Lost Vikings следующим образом 52 20 var this. Когда истекли все 108 минут на таймере появляются 5 иероглифов, звучит женский голос и все металлические предметы начинают лететь к одной из стен. Тогда Десмонд поворачивает. Почему нельзя было написать программу, которая сама бы вводила числа в компьютерСлово в смещении 0x. ES. Сегмент ES содержит все данные блока шаблона класса объекта. Затем код переходит в цикл по адресу 0x. Этот цикл получает следующий байт из сегмента ES и использует его как индекс таблицы функций. На каждом шаге цикла bx содержит адрес в сегменте ES, а si содержит текущий код операции опкод. Интересно заметить, что в цикле используется безусловный переход, и поэтому он никогда не завершается. По крайней мере, при нормальном выполнении программы. Похоже, что у каждого класса объекта есть какая то связанная с ним программа, основанная на опкодах, которая интерпретируется этой функцией. Первоначально я просто исследовал некоторые из функций в таблице вызовов. Вот как выглядит первая в режиме графов IDA Анализ стека IDA здесь выполнить не удатся, и на то есть причины. Команда вызова x. Команда pop здесь фактически отбрасывает адрес возврата. Это значит, что следующая команда ret перейдт назад на два кадра стека вместо одного. Этот опкод выполняет выход из бесконечного цикла интерпретатора. Чтобы понять, как на самом деле реализован опкод, нам нужно переключиться в линейный режим IDA Я прокомментировал имена функций их соответствующими номерами опкодов, чтобы эта часть кода была понятней. Здесь довольно умно выполняется повторное использование кода. Легче всего начать с изучения опкода 0x. Вспомним, что в обрабатывающем опкоды цикле есть данные блоков классов объектов, загруженных в сегмент ES, а bx используется в качестве указателя команды виртуальной машины. Таким образом, опкод 0x. Она загружает слово по адресу текущего указателя команд, устанавливает на него указатель команд, а затем возвращается к циклу обработки опкодов. Работая в обратном порядке, опкод 0x. Реверс других функций показывает, что word. Затем он восстанавливает значение bx и проходит в коде до опкода 0x. Поэтому этот опкод, похоже, является очень ограниченной командой вызова со всего одним уровнем стека. Опкод 0x. 00 сохраняет текущий указатель функции в глобальный массив. Заметьте, что он отличается от опкода 0x. Затем он переходит к обработчику опкодов вызовов. Однако, команда не будет выполнена из за первой команды pop. Вместо этого вызывающий цикл выполнит выход. Адрес, сохраняемый этой командой, используется как альтернативный путь входа к циклу вызова функций, который я не стал рассматривать выше. Здесь опкод 0x. 00 используется как что то вроде выхода из сопрограммы coroutine. Он сохраняет текущее положение в программе и выходит из цикла обработки опкодов, позволяя игровому движку выполнить другие задачи обновить графику, получить данные ввода пользователя и т. Это позволяет программе виртуальной машины выполнять сложные задачи без простоя остальной части игрового движка. Дизассемблинг опкодов. На этом этапе у меня уже было общее представление о том, как работает обработчик опкодов виртуальной машины. Изучив таблицу вызовов функций, я нашл там примерно 2. Таким образом я мог сосредоточиться только на опкодах, вызываемых объектами на первом уровне. В этот момент я в основном пытался определить, сколько операндов имеют опкоды, и в чм заключаются их основные задачи. Если обработчик опкодов был коротким, я обычно пытался полностью разобраться, что он делает. Если он был больше нескольких блоков кода, то я тогда просто старался выяснить, сколько операндов он имеет, и выполняет ли он условный переход или вызов. Я делал так, потому что иногда назначение опкода становится очевидным из окружающего его контекста в дизассемблированной программе, в котором зачастую проще разобраться, чем выполнить реверсирование кода. Вот пример простого опкода Этот опкод получает операнд слово и сохраняет его в глобальной переменной. Реверсирование других функций показывает, что эта глобальная переменная является временным хранилищем или регистром общего назначения. В виртуальной машине есть только один такой регистр, но он также имеет вот такой опкод Этот опкод сохраняет текущее значение регистра общего назначения по адресу в сегменте данных DS, указанному операндом словом. Программы в файле данных игры используют этот опкод для записи в определнные части игровых данных, таких как слоты инвентаря викингов. Несколько смещений DS также используются как дополнительные временные значения, когда их требуется больше одного. Например, смещения 0x. Этот опкод и противоположный ему опкод 0x. DS в регистр общего назначения, интересны тем, что они могут считывать и записывать в DS любые игровые данные, а не только те, которые назначены создателями оригинальной игры. Это дат нам интересные перспективы расширения оригинальной игры. Более сложным является опкод 0x. На первый взгляд, его реверсирование не должно вызвать проблем. Он получает байтовый операнд и вызывает пару подфункций. Затем он получает ещ один байтовый операнд и снова вызывает те же подфункции. Но если взглянуть на первую подфункцию sub. На самом деле происходит вот что первый байтовый операнд передатся в эту функцию в ax, который затем используется как индекс таблицы переходов. Хотя для ax выполняется операция AND с 7, на самом деле в таблице переходов есть всего четыре действительных значения. Взглянув на тип 0 в таблице переходов, мы увидим следующее Здесь загружается непосредственный операнд слово. Этот фрагмент функции выполняет retn, который возвращается из обработчика опкода 0x. Нетрудно заметить, почему у IDA возникают проблемы с правильным дизассемблированием этого кода. Другие записи в таблице переходов различными способами загружают значения, а затем каждая из них снова делает retn. Тип 1 берт байтовый операнд, используемый в качестве индекса поля объекта. Объект имеет поля для таких значений, как смещения x и y, флаги и т.

Lost Программа Таймер
© 2017