Как просмотреть бинарный файл?

45

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

PS У меня есть сборочный двоичный файл, который должен быть простым двоичным кодом 1 и 0?

Мартин Зелтин
источник
1
когда вы отображаете бинарный файл, вы увидите его как символы ascii
mazs
2
повторяющаяся проблема stackoverflow.com/questions/1765311/…
лабиринты
нет - OP указал "двоичный файл скомпилированный сборкой". Это не решает вопрос. Например, это не музыкальный файл, и он имеет структуру. Без ОП, предоставляющего дополнительную информацию, неструктурированный инструмент - это место для начала.
Томас Дики
1
Смотри мой ответ. И имейте в виду, что термин двоичный файл используется на практике двумя совершенно разными способами: «двоичный файл» означает файл, контекст которого не является чистым ASCII-текстом. «Двоичное число» означает число, записанное с использованием его двоичной формы.
Пьер-Оливье Варес
@mazs ASCII? Я думаю, что UTF-8 более вероятен, или какая-то кодовая страница, если программа думает, что она, кажется, закодирована таким образом с помощью эвристики.
JDługosz

Ответы:

99

Согласно этому ответу по тиранидам :

hexdump -C yourfile.bin 

если вы не хотите редактировать это, конечно. Большинство дистрибутивов Linux имеют hexdumpпо умолчанию (но, очевидно, не все).


Обновить

Согласно этому ответу по Эмилио Bool :

xxd делает двоичные и шестнадцатеричные

Для бина:

xxd -b file

Для гекса:

xxd file
Рахул
источник
Это действительно помогло! Спасибо
Шравья Боггарапу
видеть только голову: xxd имя файла | голова
Адам
45

Различные люди ответили на некоторые аспекты запроса, но не на все.

Все файлы на компьютерах хранятся как 1 и 0. Изображения, текстовые файлы, музыка, исполняемые приложения, объектные файлы и т. Д.

Все они 0 и 1. Разница лишь в том, что они интерпретируются по-разному в зависимости от того, что их открывает.

Когда вы просматриваете текстовый файл, используя cat, исполняемый файл ( catв данном случае) читает все 1 и 0 и представляет их вам, преобразовывая их в символы из вашего соответствующего алфавита или языка.

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

Скомпилированные бинарные файлы ничем не отличаются, они хранятся как 1 и 0.

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

Если вы хотите понять, что делает исполняемый двоичный файл, вам нужно просмотреть его таким образом, чтобы он показал вам язык ассемблера (как начало), который вы можете сделать, используя:

objdump -d /path/to/binary

который является дизассемблером, он берет двоичный контент и преобразует его обратно в ассемблер (который является языком программирования очень низкого уровня). objdumpне всегда устанавливается по умолчанию, поэтому может потребоваться установка в зависимости от вашей среды Linux.

Некоторое внешнее чтение.

NB: как указывает @Wildcard, важно отметить, что файлы не содержат символов 1 и 0 (как вы видите их на экране), они содержат фактические числовые данные, отдельные биты информации, которые либо включены (1) или выключено (0). Даже это описание является лишь приближением к истине. Ключевым моментом является то, что если вы найдете средство просмотра, которое показывает вам 1 и 0, даже если оно все еще интерпретирует данные из файла, а затем показывает символы ASCII для 0 и 1. Данные хранятся в двоичном формате ( см. ссылку на двоичный номер выше). В вики-записи сообщества Пьера-Оливье эта тема описана более подробно.

EightBitTony
источник
Хорошее разоблачение. Возможно, вы захотите добавить, что символы, которые вы видите в текстовой строке как «1» или «0», не сохраняются компьютером как «1» или «0»; У ОП, похоже, есть путаница по этому поводу.
Wildcard
1
Я бы сказал (например, не согласен) с вашим утверждением: «Когда вы просматриваете текстовый файл, используя cat, исполняемый файл ( catв данном случае) читает все 1 и 0 и представляет их вам, преобразовывая их в символы из вашего соответствующего алфавита или язык «. catне делает этого; все, что catнужно, это записать байты в стандартный вывод (если вы не используете «вредные» опции). Терминальная программа (и / или аппаратное обеспечение терминала, если применимо, т.е. его встроенное программное обеспечение) определяет, как визуализировать байты в виде символов, возможно, с помощью драйвера TTY.
G-Man говорит: «Восстановите Монику»
Я не согласен, но в какой-то момент все простые описания рушатся, вопрос в том, как далеко вы зайдете в кроличью нору, прежде чем перестанете просто описывать вещи.
EightBitTony
14

На низком уровне файл кодируется в виде последовательности нулей и единиц.

Но даже программисты редко бывают там на практике.

Во-первых (и это важнее, чем история с 0 и 1), вы должны понимать, что все, что управляет компьютером, кодируется числами .

  • Символ закодирован числом, используя таблицы набора символов. Например, буква «A» имеет значение 65 при кодировании с использованием ASCII. Смотрите http://www.asciitable.com

  • Пиксель кодируется одним или несколькими числами (существует много графических форматов). Например, в стандартном трехцветном формате желтый пиксель кодируется как: 255 для красного, 255 для зеленого, 0 для синего. См. Http://www.quackit.com/css/css_color_codes.cfm (выберите цвет и посмотрите ячейки R, G & B)

  • Бинарный исполняемый файл написан на ассемблере; каждая инструкция по сборке кодируется как числа. Например, инструкция по сборке MOVB $0x61,%alкодируется двумя числами: 176,97 См. Http://www.sparksandflames.com/files/x86InstructionChart.html (Каждая инструкция имеет связанный номер от 00 до FF, поскольку используется шестнадцатеричная запись, Смотри ниже)

