Разработка и ромхакинг > Ромхакинг
Smd IDA Tools - Sega Mega Drive reversing helpers
<< < (15/15)
DrMefistO:
Собственно, проект по написанию крутых специфичных плагинов в помощь ромхакерам 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
Беларус учит русский:
Да, но:
-ты упомянул, что код может быть сжатым, а значит Глитчер его не увидит
-"глитчхакер" может грузить сохранение момента игры, когда код уже исполняется из памяти
GManiac:

--- Цитата: perfect_genius от 02 Март 2025, 22:42:36 ---Это ведь явно признак того, что игра писалась на ассемблере? На Си такого не сделать же?

--- Конец цитаты ---
На чём писали 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 )

--- Конец кода ---
MetalliC:

--- Цитата: perfect_genius от 02 Март 2025, 22:42:36 ---Если бы в реверсе крутились деньги, то такое давно бы появилось, поэтому да, надежда только на нейросети.
--- Конец цитаты ---
было бы желание, вон глянь чего для х360 родили
https://github.com/hedge-dev/XenonRecomp


--- Цитата: GManiac от 03 Март 2025, 01:25:45 ---На чём писали Landstalker, я не знаю. Могли писать на Си + асм или inline асм.
--- Конец цитаты ---
обычно это хорошо заметно - если везде строгие calling conventions при вызове функций, прологи и эпилоги, локальные переменные на стеке - значит явно С-шный код был в оригинале.
GManiac:
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       


--- Конец кода ---

Если бы игру писали на Си, то необязательно же он везде он должен быть. Часть на сях, часть на асме. Но я признаков Сей не увидел.
Есть примеры игр, для которых достоверно известно, на чём они были написаны?
DrMefistO:
Сжатый код я видел: у тех же Codemasters в Fantastic Dizzy.
Насчёт дизазма Соника: всё равно он делал это в идке. Оттуда экспорт я сделал нормальный в ассемблерные листинги под разные ассемблеры.

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

Для меня процесс реверса - это отдых, я так чилю, считай медитирую. У меня обычно нет цели при этом сделать модхак, модкак и т.д.
paul_met:
Я встречал сжатый код на PS1 и Сатурне, но это было очень редко. По мне, так это лишние заморочки (тем более, что код плохо сжимается). А вот динамически подменять значения в внутри кода, находящегося в оперативке - это неплохой вариант (хотя и костыль по сути).
Werton:

--- Цитата: GManiac от 03 Март 2025, 03:07:09 ---Есть примеры игр, для которых достоверно известно, на чём они были написаны?

--- Конец цитаты ---
Не раз слышал, что Dune 2 для smd написана на Си, но так ли это хз :)
MetalliC:

--- Цитата: GManiac от 03 Март 2025, 03:07:09 ---Сишный оптимизатор (был) настолько плох, что не съедает/не съедал это всё?
--- Конец цитаты ---
да, в начале 90х всё было довольно печально. более-менее хорошо с оптимизацией компиляторов С стало где-то к концу 2000х, а с С++ может даже и к середине 2010х годов.


--- Цитата: GManiac от 03 Март 2025, 03:07:09 ---Есть примеры игр, для которых достоверно известно, на чём они были написаны?
--- Конец цитаты ---
те игры исходники которых утекали в сеть. из того что я видел в период 80х - ранних 90х почти сплошной асм.


--- Цитата: Werton от 03 Март 2025, 11:38:32 ---Не раз слышал, что Dune 2 для smd написана на Си, но так ли это хз
--- Конец цитаты ---
на первый взгляд больше похоже на рукописный асм, но там может быть и микс.
Беларус учит русский:

--- Цитата: GManiac от 03 Март 2025, 01:25:45 ---на данный момент мы имеем emulator-lock: в каждом эмуляторе авторы слепили свой отладчик, свои окна, свой функционал
--- Конец цитаты ---

--- Цитата: perfect_genius от 16 Январь 2025, 23:30:23 ---Так и возникает желание сделать свой РетроАрк, чтобы на все консоли были все эти функции - отладка, HD-паки, TAS...
--- Конец цитаты ---



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



--- Цитата: perfect_genius ---Если бы в реверсе крутились деньги, то такое давно бы появилось, поэтому да, надежда только на нейросети.
--- Конец цитаты ---

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


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


--- Цитата: DrMefistO от 03 Март 2025, 06:35:25 ---Для меня процесс реверса - это отдых, я так чилю, считай медитирую.
--- Конец цитаты ---
Да, есть такое у меня тоже. Это как разгадывать судоку, японский кроссворд или собирать паззл. Интересно видеть, как устроена любимая игра внутри.
Но появляются идеи как освежить геймплей.

Werton, а через хекс-редактор в X-Men 2 - Clone Wars (UE) [!] видны CAMERA, ACTOR, memcpy, memset :debile:
Похоже, в игре осталась отладочная информация с Си-кода.
GManiac:
Выложу пока бинарники своего дизассемблера и анализатора, исходники попозже. (Дизасм уже был на форуме). Анализатор - версия для 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)

