Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 52

Здравствуйте, возможно ли дизассемблировать хоть в какое-то подобие си к примеру бинарник игры Arcanum и все это добро скомпилировать?

Можно попробовать поискать транспайлер asm → c. Хотя зверь, полагаю, достаточно редкий.
Т.е. сначала бинарник в ассемблер, а потом ассемблер в си. Да только по дороге всё равно что-нибудь где-нибудь да сломается.

Всё верно, поэтому каждый шаг придётся отсматривать

Понял. Спасибо.

Меня больше интересует именно автоматизация процесса. что бы была возможность итоговый си код портировать под windows, linux нативно. Но я понимаю, что такой си будет не понятнее асма;)

И Вы чертовски правы

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 совместимую со старыми системами и железом То можно разрабатывать игры или софт под новое железо и с минимальными усилиями портировать под старое.

Так вот, буквально недавно, несколько дней назад, на Хабре была очередная статья, где каждый желающий мог представить свои пет-проекты. Когда я в "последний раз" видел, то в ней было более 25+ комментариев от Хабровчан: 1 ответ - один пет-проект. Думаю, Вас там быстрее заметили бы

Я же не рекламы ради, мой проект это мостик между старым и новым железом. Когда будет первый релиз создам новость. Я лишь привел пример. Ни в коем случае не пиарюсь.

Есть отличный плагин к 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, - тоже.

Я поклонник игр разработчиков: Bullfrog (играл во все игры, которые были выпущены с 1993), Bioware, Westwood (серия игр: Dune и C&C), я не встречал у них VM. Что самое печальное, к ним, ко всем, прикоснулась "корпорация смерти" - EA. Из всех троих, до 2025 года, "дожила" только Bioware

Супер, увлекающая статья - читал с карандашом.

Изучать ассемблер куда интересней не по сухим учебникам, а когда реверсишь любимую игру - тогда и документацию процессора листаешь увлеченно, и примеры кода пишешь с большим удовольствием. Обидно, когда игра вылетает из-за ошибки, но круто ошибку исправить и продолжить играть.

Игры заканчиваются, но в дизассемблирование можно играть вечно :)

Вы правы. Приходит понимание того как устанавливаются флаги, на что они влияют. Или начинаешь понимать разницу между условными и безусловными переходами и т.д.

О, Sourcer+RBIL - столько было времени с ними проведено, изучая потроха всякого разного ))

Ссылка на RBIL будет во второй части и не только она... ой.. интригу раскрыл...

Интересная тема,в бытность Jurassic War пытался поковырять,но больше дизайнер,кодил в детстве и потом отошёл.
За KeeperFX отдельное большое спасибо,не знал даже о таком проекте.

Как сказал один хороший человек: "Привыкаешь в играх к абсолютной власти над юнитами, но юниты Dungeon Keeper живут сами по себе? Получил приказ, пошел выполнять, пока шел - забыл за чем посылали :) Видимо, нечисть древняя, забывчивая. А, может, бессмертная, потому и заряжена пофигизмом. Сегодня один начальник, завтра - другой."

Не, в DK/DK2 ты мог вселится в существо и порулить им в "ручном" режиме. ЕМНИП то после такого вселения существо получало буст к морали, но я могу и ошибаться. ;)

А игра с непрямым управлением, где юниты имели "свободу воли", это Majesty: The Fantasy Kingdom Sim где юниты исполняли твои указания по принципу "Утром деньги? Вечером стулья! Вечером деньги? Утром стулья! Нет денег? Приходите когда будут"
И вообще, по отношению к игроку, они нагло косплеят "Операцию Ы"
"Бывалый: (грозно) Сумма?!
Директор базы: Триста!
Балбес: Ха!.. (замолкает)
Бывалый: Это несерьёзно!
Балбес: Не-не-не, так не пойдет!
Трус: Вы нас не знаете, и мы вас не знаем.
Балбес: Ищи дурачков!
Трус: Я на русалках больше заработаю!
Бывалый: Пошли, пошли!
Трус: Курам на смех!
Балбес: Подумаешь, триста!
Директор базы: Стойте! Ваши условия.
Балбес: Триста тридцать!
Директор базы: (быстро) Согласен.
Бывалый: Каждому!
Директор базы (поморщившись): Согласен. С Богом."

А как же физическое насилие над нечистью? Рукой хлоп по попке и тот полетел вкалывать ( :) и сделал невинное личико, смотреть с 04:10)

DK (Youtube)

Кстати, из успешных подобных кейсов рекомпиляции старых игр можно назвать проект JJFFE - пересборка для новых компьютеров третьей части элиты Frontier First Encounters.

Много лет назад познакомился с 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
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации