Как определить тип файла по содержимому: сигнатуры, команды и программы

Переименованный файл photo.jpg, который на самом деле оказался исполняемым EXE, — самый частый повод проверять содержимое, а не расширение. Расширение после точки — это просто подпись в имени файла, которую любой может изменить за две секунды. Реальный же тип данных хранится внутри: в первых байтах, структуре заголовков и формате кодирования. Именно поэтому антивирусы, почтовые фильтры и криминалисты смотрят не на имя, а на сигнатуру.

Определить тип файла по содержимому можно несколькими способами: просмотром первых байтов в шестнадцатеричном редакторе, системными утилитами вроде file в Linux, специализированными программами и онлайн-сервисами. Ниже разберём каждый метод, покажем таблицу распространённых сигнатур и объясним, как действовать, когда файл повреждён или зашифрован.

Почему расширение файла не гарантирует его тип

Расширение — это соглашение, а не техническая характеристика. Операционная система использует его лишь для выбора программы по умолчанию: двойной клик по report.docx открывает Word, потому что ассоциация прописана в реестре или настройках ОС. Переименуйте тот же документ в report.mp3 — содержимое не изменится ни на один байт, просто система попытается скормить его плееру и получит ошибку.

Этой особенностью регулярно пользуются злоумышленники: вредоносный скрипт маскируют под картинку или PDF, рассчитывая на то, что пользователь откроет вложение не глядя. Обратная ситуация тоже встречается — файл скачан без расширения или с обрезанным именем, и система не знает, чем его открыть. В обоих случаях помогает анализ содержимого.

⚠️ Внимание: не открывайте подозрительный файл двойным кликом, даже чтобы «просто проверить». Запуск исполняемого файла или документа с макросами может привести к заражению системы ещё до того, как вы поймёте, что это за тип. Анализируйте содержимое инструментами, которые читают файл как данные, а не исполняют его.

Магические байты: как устроена сигнатура файла

Большинство форматов начинаются с фиксированной последовательности байтов — её называют магическим числом или сигнатурой. Программа, читающая файл, первым делом проверяет эти байты: если они совпадают с ожидаемыми, формат распознан. Это надёжнее расширения, потому что сигнатура — часть самих данных, и подделать её «случайно» при переименовании невозможно.

Несколько примеров, которые легко запомнить: JPEG начинается с байтов FF D8 FF, PNG — с последовательности 89 50 4E 47 (в текстовом виде это .PNG), а PDF — с читаемой строки %PDF-. Исполняемые файлы Windows (EXE, DLL) стартуют с символов MZ — дань уважения Марку Збиковски, одному из разработчиков формата.

Есть и хитрые случаи. Форматы DOCX, XLSX, ODT и APK — это на самом деле ZIP-архивы, поэтому все они начинаются с сигнатуры 50 4B (символы PK). По первым байтам такой файл определится как ZIP, а точный тип придётся уточнять по внутренней структуре архива — например, по наличию внутри файла AndroidManifest.xml у APK или папки word/ у DOCX.

ФорматСигнатура (hex)Текстовое представление
JPEGFF D8 FFнечитаемые байты
PNG89 50 4E 47 0D 0A 1A 0A.PNG....
PDF25 50 44 46 2D%PDF-
ZIP / DOCX / APK50 4B 03 04PK..
EXE / DLL (Windows)4D 5AMZ
MP3 (с ID3-тегом)49 44 33ID3

Команда file в Linux и macOS

Самый быстрый способ определить тип по содержимому — утилита file, входящая в стандартную поставку практически любого дистрибутива Linux и доступная в macOS через терминал. Она сверяет начало файла с базой сигнатур (magic database) и выдаёт текстовое описание формата, часто с дополнительными деталями: разрешением изображения, версией документа, разрядностью исполняемого файла.

file unknown_file

unknown_file: PNG image data, 1920 x 1080, 8-bit/color RGBA, non-interlaced

Обратите внимание: имя файла в примере вообще без расширения, и это не помешало определению. Утилита работает и с несколькими файлами сразу — достаточно передать их через пробел или использовать шаблон. Для глубокой проверки полезен ключ -i, который выводит тип в формате MIME, например image/png или application/pdf.

На Windows той же утилиты нет из коробки, но она доступна в среде WSL (подсистема Windows для Linux), а также в составе пакетов Git Bash и Cygwin. Если вы регулярно разбираете непонятные файлы, это самый удобный вариант.

📊 Как вы чаще всего определяете тип неизвестного файла?
Просто пробую открыть в разных программах
Смотрю первые байты в hex-редакторе
Использую команду file или аналог
Загружаю в онлайн-сервис проверки

Просмотр сигнатуры в hex-редакторе на Windows

Если терминал недоступен, первые байты можно посмотреть в любом шестнадцатеричном редакторе: HxD, 010 Editor, WinHex или даже во встроенном hex-режиме некоторых файловых менеджеров. Откройте файл (именно «открыть в редакторе», а не запустить) и посмотрите на первые 8–16 байт в левой колонке и их текстовое представление справа.

☑️ Ручная проверка типа файла по содержимому

Выполнено: 0 / 5

Дальше действуйте по обстановке. Видите %PDF- — смело меняйте расширение на .pdf и открывайте в просмотрщике. Начало с PK — пробуйте открыть как архив. А вот MZ в начале «документа» из почтового вложения — тревожный сигнал: перед вами исполняемый файл, и открывать его не стоит.

У ручного метода есть ограничение: он показывает только начало файла. Некоторые форматы (например, контейнеры видео) имеют сложную структуру, и одной сигнатуры для уверенного вывода мало. В таких случаях лучше довериться специализированным анализаторам.

