Автор Тема: [SMD] MegaDriveRecomp - статический рекомпилятор  (Прочитано 4196 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Werton

  • Пользователь
  • Сообщений: 1026
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Чел (наш :)) тут в дискорд SGDK залетел и такой приблудой поделился под Sega Genesis - статический рекомпилятор на основе эмулятора SegaCxx. Позволяет получить из бинарника не asm, а с++ код, который после можно собрать под нужную платформу (звуковое и графическое API тоже подменяется на кроссплатформенные). На хабре вот тоже заметка про него https://habr.com/ru/articles/1029360/.

https://github.com/testdriveupgrade/MegaDriveRecomp
« Последнее редактирование: 02 Май 2026, 08:22:02 от Werton »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2881
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
угу... а там мы опять уперлись в дизассемблер, или этот рескомп сам все делает? что-то я верю в такое с трудом :) точнее не верю.

Оффлайн Chaotix

  • Пользователь
  • Сообщений: 1738
  • Пол: Мужской
    • Просмотр профиля
такой приблудой поделился под Sega Genesis - статический рекомпилятор на основе эмуля jgenesis. Позволяет получить из бинарника не asm, а с++ код, который после можно собрать под нужную платформу

И как потом собрать? Cгенерированные func_*.cpp файлы ссылаются на recomp_runtime.h, которого в репозитории нет. Из-за этого полученный код не собирается.

У меня не получилось, короче. В одну сторону, работает. Каким-то чудом скомпилировал эти тулзы, они декомпилировали ром (насколько хорошо, большой вопрос). В output папке не появилось никаких рантаймов и makefile, что бы собрать обратно во что-то рабочее.

Наверное, должны были быть recomp_runtime.h и recomp_runtime.cpp, но их там нет. Либо забыли положить, либо не сделано до конца, либо я что-то делаю не так.
« Последнее редактирование: 02 Май 2026, 08:49:47 от Chaotix »

Оффлайн Беларус

  • Модератор
  • Сообщений: 1471
    • ВКонтакте
    • Steam
    • Просмотр профиля
Непонятный текст там в источнике. Типа берётса ром и разбираетса. А эмулятр причём? :neznayu:

Оффлайн Werton

  • Пользователь
  • Сообщений: 1026
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Непонятный текст там в источнике. Типа берётса ром и разбираетса. А эмулятр причём? :neznayu:
В роме записаны инструкции, в эмуляторе есть декодер и интерпретатор этих инструкций. Как минимум, на сколько я понимаю, можно воспользоваться этим декодером.

Добавлено позже:
И да я там в первом посте немного насвистел (уже исправил), он на основе не jgenesis, а SegaCxx - это малоизвестный эмулятор написанный на cpp тоже от отечественного товарища, но очень сырой и даже с Gens рядом не валялся. А про jgenesis, он писал, что возможно на его основе, напишет уже на Rust другой рекомпилятор. Такая продуктивность наталкивает на мысль, что возможно автор просто балуется с нейронками :lol:
« Последнее редактирование: 02 Май 2026, 08:27:45 от Werton »

Оффлайн Chaotix

  • Пользователь
  • Сообщений: 1738
  • Пол: Мужской
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #5 : 02 Май 2026, 09:13:13 »
Нерабочий нейрослоп, короче.  :) Было бы из-за чего шум поднимать.

Половины файлов нету нужных для сборки, описание мутное. Если оно работает, то только у автора и только с соником. Больше никто не разберётся, в текущем виде.
« Последнее редактирование: 02 Май 2026, 10:03:59 от Chaotix »

Оффлайн Werton

  • Пользователь
  • Сообщений: 1026
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #6 : 02 Май 2026, 13:24:17 »
Было бы из-за чего шум поднимать.
Я всего лишь написал пост, а сделать из этого отдельную тему это уже решение модератора, так что ты давай к нему с этими претензиями :)

Половины файлов нету нужных для сборки, описание мутное. Если оно работает, то только у автора и только с соником. Больше никто не разберётся, в текущем виде.
Ну хз, другому челу с дискорда 10 минут потребовалось, чтобы разобраться и скомпилировать проект.



Добавлено позже:
И как потом собрать? Cгенерированные func_*.cpp файлы ссылаются на recomp_runtime.h, которого в репозитории нет. Из-за этого полученный код не собирается.

У меня не получилось, короче. В одну сторону, работает. Каким-то чудом скомпилировал эти тулзы, они декомпилировали ром (насколько хорошо, большой вопрос). В output папке не появилось никаких рантаймов и makefile, что бы собрать обратно во что-то рабочее.

