Автор Тема: Smd IDA Tools - Sega Mega Drive reversing helpers  (Прочитано 24900 раз)

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

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1319
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« : 08 Февраль 2015, 21:16:43 »
Собственно, проект по написанию крутых специфичных плагинов в помощь ромхакерам SMD.

Включает:
 - ROM loader - загрузчик, позволяющий грузить ромы сеги в IDA Pro. Благодарности HardwareMan'у за основу;
 - Z80 sound drivers loader - позволяет загружать звуковые драйвера для Sega в IDA Pro. Автоматически именуются порты и создаются сегменты;
 - Z80 sound drivers debugger - позволяет отлаживать звуковые драйвера в IDA Pro;
 - Gensida debugger - дебагер-плагин который позволяет дебажить ромы Sega Genesis / Mega Drive);
 - Smd Constants identifier - при нажатии на J на константе, отправляемой в какой-либо командный регистр, в комментарий выведется инфа о том, что данное число значит, какие флаги устанавливает;
 - ASM Fixer - помогает при экспортировании листинга из IDA, и приведении его к ассемблируемому виду.
 - Генерация компилируемого ассемблерного листинга для AS/VASM/ASM68K прямо из коробки.

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

Исходники проекта и скомпиленые плагины здесь: https://github.com/lab313ru/smd_ida_tools2/releases
« Последнее редактирование: 26 Январь 2023, 03:03:14 от DrMefistO »

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1237
    • ВКонтакте
    • Steam
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #270 : 21 Февраль 2025, 03:08:07 »
Декомпиляцию определённых архитектур добавляют плагинами или только сами разрабы?

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9402
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #271 : 21 Февраль 2025, 03:22:42 »
perfect_genius, плагинами, сами разрабы, и добавляются лишь самые популярные и востребованные архитектуры. вероятность того, что Ильфак родит декомпилятор М680х0 почти равна нулю, если ты конечно не решишь отлистать ему сумму с неприличным количеством нулей ;)

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

Был один, назвал проект: Gnida (GNU IDA)
:lol: :lol: :lol:
« Последнее редактирование: 21 Февраль 2025, 03:37:58 от MetalliC »

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #272 : 02 Март 2025, 02:21:59 »
Есть вот такая штука
https://marketplace.visualstudio.com/items?itemName=augment.vscode-augment
Индексирует кодовую базу и даёт по ней мгновенные ответы. Естественно, в первую очередь он опирается на комментарии и имена функций, т.е. обфусцированный код он вряд ли понять сможет.
Я для примера загрузил дизасм Соника 1 с гитхаба, этот плагин мне с ходу предложил рассказать о разнице в ревизиях, структуре карт уровней и т.д.
Я его спросил, где лежит графика спрайтов, в т.ч. сжатых, он мне сразу назвал папки. Правда, написать распаковщик на Питоне не смог - получилась жуткая ерунда. Видимо, всё-таки надо подсовывать эмулятор CPU и тупо выполнять ассемблерный код распаковщика.
Потом спросил, как изменить высоту прыжка Соника, он мне сразу сказал, где высота прыжка "на земле" и "под водой" - это константы после строки locret_1348E в файле Sonic Jump. Это при чём, что эти параметры НЕ прокомментированы! Т.е. плагин сам догадался. Я поменял "высоту прыжка" и действительно, высота в игре изменилась.
Потом спросил, как сделать, чтобы при столкновении с врагами ничего не происходило. Он подсказал, что надо смотреть в React_Enemy и сделать прыжок на .donthurtsonic, но враги уничтожались. Я даже глазами в код дальше не посмотрел, там реально дальше написана проверка obColProp и уничтожение врага. По obColProp он и тут мне подсказал, что это здоровье врага. Сказал ему, что враги уничтожаются, а я хочу просто проходить сквозь них, он сказал просто сразу выходить из ветки React_Enemy - да, заработало.
Ну и так далее.

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