--- Код: ---ROM total_lines PEA LINK UNLK
Contra - Hard Corps (U) [!].gen 107516 67 3 2
Dune - The Battle for Arrakis (U) [!].gen 45697 159 47 48
ECCO - The Tides of Time (U) [!].gen 121597 533 111 107
ECCO Jr. (U) (REV00) [!].gen 46010 168 25 23
ECCO The Dolphin (UE) [!].gen 46450 59 14 79
FIFA Soccer 97 Gold Edition (UE) (M6) [!].gen 159311 3101 893 929
Gunstar Heroes (U) [!].gen 82439 3 0 0
Immortal, The (UE) [!].gen 20788 0 0 0
Landstalker - The Treasures of King Nole (U) [!].gen 38058 2 11 10
Lion King, The (W) [!].gen 49040 4 677 675
Punisher, The (U) [!].gen 91921 0 5 3
Quack Shot Starring Donald Duck (W) (REV00) [!].gen 23512 0 0 0
Rings of Power (UE) [!].gen 59887 1113 364 366
Sonic Spinball (U) [!].gen 49899 3586 86 87
Sonic and Knuckles (W) [!].gen 122893 0 0 0
X-Men 2 - Clone Wars (UE) [!].gen 148550 1501 3063 3072
Zero Tolerance (UE) [!].gen 39225 1 4 2

--- Конец кода ---

Собственно, требовательные игры вроде 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
Беларус учит русский:
Лучше придумай название своему дизассемблеру и создай отдельную тему, этот последний коммент весь даже можешь скопировать туда.
Или свои исследования уже выкладывал на Эмуленде?

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


--- Цитата: GManiac от 03 Март 2025, 18:06:44 ---Другие не умеют.
--- Конец цитаты ---
DeepSeek тоже?
GManiac:
Гидрой и МЕСЕН не пользовался.
DeepSeek щас попробовал, засунул в него тоже 1000 первых строк Landstalker, он пытается что-то комментить, но сильно избирательно.
Я давно не реверсю и не играю, изредка могу что-нить включить. А написал я сюда, потому что был впечатлён Аугментом, и решил заодно всё остальное высказать ("деда прорвало"). Пока что бесполезно пытаться скормить весь асм какой-то сетке: он не влезет из-за контекста, а инференса надо ждать очень долго, и доверия ему мало. Отдельные субрутины засовывать тоже мало смысла, т.к. без контекста их вызова и данных даже человек не сможет понять их смысл. Да даже если охватить весь код, без понимания данных, с которыми он работает, не получится его разобрать.
Можно использовать Аугмент в режиме "объясни мне вот этот код или перепиши на ЯВУ для лучшего понимания человеком", и он за счёт индекса сделает это лучше. (Я так немного поковырял модуль дизасма 68k в BizHawk, вполне сносно, но это человеческий код на C# всё-таки). А ты уже документируешь, в ИДЕ или ещё где. Делать это лучше прямо в дебаг сессии, естественно. Пример с Соником 1 я уже давал.
Т.к. интеграции Аугмента сейчас нету, можно попробовать сделать так:
1. Черновой анализ с отладчиком, ИДОй и моим анализатором / моим алгоритмом анализа, чтобы сразу увидеть весь код и можно было разбить проект на сегменты или файлы, по коду и данным. А не лепить один огромный .asm на 20 МБ.
2. Выгружаем проект ИДЫ во много раздельных файлов .asm и .bin
3. Открываем папку в Аугменте, выясняем нужные вопросы, комментим код сами или автоматом с ним.
4. Правим проект в ИДЕ и т.д. Либо придумать способ импортировать текстовик обратно в ИДУ. Тут м.б. надо плагин написать.
5. Повторяем с п. 2.

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

Если ты хочешь UMK3 разобрать, чё мелочиться, бери сразу аркаду :)
Беларус учит русский:

--- Цитата: GManiac от 04 Март 2025, 00:37:27 ---Если ты хочешь UMK3 разобрать, чё мелочиться, бери сразу аркаду
--- Конец цитаты ---
Оттуда буду брать графику, но и основной код тоже хотелось бы посмотреть. Видел сравнение версий, и сеговская получше аркадной, так как много чего изменено в лучшую сторону и поправлены баги.
Сейчас у меня путь: MK3 -> UMK3 -> аркадные версии.

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

--- Цитата: perfect_genius от 05 Март 2025, 16:39:12 ---DrMefistO, я реверсю игру и вношу изменения в ром. В Генсе достаточно перезапустить, а в Иде как-то возможно обновить ром на изменённый? Каждый раз начинать новый проект надоело.
--- Конец цитаты ---
Если ты смещаешь код или данные, то простой патч не прокатит. А если просто байты заменить, то через `Edit->Patch`, должно примениться.
Беларус учит русский:
Переместил базу в другое место, редактировал её и потом попробовал запустить ром - всё поломалось, указывает в какие-то странные места рома, предлагает там создать инструкцию, начал портить функции. Вернул обратно по адресу, но это не помогло. Можно ли как-то починить?
DrMefistO:
Нет. Я уже писал про это выше
Dragon:

--- Цитата: perfect_genius от 05 Март 2025, 16:39:12 ---Сейчас у меня путь: MK3 -> UMK3 -> аркадные версии.
--- Конец цитаты ---
Вроде есть хаки Сеговской версии, вы какую цель преследует? По аркаде тоже есть великолепный хак Кохра
Беларус учит русский:

--- Цитата: Dragon от 26 Июнь 2025, 06:33:22 ---вы какую цель преследует?
--- Конец цитаты ---
Делаю свой инструмент реверса, сверяясь с Генсидой и разбирая в обоих UMK3. По какой-то странной причине, у неё нет полного реверса и полных исходников, так что служит первым подопытным :)
По игре лучше пиши в личку, на неё у меня несколько идей, типа бродилки на двоих-троих.
Навигация
Главная страница сообщений
Предыдущая страница

Перейти к полной версии