Специализированные программы и онлайн-сервисы

Когда нужно определить тип автоматически и без установки Linux-утилит, пригодятся готовые инструменты:

  • 🔍 TrID — консольная утилита для Windows с собственной базой сигнатур; выдаёт не один вариант, а список вероятных форматов с процентом совпадения, что удобно для экзотических типов.
  • 🧰 TrIDNet — графическая оболочка над TrID для тех, кто не любит командную строку: перетащили файл — получили результат.
  • 🌐 VirusTotal — помимо антивирусной проверки показывает определённый тип файла на вкладке деталей; подходит для подозрительных вложений.
  • 📄 MediaInfo — незаменим для видео и аудио: показывает контейнер, кодеки, битрейт и прочие параметры, которые по одной сигнатуре не видны.
  • 🗂️ Binwalk — инструмент из арсенала анализа прошивок; ищет вложенные файлы и сигнатуры внутри бинарных данных.

Онлайн-сервисы удобны, но у них есть принципиальное ограничение: файл уходит на чужой сервер. Для конфиденциальных документов, финансовых данных и чего-либо под NDA такой способ не подходит — используйте локальные утилиты.

⚠️ Внимание: загружая файл в онлайн-анализатор, вы передаёте его содержимое третьей стороне. Даже если сервис заявляет об удалении данных после проверки, гарантировать это невозможно. Личные документы, пароли и коммерческую информацию анализируйте только офлайн.
Что делать, если файл оказался ZIP-архивом с сигнатурой PK

Откройте файл архиватором (7-Zip, WinRAR) и посмотрите структуру внутри. Папка word/ и файл document.xml указывают на DOCX, xl/ — на XLSX, AndroidManifest.xml и classes.dex — на Android-приложение APK, а META-INF/ с манифестом — на Java-архив JAR. По внутреннему оглавлению определяется точный тип контейнера.

Сложные случаи: повреждённые, зашифрованные и текстовые файлы

Не всякий файл поддаётся определению по сигнатуре. Зашифрованные данные (архив с паролем, контейнер VeraCrypt) выглядят как случайный шум — сигнатуры там либо нет, либо она скрыта шифрованием. Утилита file честно ответит data, и это нормальный результат: содержимое не определить без ключа.

У текстовых файлов противоположная проблема — у них вообще нет магических байтов. Обычный TXT, CSV, скрипт Python или HTML-страница — всё это последовательности символов. Здесь тип определяют косвенно: по характерным конструкциям (<html>, import, <?php), по кодировке и по статистике символов. Команда file умеет распознавать многие текстовые форматы именно так.

С повреждёнными или усечёнными файлами всё зависит от того, уцелело ли начало. Если первые байты целы, сигнатуру прочитать можно, даже когда «хвост» файла потерян. Если же пострадал именно заголовок — например, при сбое записи на флешку — помогают программы восстановления вроде PhotoRec, которые сканируют диск целиком и находят известные сигнатуры в сырых данных.

Как проверить, что файл соответствует заявленному типу

Обратная задача встречается не реже: файл имеет расширение, но вызывает подозрение. Порядок действий простой. Сначала определите реальный тип по сигнатуре любым способом из статьи. Затем сравните с заявленным расширением: совпадает — можно открывать штатной программой, не совпадает — разбирайтесь, что перед вами на самом деле.

  • 🖼️ «Картинка» с сигнатурой MZ — исполняемый файл, удалить и проверить систему антивирусом.
  • 📑 «Документ» с сигнатурой PK вместо %PDF — возможно, это DOCX, переименованный в PDF; откройте как архив и убедитесь.
  • 🎬 «Видео», которое не определяется ни одной сигнатурой, — вероятно, файл недокачан; проверьте его размер и источник.

Дополнительную уверенность даёт проверка хеша. Если файл получен из источника, где опубликованы контрольные суммы (например, SHA-256 на странице загрузки), сверьте их командой certutil -hashfile имя_файла SHA256 в Windows или sha256sum в Linux. Совпадение хеша подтверждает, что файл именно тот, что заявлен, и не был подменён или повреждён в пути.

Часто задаваемые вопросы

Можно ли определить тип файла, если у него вообще нет расширения?

Да, расширение для анализа по содержимому не требуется. Утилита file, hex-редактор или TrID читают первые байты файла и сравнивают их с базой сигнатур. Исключение — текстовые и зашифрованные файлы, у которых сигнатуры нет или она скрыта.

Почему DOCX-файл определяется как ZIP-архив?

Форматы Office Open XML (DOCX, XLSX, PPTX) технически являются ZIP-архивами с XML-документами внутри, поэтому их сигнатура совпадает с ZIP (PK). Точный тип определяется по внутренней структуре: наличие папки word/ указывает на DOCX, xl/ — на XLSX.

Чем посмотреть первые байты файла на Windows без установки программ?

Можно использовать PowerShell: команда Format-Hex -Path имя_файла -Count 16 покажет первые шестнадцать байт в шестнадцатеричном виде. Этого достаточно, чтобы считать сигнатуру большинства распространённых форматов.

Опасно ли открывать неизвестный файл в hex-редакторе?

Нет, если редактор открывает файл как данные, а не исполняет его. Hex-редакторы и утилиты анализа только читают содержимое. Опасен запуск файла двойным кликом или открытие в программе, которая может выполнить встроенный код (макросы, скрипты).

Что означает результат «data» при проверке командой file?

Это значит, что утилита не нашла известной сигнатуры. Возможные причины: файл зашифрован, повреждён в начале, записан в редком формате, которого нет в базе, или представляет собой фрагмент данных без заголовка. Попробуйте TrID с более широкой базой сигнатур или проанализируйте содержимое вручную.