Ещё в 2008-м, когда я выкладывал на форумах свой дизасм (он работал очень быстро, в отличие от Никодимовского (кто-то ещё помнит его?)), сказали, что круто - это ИДА, и у неё есть анализатор кода, я тогда за недельку написал анализатор, который искал ВЕСЬ код, включая неиспользуемый. Поиск делался методом от противного: цепочка опкодов, которая НЕ приводит к явной ошибке, а например, заканчивается условным прыжком, потенциально может быть валидным кодом. Благо, в m68k очень много ограничений на валидные опкоды (включая требование к чётным адресам) и метод от противного хорошо работает. Я этот анализатор не публиковал нигде. Если надо, могу дать. Да хоть в сыром виде, лень щас причёсывать. Там была сложность в анализе субрутин, которые подменяют точку возврата после субрутина на стеке. Например, часто вызываемые TRAP в Landstalker. Там было так:
TRAP #$4
dc.w $xx
CODE
Т.е. сразу после TRAP идёт 2 байта данных, а выполняться будет CODE, потому что субрутина шаманит со стеком.

Реверс-инжиниринг должен быть комплексным и риалтайм, т.е. играем в игру и на автомате логируем всё в огромную базу данных:
  • логируем всю последовательность выполняющихся команд со значениями регистров и связанных адресов памяти. Так мы будем знать, откуда был переход на текущую инструкции и при каких условиях. Факт выполнения команды на адресе - это одно, а то, КАК мы на эту команду попали и с каким контекстом - совсем другое. С данными то же самое: смотря КАКОЙ КОД их читает. Если игра проверяет чексумму и сканирует весь ром, это же не значит теперь, что весь ром - это данные.
  • есть сложности с тем, что часто игры любят писать код в RAM и выполняться там, без всякого смысла
  • логируем сейвы каждую секунду для перемотки в любой кадр
  • ведём форки прохождения, как в системе контроля версий
  • т.к. лог будет быстро распухать, то надо автоматически определять сильно повторяющиеся блоки, такие, как ожидание шин, VDP и т.д.
  • как-то понимать, какой контекст реально даёт разницу для кода или вызываемой процедуры, а какой нет, чтобы база не распухала
  • можно как-то придумать, как определять, что это процедура распаковки чего-нибудь, где таблица адресов распаковываемых блоков (удобный пример - ВСЕ мелкие спрайты в Shining Force 2), ну и понимаем, что больше логировать эту процедуру не надо
  • логируем в базу видеопамять, взаимосвязи между суб-спрайтами (это в случае больших комбинированных спрайтов, как в Mortal Kombat), автоматически извлекаем спрайты. Учитываем, какой контент реально был показан на экране, а какой просто висел.
  • lineage данных - т.е. откуда что распаковывалось из рома и куда в видеопамять залилось и в какой спрайт попало
  • тайминги анимации
  • взаимосвязь звуков с действиями
  • пример анализа: редкие тайлы "уши Микки Мауса в уровнях Аладдина" в задниках
  • интегрировать эмулятор с IDE, хоть с тем же VS Code, и в ней интерактивную консоль Python / js / Julia / Mojo / что угодно, с полной интеграцией с эмулем и модулями (чипы, например), чтобы на ходу всё дело программировать. Подгрузил нужный модуль / плагин / чужую наработку для анализа
  • условный пример: хочешь узнать, где лежит в РОМе спрайт, тыкнул мышкой, нашёл в видеопамяти, отмотал кадры назад через сейв, нашёл, где данные лежали в RAM, ещё назад, нашли, откуда и как данные распаковывались, и всё это на автомате, конечно
  • Работу звукового движка, последовательность FM-"алгоритмов" - это если на низком уровне
  • Нормальные watch, в т.ч. вычисляемые и динамические
  • И не надо руками в Cheat Engine долго выискивать какой-нибудь там "адрес с жизнями" с неизвестной шкалой, или ещё хуже "суб-координаты героя"
  • и т.д. и т.п.