Наверное, должны были быть recomp_runtime.h и recomp_runtime.cpp, но их там нет. Либо забыли положить, либо не сделано до конца, либо я что-то делаю не так.
А ты про обратную сборку из cpp, пропустил этот пост  :shifty: Я честно хз, я даже саму тулзу не пробовал собрать, оно мне пока вроде и не к чему, но да, пока все сыро и немного на отвали выглядит. Напиши ему ишью в репу пусть чинит, а то понимаешь хайпа навел, а оно нифига не фурычит :lol:
« Последнее редактирование: 02 Май 2026, 13:37:14 от Werton »

Оффлайн Chaotix

  • Пользователь
  • Сообщений: 1738
  • Пол: Мужской
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #7 : 02 Май 2026, 15:06:09 »
А ты про обратную сборку из cpp, пропустил этот пост  :shifty:
Да, я не про саму тулзу.
Стоит заметить, она тоже не собирается без приколов. Там нехватало CMakeLists.txt, как у чела на твоём скрине.

Но, если разгадать эту мумбу-юмбу и собрать вопреки тому, что написано автором в build.md, то получишь код аля ассемблер завёрнутый в C++, который так просто нигде не запустить

Цитата
а сделать из этого отдельную тему это уже решение модератора, так что ты давай к нему с этими претензиями :)

Я больше про Хабр и build.md. Там пафосно написано, что всё просто:
"создаётся код, который можно собрать современным компилятором.
Графика, звук и ввод переподключаются к актуальным API..
"

По факту же, даже на этапе "собери тулзу" будут затыки, нехватает файлов
« Последнее редактирование: 02 Май 2026, 15:25:23 от Chaotix »

Оффлайн SegaMark

  • Пользователь
  • Сообщений: 125
  • Пол: Мужской
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #8 : 03 Май 2026, 07:38:33 »
Где-нибудь можно хоть на одну готовую игру посмотреть, которая запускается, а то как то сомнительно что эта штука вообще работает. Кроме одного скриншота на котором непонятно что изображено, ничего нет.

Добавлено позже:
Непонятный текст там в источнике.
такое чувство что все нейронкой сгенерировано, и исходники и статья


Добавлено позже:
Кто-нибудь знает это случайно не тот же метод которым sonic для android на windows запускают?

Оффлайн Chaotix

  • Пользователь
  • Сообщений: 1738
  • Пол: Мужской
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #9 : 03 Май 2026, 08:13:21 »
Кто-нибудь знает это случайно не тот же метод которым sonic для android на windows запускают?
Маловероятно. Sonic для Android это рекомпилировали движок Retro Engine от Christian Whitehead, насколько я знаю.
Может что-то новое появилось и кроме декомпилов Retro Engine (я давно не следил за темой).
« Последнее редактирование: 03 Май 2026, 08:57:11 от Chaotix »

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #10 : 03 Май 2026, 08:27:37 »
Чел (наш :)) тут в дискорд SGDK залетел и такой приблудой поделился под Sega Genesis - статический рекомпилятор на основе эмулятора SegaCxx. Позволяет получить из бинарника не asm, а с++ код, который после можно собрать под нужную платформу (звуковое и графическое API тоже подменяется на кроссплатформенные). На хабре вот тоже заметка про него https://habr.com/ru/articles/1029360/.

https://github.com/testdriveupgrade/MegaDriveRecomp

Судя по именам формата func_[hex_addr].cpp, нейронка будто разбивает дизасм на подпрограммы и каждую почему-то заносит в отдельный source-файл, после чего переписывает на C++. Проблема в том, что в итоге после компиляции с C++ подпрограмма может получиться гораздо тяжелее, чем была.



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

Оффлайн Chaotix

  • Пользователь
  • Сообщений: 1738
  • Пол: Мужской
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #11 : 03 Май 2026, 09:28:01 »
Судя по именам формата func_[hex_addr].cpp, нейронка будто разбивает дизасм на подпрограммы и каждую почему-то заносит в отдельный source-файл, после чего переписывает на C++.
Что бы по скрину не гадать, то вот код во что оно рекомпилирует:
* zt-recomp-20260503.zip (895.52 КБ - загружено 18 раз.)
* HISTORY_RU.txt (13.12 КБ - загружено 16 раз.)
На примере zero tolerance. Там recomp_runtime.h, попытка восстановить недостающий рантайм нейронкой. В HISTORY_RU.txt лог, с чем пришлось столкнуться и почему ничего не получилось. Точнее, 244 из 256 функций компилируются без ошибок (12 нужно фиксить) и нет эмуляции графического чипа (VDP), звука и контроллера. Автор же этого не положил.

Короче, не поиграем в Zero Tolerance в 60фпс и с ogg музыкой.
Не в этот раз. :)
« Последнее редактирование: 03 Май 2026, 13:07:04 от Chaotix »

