Как понять расширение файла по hex

Обновлено: 07.07.2024

Всем привет. Совсем недавно я столкнулся с проблемой: по необьяснимым причинам карта памяти начала забрасывать все файлы в папку LOST.DIR без расширений. За долгое время там накопилось более 500 файлов разного типа: картинки, видео, аудио, документы. Самостоятельно понять формат файла было невозможным, по этому я стал искать способ решения этой проблемы программным путем.

Поиск решений

Мне не хотелось использовать готовые решения в виде веб-сервисов или программ, по этому появилась мысль написать консольную утилиту, которая бы прошлась по всем файлам и устанавливала расширения автоматически. Для написания утилиты был выбран Python. Поиск подходящих модулей и библиотек так и не принес результатов по нескольким причинам:

  1. Отсутствие поддержки со стороны разработчика
  2. Излишний функционал
  3. Отсутствие поддержки новых версий Python'a
  4. Излишняя усложненность кода

Из множества библиотек сильно выделялась python-magic (почти 1000 звезд на ГитХабе), которая является оберткой библиотеки libmagic. Но использование ее под Windows невозможно без DLL для Unix'овой библиотеки. Меня такой вариант не устроил.

Решение задачи

Исходя из вышеперечисленного, я решил не использовать сторонние библиотеки и модули и решить проблему без них. После недолгого поиска информации о том, как реализовать данную задачу, единственным верным способом оказался определение формата по сигнатуре файла.

Сигнатура файла представляет собой набор байтов, обеспечивающий определение формата файла. Сигнатура имеет следующий вид в шестнадцатеричной системе счисления:

К счастью, в интернете есть два хороший сайта, на которых размещены множество сигнатур разных форматов. Целью стали самые распространенные форматы.
Как оказалось, некоторые сигнатуры подходят под разные форматы файлов, как, например, сигнатура файлов Microsoft Office. Исходя из этого, в некоторых случаях надо будет возвращать список подходящих расширений файла.

Также нередко сигнатуры имеют смещение от начала файла, например, файлы мультимедийного контейнера 3GP.

1. Составление списка данных

В виде списка данных решено использовать JSON файл, с объектом 'data', значением которого будет массив объектов следующего вида:

Где:
format — формат файла;
offset — смещение сигнатуры от начала файла;
signature — массив подходящих сигнатур под указанный формат файла.

2. Написание утилиты

Импортируем необходимые модули:

Считываем список данных:

Отлично, список данных загружен. Теперь мы считываем файл в виде байтов. Мы будем считывать лишь первые 32 байта, так как для определения распространенных форматов больше не требуется, а полное считывание большого файла будет занимать много времени.

Если вывести переменную file, то мы увидим что-то похожее на это:

Теперь считанные байты надо перевести в шестнадцатеричную систему:

Далее мы создаем список, в который будут добавляться подходящие форматы:

А теперь самое интересное: создаем конструкцию, которая будет циклично определять формат файла, пока не пройдется по всем возможным форматам в списке данных:

Относительно данной строки:

Поскольку наши байты представлены в виде строки, и за байт отвечает два символа, мы умножаем смещение на 2 и добавляем количество пробелов между "байтами".
И едиственное что нам осталось, это вывести список подходящих форматов, который представлен переменной out.

Заключение

Как оказалось, различные проектов сталкиваются с необходимостью распознавания формата файла, по этому я решил выпустить мое решение в open-source в виде модуля для Python'a под названием fleep (ссылка на страницу GitHub). Вы уже сейчас можете установить модуль с помощью стандартной python'овской утилиты pip:

Также на GitHub странице проекта есть примеры использования и полный список поддерживаемых форматов файлов.

К ак известно любая информация будь то текст, изображение или видео, по сути, является ничем иным как набором двоичного кода — последовательности нулей и единиц. Именно в таком виде на жёстком диске хранятся данные. Понятие двоичный код едва ли не абстрактное, это не запись в привычном понимании этого слова, двоичный или машинный код это скорее состояние микроскопических ячеек на магнитной поверхности жесткого диска. Положительный заряд такой ячейки имеет знак плюс или 1, отрицательный — минус или 0.

Логически объединенные последовательности нулей и единиц как раз и составляют то, что мы называем файлами. Но ведь мы знаем и то, что типов файлов очень много. Есть текстовые файлы, мультимедийные, архивные, системные, исполняемые и так далее. Каким же образом операционная система определяет как читать или обрабатывать тот или иной файл? Прикладные программы распознают тип файла по его расширению — набору символов следующих после имени файла и отделенных от него точкой.