Знаю, слишком много вот этих "как-то". Но надеюсь, в не очень далёком будущем оно как-то само будет работать :) Правда, зачем это всё нужно.... :)
« Последнее редактирование: 02 Март 2025, 10:03:30 от GManiac »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1319
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #273 : 02 Март 2025, 08:57:16 »
Насчёт исполнения кода в RAM - его там исполняют, потому что быстрее, и потому что только так можно сжатый код из рома исполнить.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #274 : 02 Март 2025, 11:33:52 »
Я видел тупо копирование несжатого кода в играх Flicky и Battletoads. А насколько быстрее? Ну уж в примитивном Flicky скопипастить целый банк кода в память для быстрого выполнения - это странно.
Где описаны тайминги физического доступа к памяти или рому и в каком эмуляторе это учитывается? (Я давно не слежу за темой, поэтому не знаю).

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1319
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #275 : 02 Март 2025, 11:43:12 »
Я видел тупо копирование несжатого кода в играх Flicky и Battletoads. А насколько быстрее? Ну уж в примитивном Flicky скопипастить целый банк кода в память для быстрого выполнения - это странно.
Где описаны тайминги физического доступа к памяти или рому и в каком эмуляторе это учитывается? (Я давно не слежу за темой, поэтому не знаю).

Как оказалось, это не основная причина. Основная - возможность модить код на лету. Типа в jsr подставить другой адрес.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #276 : 02 Март 2025, 15:16:53 »
Насколько я помню, во Flicky я вырезал копирование в RAM, чтобы всё выполнялось из ROM и Code Logger залогировал ROM-адреса. И игра работала как прежде. Не припоминаю там динамический код.
Ты Augment посмотрел? Полезно?

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1319
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #277 : 02 Март 2025, 16:38:39 »
Насколько я помню, во Flicky я вырезал копирование в RAM, чтобы всё выполнялось из ROM и Code Logger залогировал ROM-адреса. И игра работала как прежде. Не припоминаю там динамический код.
Ты Augment посмотрел? Полезно?
Я на самом деле не любитель AI-штук. Предпочитаю по-старинке.

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1237
    • ВКонтакте
    • Steam
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #278 : 02 Март 2025, 22:42:36 »
GManiac, похоже, ты описал инструмент, о котором реверсы-моддеры мечтают десятилетиями :)
Но никто не делает такое, так как слишком сложно-долго и профит близок к нулю (а для изучения вирусов и прошивок выглядит избыточно). Если бы в реверсе крутились деньги, то такое давно бы появилось, поэтому да, надежда только на нейросети.
Ближе всего к такому подошёл MESEN. Но развивается он долго, поэтому я тоже решил делать подобный инструмент. Хочу легко создавать масштабные моды к играм, а без воссоздания их кода это очень муторно и ограниченно.

Про помощь нейросетей реверсерам упоминали вот тут.

Цитата
сложность в анализе субрутин, которые подменяют точку возврата после субрутина на стеке
Это ведь явно признак того, что игра писалась на ассемблере? На Си такого не сделать же?

Цитата
часто игры любят писать код в RAM и выполняться там
Впервые читаю про исполнение кода из памяти на Сеге, офигеть :ohmy:
Получается, мой Ром Глитчер может не работать на таких играх, так как меняет код в роме, а не памяти :)

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1319
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #279 : 02 Март 2025, 22:48:34 »
Вообще, прежде чем скопировать код в рам, он же был в роме)

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1237
    • ВКонтакте
    • Steam
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #280 : 02 Март 2025, 22:58:44 »
Да, но:
-ты упомянул, что код может быть сжатым, а значит Глитчер его не увидит
-"глитчхакер" может грузить сохранение момента игры, когда код уже исполняется из памяти

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #281 : 03 Март 2025, 01:25:45 »
Это ведь явно признак того, что игра писалась на ассемблере? На Си такого не сделать же?
На чём писали Landstalker, я не знаю. Могли писать на Си + асм или inline асм. Или сишные макросы, не знаю, можно ли так делать.

Сжатый или даже просто динамический код я на Сеге не видел, но сильно не изучал этот вопрос. Зачем сжимать код, если РОМ достаточно большой, доля кода в роме обычно 10%, а оперативки как раз не очень много. А лишняя возни. Лучше данные сжимать.

