Назад
Автор ImHex показав, як реверс-інжинірити невідомий формат файлу
SiTech AI Team2 წთ. საკითხავი

Автор ImHex показав, як реверс-інжинірити невідомий формат файлу

Розробник відкритого hex-редактора ImHex опублікував керівництво з реверс-інжинірингу невідомих бінарних форматів на прикладі файлу збереження FEZ. Наприкінці він узагальнює метод для будь-якого невідомого формату.

WerWolv, автор відкритого hex-редактора ImHex, опублікував покрокове керівництво з реверс-інжинірингу невідомого бінарного формату. Приклад — файл збереження гри FEZ 2012 року: від сирих байтів до повного опису мовою Pattern Language. ImHex безкоштовний, з відкритим кодом, працює на будь-якій десктопній системі й доступний у браузері.

Від декомпіляції до потрібної функції

Дані збереження FEZ не стиснуті й не зашифровані, «магічного» підпису в них немає, тож на вигляд файл нічим не впізнати. Гра написана на C#, а отже, інструменти на кшталт JetBrains Rider розкладають бінарники майже до вихідного коду. Найцікавішими виявилися збірки FEZ.exe, FezEngine.dll, Common.dll, ContentSerialization.dll і EasyStorage.dll. Клас PCSaveDevice з EasyStorage формує ім'я файлу з рядка "SaveSlot" та індексу, а його метод Save() заповнює буфер на 40 960 байтів (0xA000): спершу поточний час у форматі Windows FILETIME, далі власне дані, коротші файли добиваються нулями, а більші спричиняють виняток. Далі ланцюжок приводить до SaveFileOperations.Write, де видно всі поля: номер версії, який читач вимагає рівним 6, часові позначки та прапорці New Game Plus. Автор зауважує, що частина використаних ним функцій є лише в Nightly-збірці, і попереджає про спойлери до FEZ.

Побудова pattern-файлу в ImHex

У Pattern Language автор розміщує структуру за зміщенням нуль, додає псевдоніми типів, щоб код нагадував справжню реалізацію, і підключає зі стандартної бібліотеки тип FILETIME, аби час відображався як читабельна дата. Рядки виявилися з префіксом довжини у 7-бітному кодуванні: автор реалізує цикл, який читає байти, доки не зникне біт продовження, і додає атрибути format та transform для показу значення в інтерфейсі. Об'єкти змодельовано як nullable-обгортки з булевим прапорцем перед необов'язковим значенням, списки — як масиви з префіксом кількості, а enum-и переносяться з C# майже без змін. Наприкінці кожен байт файлу, крім вирівнювального заповнення, декодовано, і значення можна переглядати й навіть редагувати прямо з інтерфейсу.

Загальний рецепт

У підсумку автор узагальнює процес: спершу перевірте, чи формат уже відомий — тут допоможуть magic-детекція ImHex і binwalk, а для задокументованих форматів, можливо, вже є парсери. Далі знайдіть код, який читає або створює файл: декомпілюйте інструментом під відповідну мову — Rider для .NET, Ghidra, IDA чи Binary Ninja для нативного коду, Recaf для JVM, — шукаючи виклики файлового введення-виведення або рядки з іменем файлу. Потім визначте будівельні блоки — цілі числа, булеві значення, рядки та структури — і напишіть pattern-файл, який документує й перевіряє знайдене.

Не кожна програма піддається аналізу так легко, як FEZ, визнає автор, але сам підхід незмінний. Повний pattern опубліковано разом із постом, а запитання приймають у Discord-сервері ImHex.

SSiTech

SiTech — веброзробка з підтримкою AI

Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.