Во-вторых : каждое число может иметь несколько представлений или обозначений .

Скажем, у меня есть 23 яблока.

  • Если я сделаю группы из десяти яблок, я получу: 2 группы по десять и 3 одиноких яблока. Это именно то, что мы имеем в виду, когда пишем 23: a 2 (десятки), а затем 3 (единицы).
  • Но я также могу сделать группы из 16 яблок. Так что я возьму одну Группу из 16 и 7 одиноких яблок. В шестнадцатеричной записи (это то, что называется 16 основанием), я напишу: 17 (16 + 7). Чтобы отличить десятичную запись, обычно используют шестнадцатеричную запись с префиксом или суффиксом: 17h, # 17 или $ 17. Но как изобразить более 9 групп из 16 или более из 9 одних яблок? Просто мы используем буквы от A (10) до F (15). Число 31 (как в 31 яблоках) написано как # 1F в шестнадцатеричном формате.

  • На этой же линии мы можем сделать группу из двух яблок. (И группа из двух яблок группы из двух, то есть группы яблок 2х2 и т. Д.). Тогда 23: 1 группа из 2x2x2x2 яблок, 0 группа из 2x2x2 яблок, 1 группа из 2x2 яблок, 1 группа из 2 яблок и 1 одинокое яблоко, которое будет отмечено 10111 в двоичном виде.

(См. Https://en.wikipedia.org/wiki/Radix )

Физически механизмы, допускающие два состояния (переключатели), просты в выполнении, также как и на диске, который находится в памяти.

Вот почему данные и программы, представленные в виде чисел, пишутся и обрабатываются в двоичном виде.

Затем переводится - в зависимости от типа данных - в соответствующую форму (буква A, желтый пиксель) или исполняется (инструкция MOV).

hexdumpперечисляет числа, кодирующие данные (или программу сборки) в шестнадцатеричной форме. Затем вы можете использовать калькулятор, чтобы получить соответствующую двоичную форму.

Pierre-Olivier Vares
источник
10

Я бы начал с od(восьмеричного дампа) и в зависимости от системы может найти такие инструменты, как objdumpполезные.

Томас Дики
источник
Опция POSIX.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
4

Вы можете открыть его в шестнадцатеричном редакторе, который показывает его как последовательность шестнадцатеричных значений. xxd file

Что вы пытаетесь достичь?

theblazehen
источник
Но я думал, что компьютер может читать только 1 и 0. Могу ли я увидеть их? Я пытаюсь понять, как работают компьютеры
Мартин Зелтин
2
Это само по себе не очень поможет. Если вы хотите узнать, как именно это работает, то на Linux-боксе посмотрите формат файла ELF и en.wikipedia.org/wiki/X86_instruction_listings . Если вы просто хотите увидеть код, сгенерированный компилятором, посмотрите на его запуск с помощью gdb. Поскольку вы хотите получить больше «низкого уровня», проверьте также nand2tetris.org. Что касается языка ассемблера, я слышал, что сборка 6502 и mips намного лучше, чем сборка x86_64 / x86
theblazehen
@theblazehen Современный семейный сборщик x86 - зверь. 8086 был управляемым, и я думаю, что любой процессор с той эпохи (с конца 1970-х до первой половины 1980-х) должен быть терпимым к ассемблеру.
CVn
4

bviбинарный редактор VIsual с привязками клавиш vim Это доступно на большинстве систем Linux.

введите описание изображения здесь

Жиль Кастель
источник
3

Команда Linux strings печатает строки печатаемых символов в файлах, например:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

и т.д ... это более читабельно, чем двоичный файл

ponsfrilus
источник
ОП спросил, как мне открыть его, чтобы увидеть 1 и 0, которые там есть? но stringsкоманда удалит большинство байтов, которые он хочет видеть.
Jlliagre
@jlliagre - хотя вы и правы, stringsкоманда - особенно более длинная, например strings -n 6- действительно помогает выяснить, что в ней содержится в двоичном файле, если он содержит строковые константы и т. д. Этот ответ должен был быть комментарием, а затем было хорошо.
Джо
@Joe Да, я не подвергаю сомнению stringsполезность команды, только факт, что это не отвечает на вопрос OP здесь.
Jlliagre
3

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

Например:

Binary:

xxd -b README.md                                                                
00000000: 00100011 00100000

Что 35 и 32 в десятичном

xxd README.md                                                                   
00000000: 2320

Также 35 и 32 в десятичном виде

Четверг следующий
источник
Другие люди уже упоминали об этом. Тем не менее, это хорошее резюме. Вы можете отредактировать свой ответ, если хотите изменить первый абзац.
wizzwizz4
Очень хорошо, я не видел, чтобы кто-то упоминал об этом, я мог пропустить это.
Четверг
Обратите внимание, что вам нужно vimустановить для использования xxd.
starbeamrainbowlabs
2

Вы можете просмотреть файл в двоичном формате vim:

  • Открытие файла в vim
  • входящий :% !xxd -b

Команда xxdможет быть изменена, например:

  • Добавив -g4, что сгруппирует биты в 32-битные пакеты
  • Добавив -c4, который будет форматировать вывод, иметь 4 байта на строку

Добавление обоих флагов, приведенных выше, даст вам одно 32-битное целое число на строку.

Leandros
источник
1

Вы можете сделать это, например, с помощью этой рубиновой строки:

$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

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

PSkocik
источник
Спасибо! Добавление пробела сразу после него %08bприводит к группировке вывода в байты.
starbeamrainbowlabs
0

GHex - ваш друг :)
Вы можете установить его с помощью командной строки

Ubuntu:

sudo apt-get установить ghex

Fedora:

sudo yum установить ghex

craken
источник