Оффлайн Werton

  • Пользователь
  • Сообщений: 1026
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #12 : 03 Май 2026, 16:34:00 »
Судя по именам формата func_[hex_addr].cpp, нейронка будто разбивает дизасм на подпрограммы и каждую почему-то заносит в отдельный source-файл, после чего переписывает на C++. Проблема в том, что в итоге после компиляции с C++ подпрограмма может получиться гораздо тяжелее, чем была.
Нету там никакой нейронки, да и чтобы генерить файлы по шаблону она и не нужна, это сама программа делает, за это отвечает модуль lifter.cpp. Видимо он преобразует распознанные анализатором инструкции в эквивалентный cpp код.
Написал я автору в дискорде про недостающие файлы и дал ссылку на этот тред, может отпишется.

Оффлайн SegaMark

  • Пользователь
  • Сообщений: 125
  • Пол: Мужской
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #13 : 03 Май 2026, 20:27:56 »
нет эмуляции графического чипа (VDP), звука и контроллера.
то есть то что запустился Соник это фейк?
313408-0

Добавлено позже:
Что бы по скрину не гадать, то вот код во что оно рекомпилирует:
Даа я ожидал что будет хотя бы что то похожее что выводиться в C плагинах в дизассемблерных программах типа Ghidra, но тут по суту код ничем не проще чем когда его приходиться дизасмить.

Просьба не размещать с помощью тэга img изображение со стороной более 700 пикселей. ghostdog3
« Последнее редактирование: 03 Май 2026, 22:25:40 от ghostdog3 »

Оффлайн Chaotix

  • Пользователь
  • Сообщений: 1738
  • Пол: Мужской
    • Просмотр профиля
Re: [SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #14 : 03 Май 2026, 21:00:37 »
то есть то что запустился Соник это фейк?
Не обязательно.
Я имел ввиду что, там нету движка, который запускает этот рекомпилированный код. Я добавил туда заглушку.
Но, у автора наверное лежало тут c:\smd_recomp\SegaCxx\output\recomp_runtime.cpp (+recomp_runtime.h), но он не положил на гитхаб. Почему, непонятно.
« Последнее редактирование: 04 Май 2026, 14:35:05 от Chaotix »

Оффлайн Dport

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #15 : 03 Май 2026, 22:49:59 »
Вообще, насчет портирования игр с Сеги на пк необязательна рекомпиляция, взять тот же Sonic & Knuckles Collection, хакеры с Sonic Retro выяснили, то портирование происходило так: исходный код Sonic 3 & Knuckles был переведен из m68k в x86 ассемблер(с помощью автотранслятора), для того чтобы все этого работало в Win 95 была написана оболочка на с++, она отвечала за графику(vdp) и ввод-вывод с пк ну и музыку. Оболочка была декомпилирована и самое интересное, что она не заточена специально под Соника. за сжатие и расжатие графики отвечает именно конвертированный x86 код. Т.Е. в теории, можно использовать 68к -> x86 транслятор, чтобы перевести код дизассемблированной игры и подружить ее с этой оболочкой. Репозиторий с декомпиляцией(хотя правильнее было бы сказать перевод x86 асма в С): (пока не завершена, но с++ оболочка уже декомпилирована) https://git.sr.ht/~benoitren/skccport
« Последнее редактирование: 03 Май 2026, 22:56:35 от Dport »

Оффлайн Про Игрок

  • Пользователь
  • Сообщений: 1912
  • "А ты...знаешь что такое Red Sky Project!?"
    • ВКонтакте
    • Youtube
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #16 : 04 Май 2026, 02:24:53 »
Этой примочкой можно получить код поведения персонажа из игры?

Оффлайн Werton

  • Пользователь
  • Сообщений: 1026
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #17 : 04 Май 2026, 03:03:44 »
Этой примочкой можно получить код поведения персонажа из игры?
В теории да, на практике код не человекочитаемый, ни фига не проще, чем ассемблер читать.

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

Оффлайн Беларус

  • Модератор
  • Сообщений: 1471
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #18 : 04 Май 2026, 12:50:13 »
Ещё вот эти рекомпилятры непонятно чем отличаютса от дизасма Иды и Гидры. Даже нейросеть не смогла обьяснить, как и автр этово на Хабре.
Как можно статически вычислить все условные прыжки, например? Это даже динамически непросто - требуетса пройти все возможные ветки кода.

Оффлайн Werton

  • Пользователь
  • Сообщений: 1026
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #19 : 04 Май 2026, 16:19:02 »
Как можно статически вычислить все условные прыжки, например? Это даже динамически непросто - требуетса пройти все возможные ветки кода.
И в чём сложность пройти все ветки кода, когда как раз всё равно придётся "проходить весь код"? Я понимаю, когда код самоизменяющийся/генерирующийся в ram, это да гораздо сложнее, но вряд ли, кто такое юзал в мегадрайве.

Добавлено позже:
Ещё вот эти рекомпилятры непонятно чем отличаютса от дизасма Иды и Гидры. Даже нейросеть не смогла обьяснить, как и автр этово на Хабре.
Странный вопрос, рекомпилятор по сути это декомпиляция плюс трансляция. Так что ничем она не отличается, а включает ее в себя. Но я не шарю, лучше спросить того, кто шарит за эту тему, кто эмули писал, например MetalliC'a.
« Последнее редактирование: 04 Май 2026, 16:44:08 от Werton »

Оффлайн Беларус

  • Модератор
  • Сообщений: 1471
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #20 : 04 Май 2026, 20:33:12 »
И в чём сложность пройти все ветки кода, когда как раз всё равно придётся "проходить весь код"?
У тебя есть опыт реверса? Как ты автоматически найдёш конец таблицы прыжком switch или вычислиш адрес прыжка, который записываетса в регистр? Или может проходил игру так, штобы эмулятр полностью разметил весь ром (где код, а где данные)? Это же надо применить всё, потыкать в каждый тайник, использовать все приёмы и т.д. И всё равно останетса код, который не доступен - што-то вырезанное, отладочное, всякий мусор...
Если бы можно было пройти код автоматически полностью, то не было бы проблемы в хаках сдвигать код.
Я делаю свой рекомпилятр игр Сеги, и человеку придётса делать в игре всё, штобы покрыть все пути. Програма будет подсказывать типа "холодно-горячо", насколько близок чел к новой ветке кода.

Я бы понял, если бы эти новые рекомпилятры были эмулятрами, которые слиты с игрой, и по мере прохождения код игры заменялся бы на код железа, на котором они запущены. Тогда при первом прохождении много чево тормозило бы, но зато потом уже летало бы.
И всё равно в С++ коде имена магическим образом не появились бы, это смогла бы нейросеть, видя картинку игры.
У меня имена даёт человек.

но вряд ли, кто такое юзал в мегадрайве
И такое есть, хоть и редко. Мефисто и worm с таким сталкивались:
Цитата
Sonic the Hedgehog (1, 2, 3 & Knuckles):
Некоторые элементы движка переписывают инструкции отрисовки в RAM «на лету» для ускорения работы, что формально является модификацией кода перед исполнением.
Fantastic Dizzy:
Использовала сложные системы сжатия данных, где распаковщик мог модифицировать собственные инструкции для анализа сжатых спрайтов.
Игры с использованием нестандартных декомпрессоров (MEGAPACK):
Многие поздние игры, использующие систему сжатия MEGAPACK, применяли bit-packing, который требовал динамической генерации кода распаковки в RAM.

Оффлайн Werton

  • Пользователь
  • Сообщений: 1026
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #21 : 05 Май 2026, 03:23:16 »
И всё равно в С++ коде имена магическим образом не появились бы, это смогла бы нейросеть, видя картинку игры.
У меня имена даёт человек.
Этого никто и не обещал, тут понятное дело нужно будет создавать "словарь" по адресам и вручную обзывать  функции.

У тебя есть опыт реверса?
нет :)