Имхо, надо переходить на модульные и открытые решения, интерактивные языки, interoperability / межпроцессное взаимодействие, специализированные продукты под разные нужды вроде баз данных. Сегодня ПК достаточно мощные, тем более, интерактивные языки нужны только для отладки, а не всей эмуляции. Кстати, в Visual Studio есть интерактивный режим C#, но куцый, а ещё перекомпиляция методов на лету в отладочном режиме.
Условно, VS Code + node.js / Javascript / IPython + терминалы + QT/TK + база данных + переписанный эмулятор со всеми нужными хуками, ну либо уже специально написанный под это дело, но это долго (но может, ИИ сам перепишет с C++ на Питон? :) ) Хотя переделывать тоже сложно. Под каждую из старых консолей сегодня есть с десяток эмуляторов, в каждом по паре тысяч файлов и под 100-300 тысяч строк сишного кода, ковыряться в этом ну то ещё занятие. А так на данный момент мы имеем emulator-lock: в каждом эмуляторе авторы слепили свой отладчик, свои окна, свой функционал, вот пользуйся тем, что есть. И везде, блин, надо кликать мышкой. Никакой автоматизации. Хочешь что-то своё - ковыряй ИХ эмулятор в ИХ языке и доделывай ЕГО. Ну максимум плагин могут позволить написать. С ИХ интерфейсом.

VS Code я сам не люблю, но других альтернатив не знаю.
Javascript и Python медленные, у них свои приколы, но они гибкие. В Питоне есть разные костыли для быстрого кода.
Julia интерактивно компилируемая, но весьма деревянная и совсем не такая удобная и быстрая, как может показаться, и это вообще не типичный язык программирования. Это смесь из парадигм / научные расчёты / Fortran-стиль / математические символы / ещё хрен пойми что. Это язык не для программистов.
Mojo уже 3-й год как в разработке, куча "сахара" для низкого уровня, не такой гибкий, как Python. Но зато супер-быстрый. Можно из него вызывать Питон, а наоборот - нет, увы. Под винду не сделали. Собрать библиотеку нельзя. У авторов своё видение вектора развития.
Про Lua не скажу.
Для базы данных: SQlite / DuckDB / Clickhouse / NoSQL (графы для анализа, вектора для эмбеддингов) / wide-column (?)

IDA - это громоздкая закрытая программа, и по-моему изначально сделана для другого. Много лет назад читал интервью Ильфака, он сказал, что там 300 тысяч строк сишного кода. Сегодня ещё больше, наверно. Я не спорю, это м.б. мощный инструмент в умелых руках и для конкретных дел, но мне она не нравится. И доработки сложные. Посчитайте сами. Эта тема появилась 10 лет назад. Плагин gensida - 10 тысяч строк, внутри Генса вижу 2 файла ida* - ещё пара тысяч, ещё лоадеры - пара тысяч, и ещё я наверно что-то не учёл. Сколько времени уйдёт у человека, который не сишник, мало знаком с ИДОй, не знает досконально архитектуру приставки, не знаком с написанием плагинов для ИДЫ и исходниками Генса? Несколько месяцев упорного труда? Год? И всё это всего лишь, чтобы скрестить эти 2 программы.
Что в ней есть такого для отладки Сеговских игр? Прямой анализатор кода? Это 20 строчек на Питоне, если уже реализована функции is_valid_opcode и parse_opcode, а их можно взять в модульном дизассемблере / отладчике / эмуляторе. Анализатор от противного, что делал я? Ну, 50 строчек. Редактирование текста? Ну. Граф условных переходов внутри субрутины? Я всегда путаюсь, как понимать все эти BCC, BCS и т.д. Можно сделать простейший декомпилятор, которые перепишет всё на нормальные if, и граф не нужен. На худой конец ИИ это может сделать. Граф зависимостей всех субрутин? Когда их тысяча, это не работает, получается жуткая каша.
Сколько времени занял дизасм одного Соника? В начале 2000-х один чувак по несколько месяцев, что ли, тратил на каждую часть, что-то покомментил, потом коммьюнити допиливало. До сих пор допиливают. Результат: пара мегабайт исходник Соника 1, десятки тысяч строк кода на асме с комментами плюс куча вставок. Если хочешь сделать "масштабный мод", сиди в этом тоже ковыряйся.

