- Работа с магическими числами в Linux
- Как определить тип файла файла с помощью Linux
- Найдите тип файла любого файла или группы файлов с помощью команды FILE
- Как работает команда File
- Как использовать команду «Файл»
- Настройте вывод из команды File
- Обработка нескольких файлов
- Сжатые файлы
- Фундаментальные основы Linux. Часть II: Первые шаги в изучении интерфейса командной строки
- Глава 7. Работа с файлами
- Все имена файлов регистрозависимы
- Все является файлом
- Утилита file
- Утилита touch
- Утилита cp
- Утилита mv
- Утилита rename
- Практическое задание: работа с файлами
- Корректная процедура выполнения практического задания: работа с файлами
Работа с магическими числами в Linux
Цель этой статьи — дать представление о магических числах и заголовках файлов, о том, как извлечь файл на основе магических чисел и как повредить и восстановить файл на основе магических чисел в среде Linux.
Волшебные числа
Магические числа — это первые несколько байтов файла, которые являются уникальными для определенного типа файлов. Эти уникальные биты упоминаются как магические числа, также иногда называемые сигнатурой файла.
Эти байты могут использоваться системой для « различения и распознавания разных файлов » без расширения файла.
Обнаружение магических чисел в сигнатурах файлов
Большинство файлов имеют подписи в байтах в начале файла, но некоторые файловые системы могут даже иметь подпись файла со смещениями, отличными от начала. Например, файловая система ext2 / ext3 имеет байты 0x53 и 0xEF в 1080-й и 1081-й позиции.
- Некоторые файлы, однако, не имеют магических чисел, таких как текстовые файлы, но могут быть идентифицированы путем проверки набора символов (ASCII в случае текстовых файлов).
Это можно сделать с помощью команды: - Магические числа / подписи файлов обычно не видны пользователю, но их можно увидеть с помощью шестнадцатеричного редактора или команды «xxd», как указано ниже. Эти байты необходимы для открытия файла.
- Изменение / повреждение этих байтов сделает файл бесполезным, так как большинство инструментов не получат доступ к этим файлам из-за возможного повреждения.
- Команда file в Linux reader читает магические числа файла и отображает тип файла на основе магического числа.
- Например, давайте возьмем пример файла PNG. Мы можем просмотреть шестнадцатеричный файл, введя следующую команду в терминале Linux (kali Linux используется в этой статье). Эта команда создает hexdump файла, который мы передаем ему.
Это дает следующий результат:
На этом изображении мы видим, что первый набор байтов файла
Эти цифры помогают системе определить тип используемого файла. Некоторые файлы, которые не записаны с их расширением, идентифицируются с помощью этих магических чисел.
Пример Zip-файла. Аналогичным образом используйте вышеупомянутую команду для Zip-файла.
На изображении выше мы видим, что файл начинается с:
Добавление одного файла в другой и идентификация деления с помощью магических чисел
Мы можем использовать python для выполнения этой операции. По сути, мы будем читать байты двух файлов и записывать их один за другим в пустой файл. В этой статье мы объединяем PNG с Zip-файлом.
«»»
Первые две строки открывают два файла для чтения побайтово
Третья строка открывает выходной файл для записи побайтно
«»»
input_file_1 = open ( «image.png» , ‘rb’ ).read()
input_file_2 = open ( «test.zip» , ‘rb’ ).read()
output_file = open ( «output.png» , ‘wb’ )
Используя этот код Python, мы получаем файл output.png. При запуске команды:
в этом файле мы видим, что он начинается с того же гексагона 8950 4e47 0d0a 1a0a. Однако, если мы запустим команду
который будет искать магические числа (PK — это ASCII-эквивалент 50 3b) zip-файла среди гексагона,
мы получим следующий вывод:
На этом рисунке мы видим, что магические числа zip-файла присутствуют в шестнадцатеричном формате png, что означает, что мы успешно добавили шестнадцатеричный файл zip-файла к png. Следующим шагом является отделение этого zip-файла от png.
Существует простая утилита binwalk, которая помогает нам легко выполнить эту задачу, набрав:
Как использовать магические числа и смещения для извлечения zip-файла из вывода:
- Найдите начальное смещение файла, который вы хотите извлечь: в этом примере мы хотим извлечь файл zip из PNG. Итак, мы сначала ищем заголовок ZIP. Как показано на предыдущем рисунке, мы выполняем команду ‘xxd output.png | Греп «ПК». На этом рисунке мы видим смещение в левом столбце. Для zip-файла смещение будет 00001c90.
- Вычислите количество бит по смещению, с которого начинается заголовок вашего файла: Теперь мы должны вычислить количество бит по смещению, с которого начинается zip-файл. Мы можем вручную посчитать это и наблюдать, что это 00001c95 (каждое шестнадцатеричное значение соответствует 1 биту)
- Преобразуйте это шестнадцатеричное значение в десятичное: это можно сделать, открыв IDLE Python (типа «python» в терминале Linux. Теперь мы должны преобразовать это значение в десятичное. В IDLE Python мы должны просто добавить 0x в начало значение, найденное на предыдущем шаге.
- Используйте следующую команду:
В вышеупомянутой команде «if» обозначает входной файл, «skip» обозначает количество битов, которые необходимо пропустить, чтобы достичь начала файла, который мы хотим извлечь, «bs» относится к числу байтов, которые должны быть прочитанным за раз, а ‘of’ относится к имени выходного файла.
Обратитесь к рисунку ниже, чтобы увидеть использование шагов 3 и 4:
Как повредить файл, изменив его магический номер?
Изменение магических номеров файла делает файл бесполезным. Нам будет показана ошибка всякий раз, когда мы пытаемся открыть файл с искаженным заголовком.
- Скачать редактор hex : чтобы испортить файл, нам нужен редактор hex. hexedit — популярный инструмент, используемый для того же самого. Вы можете установить его используя:
Вы можете открыть файл, набрав
Вы увидите такой вывод:
Чтобы сохранить и выйти, нажмите Ctrl X, а затем Y.
На рисунке выше мы видим, что первые 2 байта были изменены на 00 00, а справа мы видим, что текст изменился с .PNG на ..NG
Как восстановить файл с поврежденным магическим номером?
Давайте воспользуемся примером, показанным на картинке выше, где я повредил первые два байта PNG. Если вы попытаетесь открыть PNG сейчас, он выдаст ошибку «Не удалось загрузить файл», а не «PNG». Это доказательство того, что система смотрит на магическое число перед открытием файла. Зная, что магические числа PNG начинаются с 89 50, мы можем вернуть байты к их первоначальному значению.
Давайте посмотрим на другой пример, используя изображение в формате JPEG.
Давайте сначала посмотрим, как выглядит рабочий гекс в формате jpeg:
оригинальные магические числа байты
JPEG с поврежденными магическими байтами будет выглядеть так:
Мы замечаем, что магические байты в этом
И, следовательно, файл jpg не откроется, если вы попытаетесь открыть его. Мы получаем эту ошибку:
Файл JPG обычно имеет магическое число «FFD8 DDE0», «FFD8 FFDB» или «FFD8 FFE1».
С этим знанием все, что нам нужно сделать, это попробовать эти комбинации в качестве заголовков файла. Для этого требуется тот же процесс, что и при повреждении файла.
- Открыть гекседит
- Измените первые несколько байтов, наведя курсор и введя нужные значения
- Сохранить (Ctrl X) и выйти
- Попробуйте открыть файл. Повторите шаги со следующим возможным магическим числом, если файл не открывается
При изменении магических байтов на FFD8 FFE0 изображение открывается правильно.
Эта статья предоставлена Дипаком Шриватсавом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Источник
Как определить тип файла файла с помощью Linux
Найдите тип файла любого файла или группы файлов с помощью команды FILE
Большинство людей смотрят на расширение файла, а затем угадывают тип файла с этим расширением. Например, когда вы видите файл с расширением gif, jpg, bmp или png, вы думаете о файле изображения, а когда вы видите файл с расширением zip, вы предполагаете, что файл был сжат с помощью утилиты сжатия zip ,
В действительности, файл может иметь одно расширение, но быть чем-то совершенно другим. В Linux вы узнаете истинный тип файла с помощью команды file .
Как работает команда File
Команда file выполняет три набора тестов для файла:
- Тесты файловой системы
- Магические тесты
- Языковые тесты
Первый набор тестов для возврата правильного ответа приводит к печати типа файла.
Тесты файловой системы проверяют отдачу от системного вызова stat. Программа проверяет, является ли файл пустым и является ли он специальным файлом. Если тип файла найден в системном заголовочном файле, он возвращается как допустимый тип файла.
Магические тесты проверяют содержимое файла и, в частности, несколько байтов в начале, которые помогают определить тип файла. Различные файлы используются, чтобы помочь сопоставить файл с его типом файла, и они хранятся в:
Переопределите эти файлы, поместив файл в вашу домашнюю папку с именем $ HOME/.magic.mgc или $ HOME/.magic.
Финальные тесты – языковые тесты. Файл проверяется, чтобы увидеть, является ли он текстовым файлом. Тестируя первые несколько байтов файла, тест может определить, является ли файл ASCII, UTF-8, UTF-16 или другим форматом, который идентифицирует файл как текстовый файл. Когда выводится набор символов, файл проверяется на разных языках.
Если ни один из тестов не работает, выводом являются данные.
Как использовать команду «Файл»
Команда file может быть использована следующим образом:
Например, представьте, что у вас есть файл с именем file1, и вы запускаете следующую команду:
Вывод примерно такой:
Выходные данные определяют, что file1 – это файл изображения или, точнее, файл переносимой сетевой графики (PNG).
Различные типы файлов дают разные результаты:
- Тип файла ODS : электронная таблица OpenDocument
- Тип файла PDF : документ PDF, версия 1.4
- Тип файла CSV : текст ASCII, с очень длинными строками, с индикаторами строк CRLF
Настройте вывод из команды File
По умолчанию команда file предоставляет имя файла и все детали над файлом. Если вы хотите, чтобы только детали без имени файла повторялись, используйте следующий переключатель:
Вывод примерно такой:
Вы также можете изменить разделитель между именем файла и типом. По умолчанию в качестве разделителя используется двоеточие, но вы можете изменить его на что угодно, например на символ канала, следующим образом:
Вывод примерно такой:
Обработка нескольких файлов
По умолчанию вы используете команду file для одного файла. Однако вы можете указать имя файла, которое содержит список файлов, которые будут обработаны командой file.
Например, откройте файл с именем testfiles с помощью редактора nano и добавьте в него следующие строки:
Сохраните файл и выполните следующую команду:
Результат будет примерно таким:
- /etc/passwd: текст ASCII
- /etc/pam.conf: текст ASCII
- /etc/opt: каталог
Сжатые файлы
По умолчанию, когда вы запускаете команду file для сжатого файла, вы видите что-то вроде этого:
Хотя это говорит о том, что файл является архивом, вы не знаете его содержимого. Вы можете заглянуть внутрь zip-файла, чтобы увидеть типы файлов в сжатом файле. Следующая команда запускает команду file для файлов внутри ZIP-файла:
Вывод теперь показывает типы файлов файлов в архиве.
Большинство людей используют команду file, чтобы найти основной тип файла.Чтобы узнать больше о возможностях, которые предлагает команда file, введите в окне терминала следующее:
Эта команда открывает документацию по программному обеспечению Linux, включенную в систему.
Источник
Фундаментальные основы Linux. Часть II: Первые шаги в изучении интерфейса командной строки
Глава 7. Работа с файлами
Из данной главы вы узнаете о том, как определять тип файлов, создавать, удалять, копировать и перемещать файлы с помощью таких утилит, как file , touch , rm , cp , mv и rename .
Все имена файлов регистрозависимы
Имена файлов в Linux (или в любой системе Unix) являются регистрозависимыми. Это означает, что имена FILE1 и file1 не являются равноценными, а путь к файлу /etc/hosts отличен от пути к файлу /etc/Hosts (последнего файла не должно существовать в файловой системе типичного компьютера, работающего под управлением Linux).
Все является файлом
Любая директория на самом деле является файлом (с регистрозависмым именем!), хотя этот файл и имеет специальный тип. Каждый терминал (например, /dev/pts/4 ), любой жесткий диск или раздел на нем (например, /dev/sdb1 ) и любой процесс представлены где-либо в рамках файловой системы с помощью файла . После изучения данной главы у вас не останется сомнений в том, что в Linux все является файлом .
Утилита file
Утилита file использует файл со списком «магических последовательностей байт», содержащий шаблоны для распознавания типов данных. Файл со списком «магических последовательностей байт» расположен по пути /usr/share/file/magic . Используйте команду man 5 magic в случае необходимости получения дополнительной информации о нем.
Утилита touch
Создание пустого файла
Один из простых способов создания пустого фала заключается в использовании утилиты touch . (Позднее в данной книге мы рассмотрим множество других способов создания файлов.)
Команда touch -t
Удаление файлов навсегда
Утилита cp
Копирование отдельных файлов
Копирование файлов в другую директорию
Копирование множества файлов в директорию
Утилита mv
Переименование файлов с помощью утилиты mv
В том случае, если вам необходимо переименовать один файл, утилита mv является предпочтительным инструментом.
Переименование директорий с помощью утилиты mv
Утилита mv поддерживает параметр -i по аналогии с утилитами cp и rm .
Утилита rename
Об утилите rename
Утилита rename является одним из редких случаев, когда в рамках книги «Фундаментальные основы Linux» приходится делать разделение между дистрибутивами Linux. Практически каждая из описанных в данной книге утилит работает практически на каждом компьютере под управлением Linux. Но реализации утилиты rename в различных дистрибутивах отличаются.
Следует пытаться использовать утилиту mv всегда, когда вам необходимо переименовать несколько файлов.
Утилита rename в дистрибутиве Debian/Ubuntu
Утилита rename в дистрибутиве Debian имеет сложный синтаксис (используются регулярные выражения) для единовременного переименования множества файлов.
Утилита rename в дистрибутиве CentOS/RHEL/Fedora
Практическое задание: работа с файлами
1. Выведите список файлов директории /bin.
2. Выведите информацию о типах файлов /bin/cat, /etc/passwd и /usr/bin/passwd.
3a. Загрузите файлы wolf.jpg и LinuxFun.pdf с ресурса http://linux-training.be (с помощью команд wget http://linux-training.be/files/studentfiles/wolf.jpg и wget http://linux-training.be/files/books/LinuxFun.pdf)
3b. Выведите информацию о типах файлов wolf.jpg и LinuxFun.pdf.
3c. Переименуйте файл wolf.jpg в wolf.pdf (с помощью команды mv).
3d. Выведите информацию о типах файлов wolf.pdf и LinuxFun.pdf.
4. Создайте директорию
/touched и перейдите в нее.
5. Создайте файлы today.txt и yesterday.txt в директории touched.
6. Измените дату создания файла yesterday.txt таким образом, чтобы она совпадала с датой прошлого дня.
7. Создайте копию файла yesterday.txt с именем copy.yesterday.txt.
8. Переименуйте файл copy.yesterday.txt в kim.
9. Создайте директорию с именем
/testbackup и скопируйте все файлы из директории
10. Используйте одну команду для удаления директории
/testbackup и всех файлов из нее.
11. Создайте директорию
/etcbackup и скопируйте файлы с расширением .conf (*.conf) из директории /etc в нее. Проверьте, был ли осуществлен обход всех поддиректорий директории /etc?
12. Используйте утилиту rename для переименования всех файлов с расширением .conf (*.conf) таким образом, чтобы расширения всех этих файлов изменились на .backup. (Если у вас есть возможность работы более чем со одним дистрибутивом, попробуйте выполнить эту операцию во всех этих дистрибутивах!).
Корректная процедура выполнения практического задания: работа с файлами
1. Выведите список файлов директории /bin.
2. Выведите информацию о типах файлов /bin/cat, /etc/passwd и /usr/bin/passwd.
3a. Загрузите файлы wolf.jpg и LinuxFun.pdf с ресурса http://linux-training.be (с помощью команд wget http://linux-training.be/files/studentfiles/wolf.jpg и wget http://linux-training.be/files/books/LinuxFun.pdf)
3b. Выведите информацию о типах файлов wolf.jpg и LinuxFun.pdf.
3c. Переименуйте файл wolf.jpg в wolf.pdf (с помощью команды mv).
3d. Выведите информацию о типах файлов wolf.pdf и LinuxFun.pdf.
4. Создайте директорию
/touched и перейдите в нее.
5. Создайте файлы today.txt и yesterday.txt в директории touched.
6. Измените дату создания файла yesterday.txt таким образом, чтобы она совпадала с датой прошлого дня.
7. Создайте копию файла yesterday.txt с именем copy.yesterday.txt.
8. Переименуйте файл copy.yesterday.txt в kim.
9. Создайте директорию с именем
/testbackup и скопируйте все файлы из директории
10. Используйте одну команду для удаления директории
/testbackup и всех файлов из нее.
11. Создайте директорию
/etcbackup и скопируйте файлы с расширением .conf (*.conf) из директории /etc в нее. Проверьте, был ли осуществлен обход всех поддиректорий директории /etc?
Будут скопированы исключительно файлы с расширением .conf (*.conf), находящиеся непосредственно в директории /etc/.
12. Используйте утилиту rename для переименования всех файлов с расширением .conf (*.conf) таким образом, чтобы расширения всех этих файлов изменились на .backup. (Если у вас есть возможность работы более чем со одним дистрибутивом, попробуйте выполнить эту операцию во всех этих дистрибутивах!).
Источник