Current time: 24.03.2024, 09:38 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Стандартизированная база героев 3
Author Message
void_17 Offline

Posts: 28
Post: #1
Кирпич 
Приветствую коммьюнити мододелов! Представляю вашему вниманию свою базу данных героев, содержащую скромное количество оригинальных сигнатур. Суть в том, чтобы восстановить остальные неизведанные сигнатуры игры, применяя знания STL C++, общие наблюдения о работе игры и, собственно, источник сигнатур - базу данных RoE Dreamcast. К сожалению, IDA не имеет встроенного декомпилятора для SH-4(RISC-процессора Sega Dreamcast), поэтому приходится анализировать только ассемблерный листинг. Ghidra имеет декомпилятор SH-4, но он очень кривой.

Image: Screenshot-functions.png
Image: Screenshot-pseudocode.png
Image: Screenshot-types.png

Ссылки для скачивания:
SoD-База by Void_17: https://drive.google.com/file/d/1MY28K8c...sp=sharing
RoE-Dreamcast-база: https://drive.google.com/file/d/1rAWaKjz...sp=sharing

ТЕХНИЧЕСКИЕ ОСОБЕННОСТИ ОРИГИНАЛЬНОЙ ПК-ВЕРСИИ ГЕРОЕВ МЕЧА И МАГИИ 3:
Как продолжить восстановление сигнатур и типов?
Я применяю примерно следующие тактики:
1. Захожу в область интересующего класса
2. Нахожу "пробелы" ввиде неизученных методов/функций
3. Смотрю где они применяются
4. Сравниваю функцию по внутреннему устройству с функцией в дримкаст базе по ассемблерному листингу. Зачастую, вызовы функций идут по порядку. БУДЬТЕ ПРЕДЕЛЬНО ВНИМАТЕЛЬНЫ СО ВСТРОЕННЫМИ ФУНКЦИЯМИ!
5. Называю относительно базы Dreamcast. (Нажимаете на кнопку n и копируете функцию со всеми странными символами(это называется деманглер, позволяет в строке зашифровать сигнатуру функции https://en.wikiversity.org/wiki/Visual_C...e_mangling )
Но это если очень поверхностно, мне честно говоря трудно описать абсолютно все в деталях, я уже как-то интутивно это все делаю.
Сложности:
>STL функции и контейнеры, их методы. Затрудняют изучение засчет загромождения встроенными(inline) функциями.
>Встроенные функции. Основная попаболь всех тех, кто изучает внутреннее устройство программ.
Совет: помечайте повторяющимся комментарием(кнопка ";") и цветом те функции, которые встроены в SoD, но не в RoE-Dreamcast. (я помечал некоторые голубым цветом и комментарием "inline function")
>Dreamcast база -- RoE. А моя база -- ПК-SoD. Но впринципе, это не особо страшно, так как новведения относительно легко заметить.
>Не все функции идут друг за другом так, как в Dreamcast-базе. Есть одна из тактик, при которой можно просто брать сигнатуры из Dreamcast-базы, но нужно быть предельно осторожным, т.к. это не всегда так и там, где, казалось бы, в Dreamcast-базе по порядку идут методы одного класса, в SoD прямо посреди этого "ряда" может быть кусок другого класса.


Остальное распишу потом. Отвечу на все вопросы и дам рекоммендации ИТТ. Надеюсь, что коммьюнити продолжит мое дело по приведению базы игры в порядок и систематизации всего, что известно об игре. Будем сотрудничать. Тред на другом форуме: https://handbookhmm.ru/forum/viewtopic.php?f=56&t=968

Соглашения об именах:

1. Функции
Если вы не знаете, что метод точно принадлежит классу, но пока не до конца знаете, что это за сигнатура(или ее вообще нет в Dreamcast), следует переименовать функцию по следующему шаблону: имякласса_адрес
пример: combatManager_46A150
Если вы узнали, что эта сигнатура есть и функция с данной сигнатурой совпадает или почти полностью совпадает с функцией в Dreamcast-базе, скопируйте сигнатуру из Dreamcast-базы вместо имени этой функции. Если функция была добавлена в AB/SoD, отразите это перед именем метода.
Пример: combatManager::SOD_is_in_fear

2. Поля структур/классов:
Называть поля согласно CamelCase.
Пример: SoundFileName.
Неизвестные поля называть field_смещение или f_смещение
Неиспользуемые поля называть unused_смещение или u_смещение

3. Аргументы функций и локальные переменные:
Аргументы функций называть с заглавной буквы(искл.: this)
Локальные переменны со строчной. Желательно избегать snake_case.

4. Глобальные переменные
Приставка g — global, перед каждой глобальной переменной,
после нее p — pointer, если переменная является указателем или первая буква в названии типа, если НЕ указатель и НЕ целый класс/структура. Например глобальная int-переменная будет giVar
(This post was last modified: 21.11.2021 18:10 by void_17.)
21.11.2021 18:08
Find all posts by this user Quote this message in a reply
void_17 Offline

Posts: 28
Post: #2

Прошу обратить внимание, что сигнатуры шифруются с помощью манглера Visual Studio. https://en.m.wikiversity.org/wiki/Visual...e_mangling
На стадии компиляции, если включен debug-режим(что и сделали по ошибке программисты NWC при выпуске DreamCast версии героев 3), сигнатуры функций сохраняются в памяти программы и их можно использовать для изучения работы программы.

Например:
Code:
abc<def<int>,void*>::xyz
манглер превратит и представит ввиде
Code:
xyz@?$abc@V?$def@H@@PAX@@

Но сохраненных в памяти SoD сигнатур нет, поэтому приходится вручную сравнивать и копировать имена из Dreamcast версии, что позволяет ну, во-первых, видеть более красивые функции, а также изучать и называть неизведанные функции, которые в воговской базе вообще имели вид sub_адрес.
(This post was last modified: 21.11.2021 18:22 by void_17.)
21.11.2021 18:20
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4333
Post: #3

void_17, приветствую новое лицо на нашем форуме!

Огромное спасибо за вклад и желание помочь любимому [мне] комьюнитиYes

Знаю по ida и дизассемблированию не так много, потому спрашиваю, есть ли возможность смержить твою базу сигнатур с уже имеющейся на форуме базой из этого поста?

UPD: какая версия IDA необходима для открытия данного файла? 7-ой явно не хватает


Image: widget.png?style=banner2

Новейший Heroes 3 Launcher
21.11.2021 19:15
Visit this user's website Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #4

Без комментариев. 132


Создал новый глобальный мод: WoG Ultra Edition
21.11.2021 19:32
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #5

Кто-нибудь может выгрузить имена с адресами функций в текстовый вид? Ибо эту базу невозможно открыть из Windows 2003. Moral У меня старая от WoG Team, с именами функций от Сава, хотелось бы постепенно дополнить её и оригинальными именами.

(21.11.2021 18:08)void_17 Wrote:  Код игры можно разделить на две большие части:
Интерфейс и Игровая Логика.

Вообще-то там 140 частей, по количеству *.cpp файлов с сишным кодом.


(21.11.2021 18:20)void_17 Wrote:  что и сделали по ошибке программисты NWC при выпуске DreamCast версии героев 3

Программисты из NWC не имеют к этому отношения. Портом занимались непосредственно подрядчики из Юбисофт (а чужой код обычно не ценят и не редко допускают утечки).
21.11.2021 19:33
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #6

void_17, большое спасибо за базы. 7-ая ИДА не открыла.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
21.11.2021 23:20
Find all posts by this user Quote this message in a reply
void_17 Offline

Posts: 28
Post: #7

Если быть точнее, это версия 7.6.

Извиняюсь. Просто только в версиях 7.х IDA поддерживает инструкции SH-4. Еще там стоит парочку плагинов для удобства, поэтому сижу на новейшей версии.

(21.11.2021 19:33)XEPOMAHT Wrote:  Кто-нибудь может выгрузить имена с адресами функций в текстовый вид? Ибо эту базу невозможно открыть из Windows 2003. Moral У меня старая от WoG Team, с именами функций от Сава, хотелось бы постепенно дополнить её и оригинальными именами.

Блин, я даже предположить не мог, что в наше время используют такую версию Windows. Вроде был где-то скрипт для импорта и экспорта имен. Если таковой имеется, отправлю вам.
(This post was last modified: 22.11.2021 00:21 by void_17.)
22.11.2021 00:08
Find all posts by this user Quote this message in a reply
void_17 Offline

Posts: 28
Post: #8

(21.11.2021 19:15)daemon_n Wrote:  Знаю по ida и дизассемблированию не так много, потому спрашиваю, есть ли возможность смержить твою базу сигнатур с уже имеющейся на форуме базой из этого поста?


Если я не ошибаюсь, это — та самая база, на которой я основывался. Дойдут руки, сделаю соответствующий список типов по шаблону:
оригинальное название — воговская база;

Но учтите, что я еще не все типы изучил и переименовал. К тому же, в моей базе есть типы, которых нет в воговской; также поудалил "мусорные" типы в воговской. Основные продвижения есть в области ИИ и нетолько. Надеюсь мне в этом деле кто-то поможет.
(This post was last modified: 22.11.2021 00:19 by void_17.)
22.11.2021 00:16
Find all posts by this user Quote this message in a reply
Bes Offline

Posts: 5422
Post: #9

void_17, стало любопытно, раз ты так глубоко, не побоюсь этого слова, копнул игру, то значит была тому причина, а не простое любопытство? 116
над чем работал/работаешь по части моддинга Героев3 ?Unsure


Image: team-supermod.gif
23.11.2021 23:21
Visit this user's website Find all posts by this user Quote this message in a reply
void_17 Offline

Posts: 28
Post: #10

(23.11.2021 23:21)Bes Wrote:  void_17, стало любопытно, раз ты так глубоко, не побоюсь этого слова, копнул игру, то значит была тому причина, а не простое любопытство? 116
над чем работал/работаешь по части моддинга Героев3 ?Unsure

Извините, что отвечаю через неделю, я просто на другом форуме активничаю.

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

Хотя, все же давно, год так назад, хотел сделать мод Heroes 3 Cup of Titan.
Там были бы новые кампании, баланс и прочее, но особо много нововведений не было бы. По-сути, это был бы "соревновательный" SoD.

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


IDA-База HOMM 3 Discord Server
(This post was last modified: 28.11.2021 14:56 by void_17.)
28.11.2021 14:52
Find all posts by this user Quote this message in a reply
Elmore Online

Posts: 586
Post: #11

Если есть желание и/или необходимость, можем создать отдельный канал в дискорде ERA (ссылка в подписи).


Image: widget.png?style=banner2
28.11.2021 17:45
Find all posts by this user Quote this message in a reply
void_17 Offline

Posts: 28
Post: #12

У меня уже свой есть.
https://discord.gg/BrbwGNFYgP


IDA-База HOMM 3 Discord Server
28.11.2021 18:29
Find all posts by this user Quote this message in a reply
void_17 Offline

Posts: 28
Post: #13

Ковырял разные версии героев. Оказывается, все это время у нас под носом лежала андроид версия HD edition с дебажными символами.
Image: Screen1.png

Image: Screen-2.png

dotemu это разработчики Heroes 3 HD edition если что.

Весь кайф в том, что IDA умеет декомпилировать little endian ARM. Из недостатков пожалуй отличие от оригинальных структур и классов и еще огромное количество встроенных функций, прямо как в SoD, поэтому дримкаст все еще актуален, так как меньше всего подвергся оптимизации.

Качайте и смотрите сами: https://drive.google.com/file/d/1zA5cjRc...sp=sharing


IDA-База HOMM 3 Discord Server
16.12.2021 17:37
Find all posts by this user Quote this message in a reply
void_17 Offline

Posts: 28
Post: #14

https://drive.google.com/file/d/1MY28K8c...sp=sharing

Обновил базу до версии BETA 2.0
Перевел на новый экзешник и добавил типов, которых не было. Разобрано много типов, которые не были разобраны в старой базы или были разобраны не до конца. Надеюсь на помощь коммьюнити на улучшение базы, в первую очередь восстановление типов.


IDA-База HOMM 3 Discord Server
23.01.2022 12:21
Find all posts by this user Quote this message in a reply
pobr Offline

Posts: 4
Post: #15

(23.01.2022 12:21)void_17 Wrote:  Обновил базу до версии BETA 2.0

CSequence это массив указателей:

Code:
struct CSequence
{
  int numFrames;
  int allocatedFrames;
  CSpriteFrame **f;
};
23.01.2022 15:10
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group