Чтобы быстро делать "масштабные моды", надо уходить от концепции делать хак игры для нативной платформы. Я вижу такие варианты:
- переделывать всё в родном асме + м.б. вставки скомпилирванного Си, но целевая платформа - всё равно нативная. В нашем случае, Сега. Очень долго, сложно, нужен аккуратный дизасм и аккуратные вставки, чтобы не сломать фиксированные адреса, упираемся в ограничения железа, но можно запускать на железе / железном эмуляторе / обычном эмуляторе.
- рекомпилить всю игру на ЯВУ (язык высокого уровня) и моддить уже её. Очень много сложностей, сделать автоматически почти нереально на сегодня. Плюс в эту полученную программу надо по сути включить всё поведение эмулятора.
- гибрид ближе к нативному исполнению. Незатронутый машинный код выполняется нативно в эмуляторе, моднутый код выполняется в "расширенном режиме" на произвольном языке. Надо сильно переделывать эмуляторы.
- гибрид ближе к ЯВУ. Весь код выполняется на ЯВУ, но оригинальные ассемблерные инструкции эмулируются. Хочешь написать ЯВУ-шный код - пожалуйста. Гибридный код может выглядеть так
# эмуляция ассемблерной команды add.l (A0)+, D0
# здесь на входе, конечно же, не сама строка, а либо двоичные данные,
# либо уже распарсенные детали инструкции
run_asm( "add.l (A0)+, D0" )
# высокоуровневый код
unpacked_sprite = unzip( packed_sprite )
« Последнее редактирование: 03 Март 2025, 01:39:12 от GManiac »

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9402
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #282 : 03 Март 2025, 02:35:40 »
Если бы в реверсе крутились деньги, то такое давно бы появилось, поэтому да, надежда только на нейросети.
было бы желание, вон глянь чего для х360 родили
https://github.com/hedge-dev/XenonRecomp

На чём писали Landstalker, я не знаю. Могли писать на Си + асм или inline асм.
обычно это хорошо заметно - если везде строгие calling conventions при вызове функций, прологи и эпилоги, локальные переменные на стеке - значит явно С-шный код был в оригинале.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #283 : 03 Март 2025, 03:07:09 »
MetalliC, сначала хотел спросить "а где деньги", но видимо, ты как раз имел в виду, что денег там нет. Желание, м.б., и есть, но всех денег не заработаешь все проекты не сделаешь.
Цитата
везде строгие calling conventions при вызове функций, прологи и эпилоги, локальные переменные на стеке - значит явно С-шный код был в оригинале.
Сишный оптимизатор (был) настолько плох, что не съедает/не съедал это всё? Насколько больше получается эквиалентный код, скомпилированный с C?

В дизасме Landstalker не вижу особо переменных через стек, вижу, наоборот, огромные таблицы прыжков и мешанину асмовых команд. Стандартная картина.
Строка "gap" - это всё то, что мой анализатор посчитал данными и пропустил. Можно увидеть много вызовов TRAP 0 и пропуск 2 байтов после неё.
Вот наткнулся, очень "сишно" :lol: Хотя если это считать как return bool, то сойдёт.
...
_001AE1EA: 003C 0001                ORI       #$0001,CCR
_001AE1EE: 4E75                     RTS       
_001AE1F0: 4A00                     TST.B     D0
_001AE1F2: 4E75                     RTS       