Но что будет, если расширение удалить? Всё правильно, операционная система не сможет открыть такой файл, так как не будет знать какую программу для этого использовать. Однако ни логическая структура, ни содержимое переименованного файла от этого не изменится. Вы и сами в этом можете убедиться удалив расширение какого-нибудь файла, а затем попробовав его открыть соответствующей программой. Уверены, с этим у вас проблем не возникнет.

Следовательно, вовсе не расширение определяет тип файла. Тогда что же? Тип файла определяет его формат или иначе спецификация структуры данных. Расширение и формат очень часто путают, хотя на деле это совершенно разные понятия. Тут возникает вполне закономерный вопрос, а как определить формат файла, если его расширение по какой-то причине оказалось утрачено? Оказывается очень просто.

Грубо говоря, все файлы состоят из двух частей. Первая часть это заголовок, содержащий различную метаинформацию включая те данные, которые позволяют прикладным программам этот самый файл идентифицировать. Вторая часть это «тело» файла. Отвечающая за определение типа файла часть заголовка файла именуется дескриптором или описанием. Наиболее распространёнными типами дескрипторов являются HEX и ASCII. Первый тип заголовков можно просмотреть только с помощью специальных утилит — шестнадцатеричных редакторов.

Для просмотра дескрипторов второго типа можно обойтись обычным текстовым редактором, тем же Блокнотом или Notepad++. Однако следует учитывать, что далеко не все последовательности байтов можно перевести в ASCII-код, поэтому для определения формата всё-таки лучше использовать HEX-редакторы. Открытый в HEX-редакторе файл отображается в виде матрицы из последовательности байтов. Каждая ячейка соответствует одному байту. Данные дескриптора содержатся как раз в первых трёх ячейках (реже двух или четырех), расположенных по горизонтали. Представляют они из себя шесть символов в шестнадцатеричном счислении, например 49 44 33 или ff d8 e0.

Открытый в HEX-редакторе файл

Open-file.ru поиск по HEX

С HEX-редакторами всё более или менее понятно, но как мы сказали для определения ASCII-заголовков также можно использовать редакторы текстовые. Принцип здесь тот же самый, открываем файл Блокнотом или Notepad++, копируем первые символы и вставляем их в поисковое поле того же open-file или другого сайта с поддержкой поиска по заголовкам.

Казалось бы всё очень просто, но есть в деле идентификации форматов и свои сложности. Иногда ASCII-заголовки совпадают с расширением файла (RAR и PDF), но может быть и такое, что заголовок оказывается принадлежащим сразу нескольким форматам. Это можно видеть на примере офисного формата DOCX (PK и 50 4b 03 04). В таких случаях точно определить формат проблематично.

ASCII

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

Файл является размеченным текстовым документом

Так, строка [Content_Types].xml в DOCX явно указывает на то, что исследуемый файл является размеченным текстовым документом.

Установив операционную систему, большинство опытных пользователей включают отображение расширения файлов. И правильно делают, ведь благодаря расширению можно легко определить тип файла и подыскать при необходимости для его просмотра подходящую программу. Увы, не все файлы, даже те, которые можно найти на просторах интернета, имеют расширение. С объектами без расширения вы можете столкнуться при поиске и восстановлении удаленных файлов.

А также при разборе прошивок, при декодировании строки из Base64 и тому подобное.

Как быть в этом случае, можно ли как-то определить тип такого объекта?

Можно, хотя это и требует определенных усилий и навыков.

В таких случаях можно воспользоваться специальными утилитами, анализирующими специфические наборы байтов, располагающиеся не в начале файла, как заголовки, а немного ниже. Примером таких наборов байтов служат так называемые magic number, сообщающие UNIX-системам, что файл является исполняемым, впрочем, концепция магических чисел применима не только к исполняемым, но и ко всем бинарным файлам. Соответственно, в операционных системах UNIX для определения типа любого двоичного файла предусмотрена специальная команда file .

Чтобы иметь возможность использовать эту команду в Windows, нужно установить Cygwin — программный пакет, реализующий в Windows Unix-подобную среду и позволяющий выполнять наиболее распространенные команды Linux.

