Тайна двоичных файлов

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

7
10.07.2012, 19:38
3 ответа

Этот вопрос о Суперпользователе: Почему Вы не видите двоичный код при открытии двоичного файла с текстовым редактором? обращается к Вашей первой точке вполне хорошо.

Двоичный файл и текстовые данные не разделяются: Они - просто данные. Это зависит от интерпретации, которая делает их один или другой. При открытии двоичных данных (таких как файл изображения) в текстовом редакторе большая часть его не будет иметь смысла, потому что это не соответствует выбранной интерпретации (как текст).

Файлы хранятся как нули и (например, напряжение напряжения/нет на памяти, намагничивание намагничивания/нет на жестком диске). Вы не видите нули и когда cat луг файлы, потому что последовательности 0/1 не будут иметь большого применения для человека; символы имеют больше смысла, и hexdump лучше для большинства целей (попытка hexdump на файле).

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

Наконец: да, можно записать программы в ассемблере с помощью кодов операций ЦП непосредственно. Смотрите на Введение в программирование блока UNIX и документацию Intel x86 для начальной точки.

16
27.01.2020, 20:13

Все файлы хранятся как 1's и 0, кошка просто пытается интерпретировать каждый БАЙТ (8 битов) как символ, вот почему Вы видите непонятные символы.

9
27.01.2020, 20:13

Все файлы являются двоичными под капотом: они хранятся как последовательность битов.

Биты файлов на самом деле сгруппированы в байтах. Каждый файл состоит из целого числа байтов. Всем системам Unix и на самом деле почти всем компьютерам, составили байты 8 битов (известный как октеты в сетевой терминологии). Существует естественный способ интерпретировать байты как 8-разрядные числа, т.е. числа между 0 и 28-1 = 255.

Для наблюдения их как двоичный файл Вам нужен инструмент, который выписывает им в двоичной записи. Люди не хорошо подходят для двоичной записи: это берет слишком долго для записи чего-либо. Более распространено использовать шестнадцатеричную нотацию с 16 различными цифрами. Например, 41 (шестьдесят пять в шестнадцатеричном), более удобно для чтения, чем 01000001 (шестьдесят пять в двоичном файле). Можно использовать команду такой как od (“восьмеричный дамп”) или hexdump или hd перечислять файл с восьмеричной или шестнадцатеричной нотацией для каждого байта (od -t x1 переключатели к шестнадцатеричному).

Байты могут представить символы. Существует несколько кодировок символов, используемых в мире Unix. Они - все на основе ASCII, который определяет интерпретацию байтов между 0 и 127. Заметьте, что это только определяет значение для половины возможных значений байта. Например, 65 представляет прописную букву A, 97 представляет строчную букву a, 30 представляет цифру 0, и так далее. Некоторые кодировки символов представляют каждый символ на один байт; например, в латинском 1 кодировании, 163 представляет £, 241 представляет ñ и так далее. Максимальное количество символов, что можно представить этот путь, 256, который не является очень; поэтому, существует другая кодировка, которая использует больше чем один байт за символ. Фактическое стандартное кодирование в мире Unix в наше время является UTF-8, который является кодированием переменной длины (различные символы поднимают различные числа байтов) для набора символов Unicode.

Текстовый файл является двоичным файлом, который, оказывается, содержит понятный текст. На самом деле, для программ Unix, файл является текстовым файлом, пока он уважает два условия:

  • Текстовый файл не может содержать пустой байт (байт с численным значением 0). Этот байт не представляет символа и используется в качестве специального маркера внутренне во многих текстовых программах управления.
  • Текстовый файл состоит из последовательности строк, и каждая строка завершается символом новой строки (который имеет численное значение 10).

Исполняемые файлы машины являются конкретным видом двоичного файла. Если Вы работаете cat команда на них, Вы будете видеть мусор со случайным битом текста. Эти файлы могут по совпадению содержать команды для Вашего терминала, также. Можно использовать программу strings видеть все фрагменты текста в двоичном файле, не учитывая непечатаемые символы.

Исполняемые файлы машины не являются точно последовательностью машинных команд: они также содержат немного дополнительной информации, которая говорит операционную систему, как загрузить файл в память, обычно также некоторые данные, используемые программой и дополнительно отладочной информацией. Большинство систем Unix использует формат ELF для исполняемых файлов машины. Этот формат указывает, как файл, содержащий машинный код, разделен на разделы, и та часть независима от архитектуры машины; некоторые разделы содержат код, и значение того кода характерно для конкретной архитектуры машины.

Можно использовать команду objdump -D /path/to/machine-executable отобразить список исполняемого файла в человекочитаемой форме: ассемблер. Ну, читаемый обученным человеком так или иначе. Ассемблер характерен для архитектуры процессора и отображается непосредственно на машинные команды.

Возможно записать полную программу в ассемблере, но это редко делается для нетривиальных программ, потому что требуется много времени. Если Вы являетесь действительно сумасшедшими, Вы могли бы записать свою программу непосредственно в двоичном файле. Некоторые люди попытались придумать самую короткую программу, которая печатает Hello world; Ryan Henszey объясняет, как записать 142-байтовый исполняемый файл ELF для процессоров PC; Brian Raiter проанализировал формат ELF и придумал 45-байтовую программу, которую Linux готов выполнить (что программа ничего не печатает).

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

4
27.01.2020, 20:13

Теги

Похожие вопросы