Если бы игру писали на Си, то необязательно же он везде он должен быть. Часть на сях, часть на асме. Но я признаков Сей не увидел.
Есть примеры игр, для которых достоверно известно, на чём они были написаны?
« Последнее редактирование: 03 Март 2025, 03:28:45 от GManiac »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1319
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #284 : 03 Март 2025, 06:35:25 »
Сжатый код я видел: у тех же Codemasters в Fantastic Dizzy.
Насчёт дизазма Соника: всё равно он делал это в идке. Оттуда экспорт я сделал нормальный в ассемблерные листинги под разные ассемблеры.

Добавлено позже:
А вообще прорвало деда (GManiac), видимо) столько текста написал))

Для меня процесс реверса - это отдых, я так чилю, считай медитирую. У меня обычно нет цели при этом сделать модхак, модкак и т.д.

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8131
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #285 : 03 Март 2025, 08:41:02 »
Я встречал сжатый код на PS1 и Сатурне, но это было очень редко. По мне, так это лишние заморочки (тем более, что код плохо сжимается). А вот динамически подменять значения в внутри кода, находящегося в оперативке - это неплохой вариант (хотя и костыль по сути).

Оффлайн Werton

  • Пользователь
  • Сообщений: 892
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Re: Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #286 : 03 Март 2025, 11:38:32 »
Есть примеры игр, для которых достоверно известно, на чём они были написаны?
Не раз слышал, что Dune 2 для smd написана на Си, но так ли это хз :)

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9402
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #287 : 03 Март 2025, 15:16:04 »
Сишный оптимизатор (был) настолько плох, что не съедает/не съедал это всё?
да, в начале 90х всё было довольно печально. более-менее хорошо с оптимизацией компиляторов С стало где-то к концу 2000х, а с С++ может даже и к середине 2010х годов.

Есть примеры игр, для которых достоверно известно, на чём они были написаны?
те игры исходники которых утекали в сеть. из того что я видел в период 80х - ранних 90х почти сплошной асм.

Не раз слышал, что Dune 2 для smd написана на Си, но так ли это хз
на первый взгляд больше похоже на рукописный асм, но там может быть и микс.

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1237
    • ВКонтакте
    • Steam
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #288 : 03 Март 2025, 16:37:22 »
на данный момент мы имеем emulator-lock: в каждом эмуляторе авторы слепили свой отладчик, свои окна, свой функционал
Так и возникает желание сделать свой РетроАрк, чтобы на все консоли были все эти функции - отладка, HD-паки, TAS...


Чтобы быстро делать "масштабные моды", надо уходить от концепции делать хак игры для нативной платформы.
Кстати, я хочу делать масштабные моды для ПК-игр, а не для Сеги. Но полный реверс UMK3 я точно сделаю, а на нём отработаю подходы и инструменты для любых платформ.
Насчёт сложности дизасма на примере Соника я чёт приуныл сейчас. Ещё глянул дизасм Квакшота от DrMefistO и удивился, что он разобрал только сжатия и... всё? Т.е. "просто" сделал код перемещаемым? Ожидал, что он там чуть ли не каждую строчку описал, а оно вон как :) Значит, действительно сложно и муторно.


Цитата: perfect_genius
Если бы в реверсе крутились деньги, то такое давно бы появилось, поэтому да, надежда только на нейросети.
было бы желание, вон глянь чего для х360 родили
Очень круто, но ты подтвердил мои слова - инструмент появился только вчера, а не десятилетия назад. Я сейчас пробую делать подобное для Сеги - новый Ром Глитчер будет заменять инструкции непрямых прыжков на прямой прыжок в конец рома, где они будут собираться в список. Может, так получится собрать их все, пройтись по всему доступному коду и сделать код перемещаемым.

прорвало деда (GManiac), видимо) столько текста написал))
Ага, около твоего последнего серьёзного инструмента реверса Сеги, как у костра, собрались последние реверсеры старой платформы. Вряд ли следующее поколение будет интересоваться этим, но зато сможем передать им опыт реверса для их игр на x64, ARM и RISC-V, если заглянут к нам на огонёк ^_^

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

