Коротка ремарка по вмісту файлів в зазначеному форматі: файл має складну вкладену структуру, кожен елемент даних називається атомом. Більш детальну інформацію можна знайти за посиланням, тут залишу лише пояснювальну картинку:
Продовжимо. Після банального видалення файлів втрачається найважливіше – інформація про розташування фрагментів (кластерний ланцюжок) файлів. Відразу уточнюю – ситуація, про яку я розповідаю, вірна для файлової системи FAT32. Для NTFS або ExFAT ситуація може бути іншою. У випадку з FAT32 і видаленими фрагментованими файлами існує всього два методи їх відновлення:
- Пошук і аналіз на носії безпосередньо відеопотоку і відтворення для нього необхідних службових метаданих, та
- Аналіз службових метаданих відеофайлів та збирання фрагментів вручну за знайденими зачіпками.
Однак, вивчивши в HEX-редакторі кілька прикладів відеофайлу з піддослідної камери, був придуманий алгоритм збірки «фрагментів» за маркерами з вмісту файлу. Для вирішення завдання необхідно повністю проаналізувати приклад файлу, зрозуміти які атоми використовуються, яку інформацію з них ми можемо використовувати для прив’язки, і як потім, знаходячи вміст цих атомів на носії, з’єднати знайдені фрагменти в єдине ціле. Для розуміння первинної структури використовуємо MP4 Explorer:
Структура стандартна. Атом mvhd з часом створення файлу виявився для нас дуже важливим – за часом створення можна пов’язати знайдений на диску фрагмент з атомами trak з початком файлу, фрагментом ftyp. Глянемо на початок файлу в HEX вигляді:
По ходу написання інструменту визначаємо алгоритми валідації цілісності знайдених фрагментів, як виявилося – це реально. Знайшлись заголовки файлів і секції mdat з медіапотоком:
Після цього обробляємо масив знайдених даних, аналізуємо ті атоми, які можемо, і навіть перевіряємо на нефрагментованість знайдені контейнери.
Непогано, частина метаданих знайшлася єдиним фрагментом, але є й фрагментовані. З ними будемо розбиратися пізніше. Далі пов’язуємо знайдені фрагменти з метаданими з відповідними їм атомами mdat і зберігаємо отримані відеофайли, попутно перевіряючи їх вміст окремою функцією-валідатором структури атомів:
Перевіримо відновлені файли:
Все програється! Ура, але ще залишилося близько 20% невідновлених файлів, метадані яких виявилися фрагментовані. Пишемо для них окремий складальник, який зв’яже знайдені фрагменти початку і середини метаданих, спираючись на дату створення файлу:
У підсумку програма зібрала нам ще частину робочих файлів.
На даному етапі залишилося всього 25 фрагментів з метаданими, які не вдалося зібрати в цілісні файли. Зберігаємо всі фрагменти, що залишились, у вигляді окремих файлів, та з’єднуємо ці фрагменти вручну, спираючись на знання про те, що де має лежати всередині файлу. Як виявилося, метадані цих 25 файлів були сильно фрагментовані – від 3 до 5 фрагментів. Однак через кілька годин копіткої роботи всі до єдиного файли вдалося зібрати.
Як результат, ми отримали рівно 244 робочих файлів, що є 100% успішним відновленням (трохи вище в тексті можна побачити кількість знайдених заголовків файлів – їх було 244).
Клієнт залишився дуже задоволений, тому що весілля перезняти вже неможливо …