Комментарии 52
Здравствуйте, возможно ли дизассемблировать хоть в какое-то подобие си к примеру бинарник игры Arcanum и все это добро скомпилировать?
Можно попробовать поискать транспайлер asm → c. Хотя зверь, полагаю, достаточно редкий.
Т.е. сначала бинарник в ассемблер, а потом ассемблер в си. Да только по дороге всё равно что-нибудь где-нибудь да сломается.
IDA Pro умеет генерировать сишный код из результата дизассемблирования, но тут вопрос ещё в том, может ли она сделать это для конкретного случая (мало ли какие ограничения имеются).
Плюс, сишный код, полученный таким путём -- он, конечно, сишный, но логика зачастую остаётся непонятной: вполне могут быть if и goto вместо циклов и т.п. вещи.
С IDA, честно признаюсь, мало работал, в разы меньше чем Гидрой, но разве IDA даёт чистый код?! У Гидры - это псевдо-код, о чём я писал в статье
В другой части, кода "перейдём к практике", хочу показать примеры того как все выглядит в Гидре и что бывает проще все написать самому, чем доверятся Гидре и хочу показать пример "хорошей" генерации кода в Гидре
Но Arcanum - действительно большая игра. Было дело, играл в неё. Но я бы не рекомендовал бы ее для реверса, если Вы новичок. Начните с чего-то попроще, "набейте" руку
Я где то год назад с помощтю ida pro конвертировал в си код. Пытался это все собрать, но не получилось. скорее всего это нужно было все допиливать напильником. Ну хотя бы поковырялся чуть чуть.
Пока занимаюсь библиотекой SDL3Lite, но есть наработки по новому движку https://github.com/JordanCpp/ArcanumWorld
Даже уроки в виде статей по разработке движка аркакнум сделал. Вы правы дизассемблировать арканум, для меня это сверх задача.
Про "лучший из лучших" плагин-декомпилятор HexRays к IDA Pro - им декомпилировали Notepad, но компилировать исходник на Си снова не удалось.
Не полагайтесь на декомпиляторы - они не способны восстановить исходный код.
Дизассемблируйте, рисуйте граф кода по условным и безусловным переходам, изучайте структуру кода, распознавайте циклы for, do, while, условия циклов, break, continue и поймете логику программы. Ghidra здорово строит графы автоматически.
Не старайтесь понять весь код сразу - изучайте небольшие функции, давайте им имена. Решайте небольшие задачи по одной: распаковать программу, сменить текст, звук, сделать персонажа бессмертным, увеличить урон колотушки до 9999.
Не рекламы ради, а токмо ностальгии ради. Сам веду проект по реализации совместимой SDL3 API библиотеки в том числе и для старых систем. https://github.com/JordanCpp/SDL3Lite
Библиотека пока в разработке. Но скоро уже первый релиз 0.1.0
А вот если разработать библиотеку SDL3Lite совместимую со старыми системами и железом То можно разрабатывать игры или софт под новое железо и с минимальными усилиями портировать под старое.
Есть отличный плагин к IDA для отладки в Doxbox-X. Очень помогает в изучении кода старых игр. Hex-rays в IDA, к сожалению, не умеет в реверс 16-битного кода, но зато с этим прекрасно справляется ИИ, тот же DeepSeek, особенно если ему объяснить что за игра, и если ему скармливать результаты отладки отдельных кусков кода.
LLM могут помочь в анализе блоков кода, с этим я не спорю, но лучше все перепроверить после "работы" LLM. Как пример, до подготовки статьи я сам специально проверял работу LLM при анализе дизассемблерного кода Раз народ ими пользуется, то я должен был это учесть. Неплохо справляются: Cursor, Qwen
Согласен. Иногда ИИ выдаёт дикую отсебятину, особенно через 10-15 запросов. Нередко, основываясь на тематике игры, ИИ решал что функция делает какую-то определённую работу, например, просчитывает поворот руля на 90 градусов (почему на 90?), и переубедить его в этом не удавалось никак.
Но нередко подаёт какие-то годные идеи, которые оказываются верными.
Плюс он как-то пугающе хорошо разбирает функции работы со звуковыми устройствами, описывая детально для какой это карты, почему это именно так, и как бы это улучшить.
Я объясню во второй части как вы точно сможете сделать то или иное, буду "вести за руку", вернее постараюсь. Конечно, часть вопросов останутся, я как и любой человек, могу что-то забыть или упустить
Так по работе со звуком и видяшкой - так все просто же. Постараюсь это учесть и немного показать в примерах. Сложность именно в логике, а не при работе с устройствами
Вы дальше будете развивать тему по дизассемблингу кода? Очень бы хотелось увидеть реальные примеры.
Все будет в последующих частях. Это моя сама первая публикация на Хабре, я не знал много моментов. В меня можно кидаться тапками - так я быстрее учусь. Сразу скажу, дальше будет "хуже" - будет много кода
В этой статье я постарался акцентировать внимание на подготовку к реверсу, так как это действительно важная часть.
DOS-игры - другое дело: нет виртуальных машин;
Another World, квесты от Sierra и Lucas Arts с удивлением смотрят на вас ;)
Спасибо за критику, сегодня сам скачаю их "препарирую" их. Я в квесты не играл, совсем. На чем я учился: Commander Keen, Dune 2, Dune 2000, Syndicate, Syndicate: American Revolt, KKnD, M.A.X.(1993), M.A.X.(1996), M.A.X.2, Z
Это не критика, это констатация того что "нельзя объять необъятное", всегда можно что то упустить из виду.
Советую к ознакомлению сайт Фабьена Сангларда, там вы можете почерпнуть много интересного из его анализа игр.
Часть его статей была переведена и опубликована на Хабре, к примеру вот тут.
Да, эту статью я упустил из виду. Хотя меня много материала вдохновило на создание этой статьи. Примеры: "Реверс-инжиниринг ресурсов игры LHX. Часть 1" (https://habr.com/ru/articles/841614/) (unbalanced 17 сен 2024 в 14:23 ), "Занимательная некромантия 01H: ломаем программу под MS-DOS" (https://habr.com/ru/articles/932948/) (sa2304 31 июл 2025 в 18:36 )
Полный список будет в финальной части
Можно считать такие виртуальные машины игровыми движками?:)
Огромное количество игр использовало VM, это облегчало портирование на разные платформы. Да и без портирования тоже. Серия Ultima, начиная с 6 части - на отдельной VM, почти все РПГ игры SSI, - тоже.
Супер, увлекающая статья - читал с карандашом.
Изучать ассемблер куда интересней не по сухим учебникам, а когда реверсишь любимую игру - тогда и документацию процессора листаешь увлеченно, и примеры кода пишешь с большим удовольствием. Обидно, когда игра вылетает из-за ошибки, но круто ошибку исправить и продолжить играть.
Игры заканчиваются, но в дизассемблирование можно играть вечно :)
О, Sourcer+RBIL - столько было времени с ними проведено, изучая потроха всякого разного ))
Интересная тема,в бытность Jurassic War пытался поковырять,но больше дизайнер,кодил в детстве и потом отошёл.
За KeeperFX отдельное большое спасибо,не знал даже о таком проекте.
Как сказал один хороший человек: "Привыкаешь в играх к абсолютной власти над юнитами, но юниты Dungeon Keeper живут сами по себе? Получил приказ, пошел выполнять, пока шел - забыл за чем посылали :) Видимо, нечисть древняя, забывчивая. А, может, бессмертная, потому и заряжена пофигизмом. Сегодня один начальник, завтра - другой."
Не, в DK/DK2 ты мог вселится в существо и порулить им в "ручном" режиме. ЕМНИП то после такого вселения существо получало буст к морали, но я могу и ошибаться. ;)
А игра с непрямым управлением, где юниты имели "свободу воли", это Majesty: The Fantasy Kingdom Sim где юниты исполняли твои указания по принципу "Утром деньги? Вечером стулья! Вечером деньги? Утром стулья! Нет денег? Приходите когда будут"
И вообще, по отношению к игроку, они нагло косплеят "Операцию Ы"
"Бывалый: (грозно) Сумма?!
Директор базы: Триста!
Балбес: Ха!.. (замолкает)
Бывалый: Это несерьёзно!
Балбес: Не-не-не, так не пойдет!
Трус: Вы нас не знаете, и мы вас не знаем.
Балбес: Ищи дурачков!
Трус: Я на русалках больше заработаю!
Бывалый: Пошли, пошли!
Трус: Курам на смех!
Балбес: Подумаешь, триста!
Директор базы: Стойте! Ваши условия.
Балбес: Триста тридцать!
Директор базы: (быстро) Согласен.
Бывалый: Каждому!
Директор базы (поморщившись): Согласен. С Богом."
Кстати, из успешных подобных кейсов рекомпиляции старых игр можно назвать проект JJFFE - пересборка для новых компьютеров третьей части элиты Frontier First Encounters.
https://github.com/videogamepreservation/jjffe - в архиве :(
У этого автора - videogamepreservation - много ссылок на проекты, как публичные, так и пересобранные, под разные платформы: Atari, x86, Mac
Много лет назад познакомился с DreamZ на elite-games, предложил ему взять код этой игры и заново отреверсить. При помощи IDA Pro, Hex-Rays и крепкого словца он выкатил шикарный собственный порт, который догнали до последнего на тот момент DX, прикрутили новые модели, поправили баги.
Привет Quester :D
Было дело) 5 лет тогда ушло на проект, а звучит как будто за неделю состряпал.
Ого, вот это встреча :) Привет!
Время неумолимо бежит вперёд, сжимаясь в воспоминаниях как архив, вот и кажется, что неделя :)
Да, неожиданная встреча)
Я периодически вспоминаю про проект. Есть желание с помощью ИИ переписать оставшееся на асме на C++ и прикрутить в качестве рендера движок UE5. Времени только нет)
Это было бы здорово! Для начала хорошо бы выложить проект на гитхаб (я кое как нашёл исходники в инете), а там, глядишь, и энтузиасты подтянутся.
Казалось бы, через 15-20 лет время должно было появиться, а всё как раз наоборот.
Честно говоря, я был уверен, что это сделает кто-нибудь из тех, кто пилил проект дальше. У меня на руках только сильно сломанный последний коммит. Его нужно привести в порядок, но он сильно отстал по прогрессу от последователей. Возможно я это сделаю, но не факт.
Сейчас появились инструменты, которые позволяют вообще конфетку из него сделать. Ту же функцию деления треугольников, которая мне мозг сломала, я сейчас для пробы всучил дипсику на асме, он за минуту её разобрал и указал, где я допустил ошибки. Все сильно поменялось)
Я про это выше и писал. 20 лет назад пытался разобрать TD3, особых успехов не добился. Недавно начал сливать код DeepSeek (мы пахали, я и трактор), так с подсказками за пару дней 50 функций. В идеале, конечно, видится связка в виртуалка+ида+deepseek, последний должен в реальном времени отслеживать дебаггер. Если кто-то реализует такой инструмент, он вернёт к жизни тысячи старых игр, исходники которых были утеряны.
Это вопрос времени. Не пройдет и года, появится подобный инструмент. А что из этого в итоге выйдет, вот это интересно будет посмотреть)
Не в качестве рекламы, но я делаю что-то вроде такого: "DOS Turbo Debugger for Windows" (у него даже толком названия то и нет). Умеет видеть защиту; часть зашиты умеет снимать; видит "живой" код; частично работает с самораспаковкой; ну и эмулирует работу с текстового режима 80х25 (установщик Dune 2 в нём хорошо отображается). Но там работы еще непочатый край, пример: еще не все прерывания эмулированы. Ниже пример того, как отображается в нём код - точное соответствие того, как код отображается в TD (установщик Dune 2 - первые строчки)
mov dx, 2274
mov cs:[0291], dx
je 02b5
mov ah, 30
int 21
... и т.д
Самораспаковка "приветствует вас на борту нашего корабля":
mov dx, 2274
mov cs:[0291], dx
И это только первые строчки SETUP.EXE Dune 2
Я уже молчу про то, сколько раз она переписывает DS (Data Segment) и ES. "Урааа - переписываем DS... Вперёд" - строки с 8ой по 11 :\
mov [007d], ax
mov [007b], es
mov [0077]. bx
mov [0091], bp
Как воссоздать код DOS-игры: пошаговое дизассемблирование ретро-игр