Werton, а через хекс-редактор в X-Men 2 - Clone Wars (UE) [!] видны CAMERA, ACTOR, memcpy, memset :debile:
Похоже, в игре осталась отладочная информация с Си-кода.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #289 : 03 Март 2025, 18:06:44 »
Выложу пока бинарники своего дизассемблера и анализатора, исходники попозже. (Дизасм уже был на форуме). Анализатор - версия для Landstalker, которая учитывает TRAP 0. НЕ-команды он заменяет байтами 0xFFFF, т.е. Invalid инструкцией. Анализатор выплёвывает бинарник с вырезанными данными, дальше делаем дизасм, а программа gaps выкидывает все Invalid. Тупо, но работает.
Батник с примером использования внтури. Аргумент батника - имя рома в кавычках. Писалось в 2008, поэтому просьба не придираться.

Помню, я разбирал так пачкой весь старый ромсет, чтобы найти самые жирные по коду игры. (Вырезал последовательности байтов FF, чтобы урезать файл). Были весьма неожиданные открытия. Если интересно, могу размеры скинуть. Самые жирные одиночные - это серия Fifa Soccer и Triple Play, Sonic & Knuckles, длинные РПГ, Contra, X-Men 2. И почему-то где в топе примитивный Punisher.
На 1061 ром - 120 МБ инструкций, или 30-40 млн строк. А затем я это всё сжимал в непрерывный архив, чтобы проверить, сколько кода переиспользуется. Например, думал так популярные распаковщики искать. Получился архив 41 МБ против 49 МБ (прерывный), но там не учитываются повторяющиеся игры (серия Mortal Kombat, Sonic, одинаковые игры в ромсете под разными названиями). Я убирал такие повторы, оставалось 875 игр и размеры архивов 7z: 32 / 35 МБ. Т.е. порядка 8% кода m68k таки переиспользуется, скорей всего, системного.
Ещё думал искать гомологичный код, т.е. такой, где операнды или адреса не учитываются. Например, последовательность
ADDI.W #16, D0
MOVE.L $40(A6), D1
BSR $20
в одной игре и такая же в другой могут быть частью одного и того же кода, но просто с немного разными операндами. Соответственно, операнды просто заменяешь на все нули или все единичные биты и получаешь "обезличенный код". Там тоже разную степень обезличивания можно использовать. Сжатие непрерывным архивом получалось сильнее, правда, выводы из этого тяжело делать, в таком "коде" не разберёшься.

Кстати, если кусок дизасма засунуть в Grok 3, он умеет относительно неплохо его комментить. Даже адреса шин и VDP знает. Другие не умеют.

Здесь
https://forums.nesdev.org/viewtopic.php?t=12330
говорят, что на Си были написаны Ecco, The Lion King and Sonic Spinball.
Не заметил в Sonic Spinball передачи параметров через стек, но отметил много PEA. И вспомнил, что Electronic Arts очень любила делать тормознутые игры с кучей LINK/UNLK. Ниже табличка с общим числом строк и команд PEA, LINK, UNLK в 16 играх. Можно сделать вывод.

Команды
grep _ -c *.asm2
grep PEA -c *.asm2
grep LINK -c *.asm2
grep UNLK -c *.asm2

Количество команд в дизасмах (скопировать в Excel)

Собственно, требовательные игры вроде Contra, Gunstar Heroes или Sonic & Knuckles, похоже, написаны на голом асме.
Fifa Soccer, Lion King, Rings of Power, X-Men 2, Sonic Spinball и м.б. какие-то Ecco, похоже, точно написаны на сях. У некоторых игр особенно много кода при относительной примитивности движка.
Dune - встречаются LINK и PEA местами, так что мог быть Си.
Immortal - тормознутая, но LINK-ов нету.
Punisher - странно, игра тупая, кода много, а LINK-ов нету. Upd: глянул глазами. Судя по обилию повторяющегося говнокода и неоптимальной адресации вроде RAM:$00FF824C вместо RAM:$824C она всё-таки написана на Си.
Zero Tolerance - там много повторяющеся кода для рендера текстур под разным углом.

В дизасме X-Men 2 150к строк кода :) На глаз почти все строки определны правильно. Вывод выше про язык Си объясняет, почему так много. Но там, где были слова memcpy и memset, что-то я не вижу похожего по смыслу кода.

