Пользователь
250,2
рейтинг
11 марта 2014 в 16:04

Разработка → StarCraft дизассемблировали и запустили на ARM



Один из участников проекта OpenPandora провёл реверс-инжиниринг игры StarCraft и портировал её на ARM-платформу. Ему удалось сделать это, несмотря на отсутствие исходного кода в открытом доступе.

В репозитории выложен перекомпилированный бинарник, для установки которого на игровую приставку «Пандора» нужно еще скопировать несколько файлов с ПК-версии игры.

Автор порта говорит, что он дизассемблировал игру в IDA, затем конвертировал код на C с помощью инструментов собственной разработки (их пришлось написать в процессе работы специально для этой задачи), потом скомпилировал в нормальную программу и связал с библиотекой winelib, которая работает с Win32 API из-под ARM-версии wine. Задача поначалу казалась простой, но в реальности проект занял почти полгода: вылезло очень много неожиданных проблем. Так или иначе, но автор довёл дело до конца.

Теоретически, он мог бы выложить код C в открытый доступ, чтобы кто-нибудь скомпилировал версию под Android. Сейчас StarCraft запускается на Android-планшетах и смартфонах с помощью Winulator.

Анатолий Ализар @alizar
карма
739,5
рейтинг 250,2
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (63)

  • +4
    Без мышки, наверно, не очень удобно будет
    • –6
      Наоборот, вся игра на кликах, что делать пальцами будет очень комфортно. Понятно что вариант не для чемпионатов, а вот поиграть в поездке будет прекрасно.
      Я тут Дюна2 под андроидом поиграл, гораздо удобнее управление чем на ПК была.
      • 0
        www.youtube.com/watch?v=aoNMWORzPys
        Прогеймер играет на тачскрин-тв… иногда матерится.
      • +8
        Там половина секрета успеха в использовании горячих клавиш на клавиатуре :)
      • +4
        Там половина кликов правой кнопкой мышью, кайтить вообще будет адово.
      • +3
        Правого клика не будет, шоткатов не будет. Т.е сдвинуть юнитов — только через кнопки вправо внизу. Впрочем, если ее адаптировать к жестам — может получиться вполне ничего.
      • 0
        Никакого микро же. Если только побаловаться…
  • +30
    Это мегакруто. А вот эти слова просто убили:
    дизассемблировал игру в IDA, затем конвертировал код на C с помощью инструментов собственной разработки (их пришлось написать в процессе работы специально для этой задачи), потом скомпилировал в нормальную программу и связал с библиотекой winelib, которая работает с Win32 API из-под ARM-версии wine. Задача поначалу казалась простой

    Задача поначалу казалась простой

    Нифигасебе простая задача! А что тогда сложная?

    • 0
      чёкнуться.
      потрясающе
      • +7
        На самом деле, современные версии HexRays (плагин для превращения кода в C-код для IDA Pro) восстанавливают код достаточно точно. Достаточно для того, чтобы какую-нибудь функцию скопировать и скомпилировать.
        • 0
          ага, спасибо.
          не знал.
        • +2
          > восстанавливают код достаточно точно
          К сожалению, это неправда. Во-первых, есть довольно много случаев где декомпиляция в статике by design не сработает (речь про нормальный не обфусцированный код). Во-вторых, лучи генерят на выходе черт знает что так же весьма часто, а отлавливать баги в декомпилированном коде — то еще удовольствие.
  • +2
    спасибо за Winulator. :)
  • –6
    А в чем профит от дизассемблирования и последующей компиляцией/линковкой с winelib и «просто взять запустить под wine»?
    • +23
      Подозреваю нельзя «просто взять запустить под wine» из за разницы в системе команд x86 и ARM
      • 0
        Виртуально эмулировать нужные команды никак? Игры Плейстейшен2 сейчас на х86 запускают (хоть и работает на костылях), неужели старика 386-нельзя заэмулировать (темболее что старкпафт старый и никаких расширений типа 3DNow не использует)
        • +1
          Ну это по сути и есть эмуляция. Разве что не в реальном времени.
        • 0
          Можно, только тормозить будет… Старик-386 — чрезвычайно паршивая с точки зрения эмуляции платформа, особенно если архитектура хоста — RISC.
        • +1
          И посмотрите, какая нужна машина, что бы сэмулировать PS2? Какие накладные расходы на эмуляцию? Там соотношение даже не 1 к 10.

          Ну и условно говоря, DosBox например, существует и эмулирует, но на одноядерном ARM7 на 1 ГГц он эмулирует (в плане скорости) где-то 486й на 66/100 Мгц. Причем эмулирует он не всю обвязку, а только ту, что критично нужна. Здесь же придётся эмулировать всё, что необходимо для запуска Windows.
          • –1
            >>>Какие накладные расходы на эмуляцию?
            Современные компы тоже не пальцем деланные — у меня бюджетный 4-ядерник за 150$ и парой 2 Гб оперативки достойно осилил GTA: VCS — правда звук паршивый, проблемы с разрешением (изменить нельзя), но то такое — жить можно.
            • +1
              Бюджетный 4-ядерник — это телефон?
              • –1
                Нет, я про эмуляцию PS2 на ПК.
                • +1
                  А. А то тут народ собрался и обсуждает ARM'ы.
  • –11
    Лучше бы на Андроиде запустил.
    • +15
      Лучше бы ты молча взял на себя эту задачу и помог бы ему.
      • –25
        Лучше бы вы оба заткнулись и восхищались…
      • +1
        Лучше бы для этого автор сначала исходники выложил. Или предлагает последовать его стопам и сконвертить бинарник с той приставки на Андроид?)
        • 0
          Подозреваю, что у автора нет прав выкладывать исходники.
          • 0
            Тоже верно. Но хотя бы инструкция по сборке была бы явно не лишней.
          • 0
            Обычно лицензия запрещает любые изменения в коде программы, не говоря уже о выкладывании исходников.
            • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                Только для собственного использования и при наличии оригинальной лицензии.
  • +2
    Еще бы под макось собрал бы кто, с 10.6 не играл в starcraft :(
    • 0
      Кстати, а ведь на коробочке с диском написано PC/Mac CD-ROM. По гуглю видно, что совместимость распростраяется на Mac OS X включительно. А дальше всё, обратной совместимости между ОС нет?
      • +3
        Он скомпилен под PowerPC, а Rosetta (бинарный транслятор на Intel) перестали включать начиная с 10.7.
  • 0
    Вообще говоря, странно, что по прошествию стольких лет Blizzard так и не открыли исходники (хотя желающих их скачать, уверен, много).
    • +5
      Думаю, что не сделали этого, т.к. считают, что им это не выгодно.
      • –3
        А может, им просто стыдно.
    • +1
      Они до сих пор её продают, и, более того, до сих пор находятся люди, которые её покупают (например, я). Поэтому не думаю, что в ближайшее время исходники появятся в открытом доступе.
      P.S. Они даже Warcraft II до сих пор продают, что уж там говорить.
      • 0
        А подскажите где WCII купить? На батлнете только третий есть.
        • 0
          Ох-ох, видимо, я дезинформировал вас. Последний раз заходил на сайт в 2013 году, вот тут был и WCII Battle:Net Edition. Сейчас нету.
          • 0
            Не видел ее там в прошлом году. По крайней мере варианта купить, даже на диске в их магазине нету.
            • 0
              Нашёл!
              Вот тут можно купить и даже скачать.
      • +1
        И что, открытие исходников помешает его продавать?
        • 0
          Конечно нет, однако открытие исходников чаще всего связано с одновременным релизом бесплатной версии, поэтому я так и считаю.
      • 0
        Игра состоит не только из программы, и открытие исходников не делает её бесплатной. Аналогично, например, с Doom — исходники открыты, существует множество портов на разные платформы, но для того, чтобы поиграть, всё равно нужны файлы купленной игры, в которых содержатся, графика, карты, музыка, звуки и прочее.
  • +2
    Хм… В StarCraft уже давным-давно можно было поиграть на ARM-девайсах, причем без монструозной зависимости от winelib/Winulator. Неужели автор порта не слышал о таком проекте, как Stargus?

    Я это к тому, что вместо полугодового ада дизассемблирования, можно было внести лепту в открытый проект, допилить его до ума. Хотя, надеюсь, что дизассемблированный код, в частности, логика, войдет и в проект Stargus.
    • +2
      Upd: Оказывается, автор порта — Notaz, человек весьма известный и уважаемый в узких кругах владельцев портативных консолей от GamePark (Caanoo, WIZ) и OpenPandora. Ему не привыкать тянуть на себе очень сложные проекты, например, эмулятор PS One с динамическим MIPS->ARM recompiler; или известный многим эмулятор Sega — PicoDrive, который был портирован на все что только можно. Так что дизассемблирование такой игры не представляет особой сложности для него.
      • +7
        По сути, Stargus (как и Wargus) — это не портирование, а создание игры с нуля с использованием оригинальных ресурсов. Т.е., механика делается частично по тому, что удалось раскопать в ресурсах, частично «на глазок». Если же портировать именно код — получаешь всю «логику» из коробки. Что проще — тот ещё вопрос…
    • +2
      Если это был не риторический вопрос, то автор определенно знаком с Stargus, поскольку его можно видеть в списке игр на первых секундах видео (или же изображение в заголовке этого поста). Так что вполне возможно, как вы и предположили, результат распиливания игры пойдет в код проекта.
    • +4
      Stargus нереально допилить до ума как минимум потому, что движок Stratagus не поддерживает и половину нужных фич. Сейчас оно представляет собой очень сырое поделие, в котором не работает почти ничего, а то что работает — работает не так. А переписывать Стратагус… Не, уж проще и быстрее рекомпилировать.
      • +1
        Ну насчет «не работает ничего» вы загнули… В принципе, там достигнут уровень WarCraft 2 (ну может с частью фич из Battle.Net Edition). Но StarCraft использует изометрию (что накладывает специфику на расчет путей и прочего) и множество других фич, которых в движке пока нет.
  • +1
    Я считаю, что решить эту задачу можно было бы намного меньшим количеством ресурсов с помощью статической бинарной трансляции. Примерно так: 1) Разбираем структуру исполняемого файла, отделяем код от данных 2) Прогоняем код через кодогенератор QEMU c arm в кач-ве target architecture 3) Линкуем получившийся arm код обратно.
    Вероятно, человек пошел путем хардкорной ручной декомпиляции не столько из-за портирования, сколько для того что бы с внутренностями самой игры разобраться.
  • +1
    Или совсем крутой вариант — транслировать не в arm, а в байткод LLVM, тогда можно будет одним махом портировать код на все архитектуры, для которых есть LLVM backed (а LLVM target для QEMU, который позволяет транслировать машинный код многих архитектур в байт-код и запускать на виртуальной машине LLVM, был реализован в рамках проекта S2E).
  • –3
    Интересно а есть StarCraft под MAC OS?
    • +1
      Выше писали
      Он скомпилен под PowerPC, а Rosetta (бинарный транслятор на Intel) перестали включать начиная с 10.7.

  • +1
    В тред призывается Мамаич.
    Если вдруг кто не знает: гражданин подобным образом портировал Герои 1 и 2 для КПК
  • 0
    Вот бы Героев 3 в полном комплекте, да на АРМ.
    • 0
      Дак вроде ж есть, под WinMobile
      • 0
        Это порт под MIDP2, если я правильно понял.
  • 0
    А под Caanoo пойдет?
  • 0
    Титаническая работа :) Но скорее всего он кучу законов нарушил и на него еще в суд подадут.

    > вылезло очень много неожиданных проблем
    Вспомнилась эта статья, где рассказывается, что код батонов вывели в отдельную ветку и приходилось все изменения делать отдельно для обычных юнитов и для батонов. Разумеется возникнут проблемы…

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.