Разработка и ромхакинг > Ромхакинг
Smd IDA Tools - Sega Mega Drive reversing helpers
<< < (14/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
Беларус учит русский:

--- Цитата: DrMefistO от 17 Февраль 2025, 13:05:29 ---это могут быть даже не функции, а просто куски кода где-то посреди данных
--- Конец цитаты ---
Потому что Генс посылает указатель текущей инструкции только в паузе, а не постоянно, да? Тогда, если он оказался посередине функции, то Ида не сможет его создать. Зато сможет найти все последующие.


--- Цитата: DrMefistO от 17 Февраль 2025, 13:05:29 ---Новые функции проще всего ловить не так, как ты описал, а вот так:
--- Конец цитаты ---
Ага, кучей действий и в сторонних программах вместо того, чтобы просто иногда ставить Иду на паузу и набрать несколько букв, чтобы потом видеть все эти новые функции в списке и легко сортировать по имени-метке :lol:


--- Цитата: DrMefistO от 17 Февраль 2025, 13:05:29 ---лучше таки вручную помечать всё, что нужно
--- Конец цитаты ---
Конечно, всегда таким образом не получится и придётся вручную. Просто это начальные ориентировки были бы.
DrMefistO:
> Генс посылает указатель текущей инструкции только в паузе, а не постоянно, да?
Во время работы эмулятора набирается карта выполненных инструкций. Когда происходит пауза, карта передаётся, да. Всё время пересылать карту было бы слишком накладно.

Описанные мной действия - это достаточно быстро, на самом деле. Я подобным образом практически на автомате делаю, тем более, что тоталом пользуюсь всегда.
Беларус учит русский:
Так это Генс составляет карту, а не Ида? :ohmy:
Что происходит с картой при сохранении и загрузке?
DrMefistO:

--- Цитата: perfect_genius от 17 Февраль 2025, 14:33:27 ---Так это Генс составляет карту, а не Ида? :ohmy:
Что происходит с картой при сохранении и загрузке?

--- Конец цитаты ---
Ты не забывай, что в Генс встроена часть плагина, это не обычный генс. Карта применяется к дизазму не только в паузе, но и при завершении эмуляции.
Беларус учит русский:
Не думал брать вместо Генса эмулятор, умеющий отматывать процесс назад? Вот это была бы просто пушка для отладки :)
DrMefistO:
Нет. Перенос отладочных окон и так жопная боль.
Беларус учит русский:
Декомпиляцию в код на Си надо как-то отдельно устанавливать или это недоступно для Сеги?
DrMefistO:
Здрасте захотел))
это тебе тогда к Ghidra.
Беларус учит русский:
Т.е. недоступно именно для Сеги? Ведь у Иды точно есть декомпиляция. Неужели, она только для x86-64 и ARM?
DrMefistO:
Ну почему-же: там есть декомпиляция MIPS ещё, PowerPC, ещё чего-то там. Но да, m68k декомпиляции в ней нет.
Беларус учит русский:
Декомпиляцию определённых архитектур добавляют плагинами или только сами разрабы?
MetalliC:
perfect_genius, плагинами, сами разрабы, и добавляются лишь самые популярные и востребованные архитектуры. вероятность того, что Ильфак родит декомпилятор М680х0 почти равна нулю, если ты конечно не решишь отлистать ему сумму с неприличным количеством нулей ;)

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


--- Цитата: DrMefistO от 12 Февраль 2025, 20:48:15 ---Был один, назвал проект: Gnida (GNU IDA)
--- Конец цитаты ---
:lol: :lol: :lol:
GManiac:
Есть вот такая штука
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 долго выискивать какой-нибудь там "адрес с жизнями" с неизвестной шкалой, или ещё хуже "суб-координаты героя"
* и т.д. и т.п.
Знаю, слишком много вот этих "как-то". Но надеюсь, в не очень далёком будущем оно как-то само будет работать :) Правда, зачем это всё нужно.... :)
DrMefistO:
Насчёт исполнения кода в RAM - его там исполняют, потому что быстрее, и потому что только так можно сжатый код из рома исполнить.
GManiac:
Я видел тупо копирование несжатого кода в играх Flicky и Battletoads. А насколько быстрее? Ну уж в примитивном Flicky скопипастить целый банк кода в память для быстрого выполнения - это странно.
Где описаны тайминги физического доступа к памяти или рому и в каком эмуляторе это учитывается? (Я давно не слежу за темой, поэтому не знаю).
DrMefistO:

--- Цитата: GManiac от 02 Март 2025, 11:33:52 ---Я видел тупо копирование несжатого кода в играх Flicky и Battletoads. А насколько быстрее? Ну уж в примитивном Flicky скопипастить целый банк кода в память для быстрого выполнения - это странно.
Где описаны тайминги физического доступа к памяти или рому и в каком эмуляторе это учитывается? (Я давно не слежу за темой, поэтому не знаю).


--- Конец цитаты ---
Как оказалось, это не основная причина. Основная - возможность модить код на лету. Типа в jsr подставить другой адрес.
GManiac:
Насколько я помню, во Flicky я вырезал копирование в RAM, чтобы всё выполнялось из ROM и Code Logger залогировал ROM-адреса. И игра работала как прежде. Не припоминаю там динамический код.
Ты Augment посмотрел? Полезно?
DrMefistO:

--- Цитата: GManiac от 02 Март 2025, 15:16:53 ---Насколько я помню, во Flicky я вырезал копирование в RAM, чтобы всё выполнялось из ROM и Code Logger залогировал ROM-адреса. И игра работала как прежде. Не припоминаю там динамический код.
Ты Augment посмотрел? Полезно?

--- Конец цитаты ---
Я на самом деле не любитель AI-штук. Предпочитаю по-старинке.
Беларус учит русский:
GManiac, похоже, ты описал инструмент, о котором реверсы-моддеры мечтают десятилетиями :)
Но никто не делает такое, так как слишком сложно-долго и профит близок к нулю (а для изучения вирусов и прошивок выглядит избыточно). Если бы в реверсе крутились деньги, то такое давно бы появилось, поэтому да, надежда только на нейросети.
Ближе всего к такому подошёл MESEN. Но развивается он долго, поэтому я тоже решил делать подобный инструмент. Хочу легко создавать масштабные моды к играм, а без воссоздания их кода это очень муторно и ограниченно.

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


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


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

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