Некоторое время назад понадобилось массово определять, в какой версии КОМПАС был создан файл без установки самой программы. Задача возникла при обработке большой базы чертежей и моделей (.cdw, .spw, .frw, .m3d, .a3d), так как для каталога неплохо было бы понимать минимальную версию программы, в которой файл ещё открывается.

В процессе выяснилось, что у КОМПАС-файлов два принципиально разных контейнера, один из них бинарный и для него нет никакого официального описания формата.

С версии 16 файл - обычный ZIP. Внутри лежит текстовый FileInfo (UTF-16, ini-подобный): там есть поля вроде AppVersion / AppFullVersion (KOMPAS-3D V17, 16.1.0.0 и т. п.). Версию можно прочитать напрямую, хотя сам формат надписи может различаться.

До 16-й (и иногда позже, если файл остался в старом контейнере) формат бинарный. Сигнатура - KF, сразу за ней - 4 байта big-endian: код формата, например 0x4E00000C. Официальной таблицы «код -> версия» ASCON не публикует, по крайней мере я не нашел. Выглядит это как-то так:

4B 46 | 4E 00 00 0C → KF + 0x4E00000C → v12 SP1.

Часть соответствий уже была в базе утилиты file (libmagic): сигнатура KF + значение по смещению 2. Этого хватало примерно до линейки 5.x–12.x, но не на весь набор кодов, который встречается в реальных файлах (альтернативные коды одной мажорной версии, 13–15, редкие 5.x и т. д.).

Проверка на реальных данных

Дальше провели эмпирическое исследование на большой выборке файлов - прогнали каталог через пайплайн извлечения метаданных: для каждого файла определили вариант (ZIP-контейнер / бинарный KF) и вытащили либо поля из FileInfo, либо hex-код из заголовка KF. Собрали неизвестные коды и постепенно достраивали карту. Сопоставили коды с косвенными признаками:

  • датами появления файлов в базе и хронологией релизов КОМПАС

  • с картой из libmagic

  • с читаемым FileInfo у соседних файлов той же эпохи

Для подавляющего большинства кодов нашлась правдоподобная соответствующая версия.

Когда я говорю “мы”, конечно же я имею в виду себя и нейросеть.

Работоспособность подхода была протестирована на:

Успешных определений формата около 95%. Таким образом появилась возможность достаточно надежно определять версию КОМПАСа прямо во время загрузки материала.

Утилита

Windows интерфейс утилиты
Windows интерфейс утилиты

Также решил накидать отдельную простенькую утилиту для определения версии - возможно кому-то пригодится. Есть консольная версия для Linux и GUI версия для Windows (поддерживается Windows 10 и новее). Скачать можно здесь, там же будут выходить и новые версии. Возможно в будущем будет добавлена поддержка других CAD файлов, если это будет кому-то нужно. С помощью утилиты можно определить версию отдельного файла или всех файлов в указанной папке. В текущую версию утилиты включён 51 уникальный код бинарного KF-контейнера.

Вот такой опыт реверс-инжиниринга. Естественно, правильность определения версии никак не гарантируется.