Ладно, здесь обсуждение ИДЫ, буду закругляться  :D
« Последнее редактирование: 03 Март 2025, 22:05:40 от GManiac »

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1237
    • ВКонтакте
    • Steam
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #290 : 04 Март 2025, 00:09:40 »
Лучше придумай название своему дизассемблеру и создай отдельную тему, этот последний коммент весь даже можешь скопировать туда.
Или свои исследования уже выкладывал на Эмуленде?

А про Гидру и МЕСЕН ничего не писал - не пользовался?

Другие не умеют.
DeepSeek тоже?

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #291 : 04 Март 2025, 00:37:27 »
Гидрой и МЕСЕН не пользовался.
DeepSeek щас попробовал, засунул в него тоже 1000 первых строк Landstalker, он пытается что-то комментить, но сильно избирательно.
Я давно не реверсю и не играю, изредка могу что-нить включить. А написал я сюда, потому что был впечатлён Аугментом, и решил заодно всё остальное высказать ("деда прорвало"). Пока что бесполезно пытаться скормить весь асм какой-то сетке: он не влезет из-за контекста, а инференса надо ждать очень долго, и доверия ему мало. Отдельные субрутины засовывать тоже мало смысла, т.к. без контекста их вызова и данных даже человек не сможет понять их смысл. Да даже если охватить весь код, без понимания данных, с которыми он работает, не получится его разобрать.
Можно использовать Аугмент в режиме "объясни мне вот этот код или перепиши на ЯВУ для лучшего понимания человеком", и он за счёт индекса сделает это лучше. (Я так немного поковырял модуль дизасма 68k в BizHawk, вполне сносно, но это человеческий код на C# всё-таки). А ты уже документируешь, в ИДЕ или ещё где. Делать это лучше прямо в дебаг сессии, естественно. Пример с Соником 1 я уже давал.
Т.к. интеграции Аугмента сейчас нету, можно попробовать сделать так:
1. Черновой анализ с отладчиком, ИДОй и моим анализатором / моим алгоритмом анализа, чтобы сразу увидеть весь код и можно было разбить проект на сегменты или файлы, по коду и данным. А не лепить один огромный .asm на 20 МБ.
2. Выгружаем проект ИДЫ во много раздельных файлов .asm и .bin
3. Открываем папку в Аугменте, выясняем нужные вопросы, комментим код сами или автоматом с ним.
4. Правим проект в ИДЕ и т.д. Либо придумать способ импортировать текстовик обратно в ИДУ. Тут м.б. надо плагин написать.
5. Повторяем с п. 2.

Буржуев подключите.

Если ты хочешь UMK3 разобрать, чё мелочиться, бери сразу аркаду :)
« Последнее редактирование: 04 Март 2025, 01:26:51 от GManiac »

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1237
    • ВКонтакте
    • Steam
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #292 : 05 Март 2025, 16:39:12 »
Если ты хочешь UMK3 разобрать, чё мелочиться, бери сразу аркаду
Оттуда буду брать графику, но и основной код тоже хотелось бы посмотреть. Видел сравнение версий, и сеговская получше аркадной, так как много чего изменено в лучшую сторону и поправлены баги.
Сейчас у меня путь: MK3 -> UMK3 -> аркадные версии.

DrMefistO, я реверсю игру и вношу изменения в ром. В Генсе достаточно перезапустить, а в Иде как-то возможно обновить ром на изменённый? Каждый раз начинать новый проект надоело.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1319
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Smd IDA Tools - Sega Mega Drive reversing helpers
« Ответ #293 : 05 Март 2025, 16:45:07 »
DrMefistO, я реверсю игру и вношу изменения в ром. В Генсе достаточно перезапустить, а в Иде как-то возможно обновить ром на изменённый? Каждый раз начинать новый проект надоело.
Если ты смещаешь код или данные, то простой патч не прокатит. А если просто байты заменить, то через `Edit->Patch`, должно примениться.