Установив пакет с настройками по умолчанию, запускаем командную строку Cygwin и выполняем команду file "полный путь к файлу без расширения" . Если файлов несколько, команда будет немного иной: file D:/folder/* . Обратите внимание, что во второй команде мы не заключаем путь к содержащей файлы папке folder в прямые кавычки и используем обычные (не обратные) слеши.

Cygwin

Команда file не показывает, собственно, расширение файла, она служит для определения его типа, так, на представленном выше скриншоте можно видеть, что файл 2452323 является текстовым документом с разметкой XML , файл f4ed4f25 — это изображение JPEG , а start — текстовый файл в кодировке UTF-16 Unicode .

Если вы не хотите ставить Cygwin, можете воспользоваться тулзой file-windows — скомпилированными в экзешник файлами линуксовой утилиты file.

Запустите командную строку, перейдите в папку с исполняемым файлом и выполните команду следующего вида file.exe полный путь к файлу без расширения .

CMD File

Или в PowerShell команда будет выглядеть немного иначе: ./file.exe 'полный путь к файлу без расширения' .

PowerShell File

Утилита TrID

В отличии от file, кроссплатформенная утилита TrID позволяет более или менее точно определять расширение файла, благодаря подключаемой к ней базе сигнатур.

Download

Создайте отдельную папку и распакуйте в нее оба скачанных архива.

Откройте Powershell , перейдите в расположение исполняемого файла утилиты и выполните команду ./trid.exe 'полный путь к файлу без расширения' . В результате утилита выведет несколько вариантов с процентным соотношением вероятности соответствия тому или иному расширению.

TrID

Если нужно проанализировать сразу несколько файлов, указываем путь только к содержащему их каталогу, не забывая об подстановочном знаке — звездочке, вот так: ./trid.exe 'Диск:/папка/*' . В случае сканирования сразу нескольких файлов утилита выведет только один вариант расширения — самый вероятный.

TrID File Type

Существуют также и другие подобные TrID утилиты, например, Detect It Easy с удобным графическим интерфейсом.

Формат файла hex, сокращённо от «шестнадцатеричный» или «base-16», является структурой необработанных данных, которой следуют все файлы, хранящиеся на вашем компьютере. Хотя буквально каждый документ хранится в этом формате, найти его на ПК практически невозможно. Хотя далеко не все знают, что возможность напрямую изменять необработанные биты и байты на ПК иногда может быть очень полезна.

Чем и как открыть файл HEX

Что обозначает расширение HEX

Система счисления, которую люди используют для подсчёта, называется десятичной (числа от 0 до 9), и была изобретена персами около 6000 лет назад. В 1950-х или 1960-х годах IBM формализовала шестнадцатеричную систему счисления, которая является коротким способом представления двоичных данных. Вместо использования цифр 0-9, шестнадцатеричное число использует цифры от 0 до F. Достигнув конца числовых «цифр», вы просто увеличиваете число влево на единицу, точно так же, как вы делаете это с системой счёта десятичных чисел.

Файлы с расширением HEX имеют те же свойства, что и двоичные. Все байты размещаются один за другим. Информация об адресе или контрольные суммы не добавляются. Единственная разница с двоичным форматом такова, что каждый байт преобразуется в 2 символа ASCII в диапазоне 0-9 и A-F, представляющие 2 шестнадцатеричные цифры. Эти символы сгруппированы по строкам. Номер пары в строке обычно может варьироваться от 1 до 255, где наиболее общей длиной являются 16 или 32 пары. Каждая строка заканчивается парой CR (ASCII-значение $ 0D) или CRLF (ASCII). Для работы с такими документами требуется специальная программа-редактор хекс-файлов. Она в удобном виде выведет всю информацию и позволит достаточно комфортно её воспринимать и изменять.

Что такое HEX-файл

Как открыть файл HEX

Далеко не все являются программистами, и иногда открыть файл с расширением HEX может понадобиться обычному человеку, чтобы посмотреть в нём некую информацию. На самом деле для такой простой задачи вполне достаточно обычного Блокнота – стандартного приложения, которое имеется в любой системе Windows. Ведь этот файл, по сути, является текстовым, просто в нём записана специфическая информация, но обычными символами.

Так выглядит HEX-файл, открытый в Notepad++. В стандартном Блокноте так же, но без цвета.

Так выглядит HEX-файл, открытый в Notepad++. В стандартном Блокноте так же, но без цвета.

А теперь рассмотрим более подробно, для чего может понадобиться открывать, а тем более изменять файлы с шестнадцатеричным содержимым. Кстати, если вы собираетесь делать это часто, то лучше скачайте и установите специальный HEX-редактор – их в Интернете довольно много. Некоторые из них подробнее рассматриваются далее.

Взлом игр и файлов

Популярная причина, по которой вы можете использовать шестнадацтеричный редактор, – взлом игр. Вы можете загрузить документ сохранения игры и изменить сумму денег, например, от 1000 до 1000000 долларов. В более поздних играх всё сделано намного сложнее. Многие современные игры используют либо сжатие, либо шифрование, что во много раз затрудняет декомпиляцию состояния сохранения или игры. Тем не менее, некоторые игры по-прежнему позволяют редактировать определённые переменные, например, Sonic Spinball. В дополнение к просмотру файлов игры, из сохранённого файла иногда можно извлечь другую важную информацию, к которой у вас иначе не было бы доступа. Это сильно зависит от типа файла и того, какую информацию вы ищете, но использование шестнадцатеричного редактора полезно для определения того, что именно находится в документе.

Отладка и редактирование

Наконец, еще одна популярная причина, по которой вы можете использовать шестнадцатеричный редактор, – это если вы программист, и вам нужно отладить код. Вместо того, чтобы возвращаться к перекомпиляции кода, для проверки шаблона может потребоваться простое шестнадцатеричное редактирование. Но для начала обязательно убедитесь, что у вас есть резервная копия, прежде чем изменять какие-либо файлы с помощью шестнадцатеричного редактора.

Какие hex-редакторы использовать

HxD – это бесплатный шестнадцатеричный редактор, который может открывать и изменять компьютерный код. Это очень мощная утилита в правильных руках, которая может проверять, сравнивать и диагностировать файлы, диски, образы дисков, память и журналы, а также исправлять ошибки и восстанавливать структуру диска.

HxD

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

DeltaHex Editor

Один из лучших hex-редакторов на основе библиотеки deltahex. Используйте действие «Открыть как шестнадцатеричный» в главном меню «Файл» или в контекстном меню файлов проекта.

  • Отображение данных в виде шестнадцатеричного кода, предварительный просмотр текста.
  • «Вставить» и «Перезаписать» режимы редактирования.
  • Поддержка выбора и буфера обмена.
  • Отмена/повтор.
  • Выбор кодировки.
  • Отображение непечатных символов.
  • Коды также могут быть двоичными, восьмеричными или десятичными.
  • Поиск текстового/шестнадцатеричного кода с соответствующей подсветкой.
  • Дельта-режим – изменения сохраняются только в памяти до сохранения.
  • Поддержка огромных файлов.

DeltaHex Editor

Free Hex Editor Neo

Free Hex Editor Neo – это самый быстрый бесплатный редактор двоичных файлов для платформы Windows. Алгоритмы обработки данных Neo Hex Editor чрезвычайно оптимизированы и тщательно настроены для обработки операций с большими файлами.

  • Неограниченное Undo/Redo.
  • Редактировать, Копировать, Вырезать, Вставить, Удалить, Заполнить, Импорт/Экспорт, Вставить шаблон/файл, Изменить размер файла, Смещение к началу, Изменить биты.
  • Поиск и замена шаблонов.
  • Подсветка.
  • Байты, слова, двойные слова, группировка четырёх слов.
  • Шестнадцатеричное, Десятичное, Восьмеричное, Двоичное и т.д. представление данных.
  • Изменение атрибутов файла.
  • Анализ данных буфера обмена.
  • Создание бинарных патчей, поиск/замена регулярных выражений.
  • Многоязычный интерфейс.

Free Hex Editor Neo

Функции и возможности утилиты:

Hex Editor Neo предоставляет базовые, расширенные и даже инновационные функции. Шестнадцатеричное редактирование теперь доступно каждому начинающему пользователю!

PSPad

PSPad

XVI32

XVI32 также очень способный шестнадцатеричный редактор. Как и в PSPad, вы можете редактировать шестнадцатеричные значения напрямую или через отображение символов. В нём также есть несколько расширенных инструментов редактирования шестнадцатеричных кодов, таких как калькулятор адресов для проверки смещений и других специфичных для шестнадцатеричных данных параметров, которые могут помочь вам обойти шестнадцатеричный документ. Если вы, конечно, знаете, что делаете.

Знание того, как работает ваш ПК, становится всё более и более важным, поскольку техника становится всё проще и проще в использовании. Если у вас остались вопросы относительно редактирования шестнадцатеричных файлов, оставьте комментарий под этой статьёй.

Читайте также: