Переименованный файл 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) | Текстовое представление |
|---|---|---|
| JPEG | FF D8 FF | нечитаемые байты |
| PNG | 89 50 4E 47 0D 0A 1A 0A | .PNG.... |
25 50 44 46 2D | %PDF- | |
| ZIP / DOCX / APK | 50 4B 03 04 | PK.. |
| EXE / DLL (Windows) | 4D 5A | MZ |
| MP3 (с ID3-тегом) | 49 44 33 | ID3 |
Команда 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-редакторе на Windows
Если терминал недоступен, первые байты можно посмотреть в любом шестнадцатеричном редакторе: HxD, 010 Editor, WinHex или даже во встроенном hex-режиме некоторых файловых менеджеров. Откройте файл (именно «открыть в редакторе», а не запустить) и посмотрите на первые 8–16 байт в левой колонке и их текстовое представление справа.
☑️ Ручная проверка типа файла по содержимому
Дальше действуйте по обстановке. Видите %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 с более широкой базой сигнатур или проанализируйте содержимое вручную.