Цитата(Pavel_Blend @ 15.02.2018, 22:52)
И вообще, как бардак узнавал про форматы?
Как в анекдоте есть 3 путя:
1) Наличие исходников, дальше найти нужный участок кода и тупо скопипастить.
2) Дизасм кода как отметил
Neo][ и курение асмы или перегон в псевдокод СИ и курение его, дальше только воссоздать алгоритм.
3) Курить формат хэксом, строить предположения и проверять их.
По поводу 3го варианта, как это обычно происходит:
- ясен пень что все будет выглядеть как куча байтов.
- мы знаем что чаще всего быйты были получены из конкретных типов. К примеру int =4 байта.
- включаем внимательность и немного работаем калькулятором, глаз цепляется за последовательности int int int, делаем предположение что это может быть координата вершины
- отсюда вытекает закономерный вопрос а сколько их там будет подряд? Значит гдето перед ними или в самом начал\конце файла будет число которое это укажет
- пробуем на глаз определить конец этих последовательностей(лучше конечно посчитать сколько раз подряд идут int).
- к примеру на предыдущем шаге мы получили число 100, пробуем предположить что это x y z вершин, делим 100\3 =33.3, не подходит т.к. число должно быть целым, предполагаем что это x y z d значит 100/4 = 25 уже лучше, запомним это число т.к. будем искать его упоминание. Так же можно на всякий случай предположить что мы ошиблись и тип short а значит всего 2 байта т.е. 100/2 = 50 вершин x y. Возможно это и другой тип данных. К слову на этом этапе проще всего попытаться представить числа на бумаге если думаешь что это координаты.
- ищем эти числа перед последовательностьй, вначале\конце файла. Предположим что нашли.
- проверяем полученное на другом файле, если число координат скажем перед началом последовательностей совпало то УРА, мы нашли где лежат вершины.
- дальше по схожему алгоритму ищем предположительно другие последовательности (нормали, текстурные координаты, текстурную развертку и много друго что может там оказаться)
- постепенно неизвестных последовательностей и байтов стало намного меньше и получилось нечто такое "int неизвестно, int число вершин последовательность_вершин, char[] название_анимации последовательность_кадров_анимации".
- зная это уже можем писать конвертер.
* Из сложностей:
1) типов данных может быть много
2) не факт что они идут последовательно
3) байты бывают little и big endian
4) данные могут быть шифрованы\сжаты начиная от чего то стандартного типа zlib и заканчивая чем то своим и сложным
5) данные могут быть не полные, когда смещения начала\конца\числа последовательности хранятся гдето отдельно или захардкожены в программе
6) не всегда известно что ожидать внутри файла, к примеру зная что это точно модель то можно точно сказать что в файле точно есть как минимум координаты вершин.
7) внутри может быть целая структура из структур
8) возможно что то забыл.
Что удобнее 2 или 3й вариант, ну ОТЦЫ знают асму и си и естественно отлично представляют структуры и на глаз переводя ричность\битность а значит разберут формат раз в 5 быстрее чем лохи только с 3м вариантом. При этом может быть и обратный эффект, если библиотек\ехе много и они обфусцированы и защищены то на декомпиляция от интереса уйдет намного больше времени чем чистый 3й вариант. Тоже относится и к 1му варианту, в зависимости от глубины кода по проге может оказаться что скопипастить не получится а в лучшем случае удасться узнать какието мелкие моменты которые проще забрать, или же наоборот окажется проще не разбираться с кодом а наткнуться на нечто типа dump\unpack\extract и останется всеголишь его вызвать.