Как ты автоматически найдёш конец таблицы прыжком switch или вычислиш адрес прыжка, который записываетса в регистр? Или может проходил игру так, штобы эмулятр полностью разметил весь ром (где код, а где данные)? Это же надо применить всё, потыкать в каждый тайник, использовать все приёмы и т.д. И всё равно останетса код, который не доступен - што-то вырезанное, отладочное, всякий мусор...
Если бы можно было пройти код автоматически полностью, то не было бы проблемы в хаках сдвигать код.
Я делаю свой рекомпилятр игр Сеги, и человеку придётса делать в игре всё, штобы покрыть все пути. Програма будет подсказывать типа "холодно-горячо", насколько близок чел к новой ветке кода.
Как любит отвечать один форумчанин - а ты гадалок ии спрашивал? :lol:
Но судя из ответа ии, да, ты от части прав, и полная 100% статическая рекомпиляция невозможна, но близкая к этому вполне. Хотя возможно иишка и наврала, они это умеют, а мои полномочия на этом как-бы все :biggrin:

Оффлайн Беларус

  • Модератор
  • Сообщений: 1471
    • ВКонтакте
    • Steam
    • Просмотр профиля
[SMD] MegaDriveRecomp - статический рекомпилятор
« Ответ #22 : 05 Май 2026, 20:09:36 »
Этого никто и не обещал
Да, я перепутал тему с темой тово чела, который хочет получить Си-код от дизасма игры Сеги.

нет  :)
А то я прочитал твой вопрос как "Чё там сложново-то? Ерунда".

ИИшка што-то прям всё в кучу наболтала и всё напирает на то, што распознаютса особенности компилятров, которыми собиралась игра. Да, Ида на это опираетса. Но только вот мы разбираем игры, многие из которых писались на асэмблере. А ещё она не поняла, што мы хотим именно полново охвата кода и 100%-ной надёжности распознавания.