Просмотр бинарных файлов Linux

Обновлено: 01.07.2024

Любой файл в системе Linux, не являющийся текстовым, считается двоичным файлом — от системных команд и библиотек до файлов изображений и скомпилированных программ. Но то, что эти файлы являются бинарными, не означает, что вы не можете в них заглянуть. На самом деле существует довольно много команд, которые можно использовать для извлечения данных из бинарных файлов или отображения их содержимого. В этом посте мы рассмотрим некоторые из них.

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

Команда file легко определила, что "camper.jpg" на самом деле является файлом jpg, но в данном случае она говорит нам гораздо больше. Это включает в себя разрешение изображения (3465x2717), дату и время, когда была сделана фотография, а также сведения об изображении и мобильном телефоне, использованном для съемки. Не все файлы jpg будут содержать все эти данные, но файл покажет вам, что доступно.

Спросите о системном двоичном файле, и результат будет совсем другим.

В этом случае мы видим, что команда даты, что неудивительно, представляет собой файл ELF (расширяемый формат ссылок) вместе с некоторыми другими деталями.

Команда ldd выводит список общих библиотек, используемых исполняемым файлом. Команда date использует лишь некоторые из них.

трассировка

Библиотека трассировок ltrace вызывает исполняемый файл.

трассировка

Команда strace отслеживает системные вызовы и считается очень полезной утилитой для диагностики, отладки и обучения. Одна необычная вещь заключается в том, что он отправляет свой вывод на stderr (стандартная ошибка), а вывод отслеживаемой команды — на stdout (стандартный вывод). Итак, если вы хотите сохранить информацию об отслеживании в файле, используйте такие команды:

шестнадцатеричный дамп

Команда hexdump отображает содержимое двоичных файлов в шестнадцатеричном формате. С добавлением параметра -C он также обеспечивает перевод символов, так что мы можем легко выбрать «магические числа», которые идентифицируют типы файлов — JFIF и ELF в приведенных ниже примерах.

Это мало чем отличается от вывода, который вы получите с помощью команды od (восьмеричный дамп), но вывод на экран немного легче читать.

строки

Команда strings извлекает "строки" (последовательности печатных символов) из двоичного файла. В первом примере ниже обратите внимание, как он извлекает захваченные детали изображения кемпера. Если пойти дальше первых 12 строк, вероятно, вы не получите много дополнительной полезной информации о файле изображения, поскольку многие последовательности байтов могут выглядеть как текст, хотя на самом деле таковыми не являются.

Вы также можете использовать команду strings для просмотра исполняемых файлов.

прочитать

Еще одна полезная команда для просмотра файлов ELF — это readelf. Однако вам нужно будет выбрать параметр, чтобы определить, что он будет отображать для вас. В приведенном ниже примере мы смотрим на заголовок (-h). Используйте -a, если хотите просмотреть все доступные данные.

Подведение итогов

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

Присоединяйтесь к сообществам Network World на Facebook и LinkedIn, чтобы комментировать самые важные темы.

Сандра Генри-Стокер занимается администрированием систем Unix более 30 лет. Она описывает себя как «USL» (Unix как второй язык), но помнит достаточно английского, чтобы писать книги и покупать продукты. Она живет в горах в Вирджинии, где, когда не работает с Unix и не пишет о ней, отгоняет медведей от своих кормушек для птиц.

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

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

нет - OP указал "двоичный файл, скомпилированный сборкой". Это не решает вопрос. Например, это не музыкальный файл, и у него есть структура. Если OP не предоставляет дополнительную информацию, можно начать с неструктурированного инструмента.

Смотрите мой ответ. И имейте в виду, что термин «двоичный файл» на практике используется двумя совершенно разными способами: «Двоичный файл» означает файл, контекст которого не является чистым ASCII-текстом. "Двоичное число" означает число, записанное в двоичной форме.

@mazs ASCII? Я думаю, что UTF-8 более вероятен или какая-то кодовая страница, если программа думает, что она закодирована таким образом с помощью huristics.

11 ответов 11

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

Обновить

xxd работает как с двоичным, так и с шестнадцатеричным кодом

Для bin:

Для hex:


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

Все файлы на компьютерах хранятся как 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. Данные хранятся в двоичном формате ( см. ссылку «Двоичный номер» выше). Более подробно об этом рассказывается в вики-записи сообщества Пьера-Оливье.

Tux с фоном двоичного кода

Мы ежедневно работаем с двоичными файлами, но так мало понимаем в них. Под двоичными файлами я подразумеваю исполняемые файлы, которые вы запускаете ежедневно, начиная с инструментов командной строки и заканчивая полноценными приложениями.

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

В этой статье мы рассмотрим некоторые из самых популярных из этих инструментов и команд Linux, большинство из которых будут изначально доступны как часть вашего дистрибутива Linux. Если нет, вы всегда можете использовать менеджер пакетов для их установки и изучения. Помните: чтобы научиться использовать правильный инструмент в нужном случае, нужно много терпения и практики.

Что делает: помогает определить тип файла.

Это будет отправной точкой для бинарного анализа. Мы работаем с файлами ежедневно. Не все является исполняемым типом; существует широкий спектр типов файлов. Прежде чем начать, вам нужно понять тип анализируемого файла. Является ли это двоичным файлом, файлом библиотеки, текстовым файлом ASCII, видеофайлом, файлом изображения, PDF-файлом, файлом данных и т. д.?

Команда file поможет вам определить точный тип файла, с которым вы имеете дело.

Что он делает: печатает зависимости общих объектов.

Если вы уже использовали приведенную выше команду файла для исполняемого двоичного файла, вы не можете пропустить сообщение "динамически связанное" в выходных данных. Что это значит?

При разработке программного обеспечения мы стараемся не изобретать велосипед. Существует набор общих задач, которые требуются большинству программ, таких как печать вывода или чтение из стандартного ввода, открытие файлов и т. д. Все эти общие задачи абстрагируются в набор общих функций, которые каждый может использовать вместо написания. свои варианты. Эти общие функции помещены в библиотеку под названием libc или glibc.

Как узнать, от каких библиотек зависит исполняемый файл? Вот где на сцену выходит команда ldd. Запуск его для динамически связанного двоичного файла показывает все его зависимые библиотеки и их пути.

трассировка

Что делает: трассировщик вызовов библиотеки.

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

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

Hexdump

Что он делает: отображает содержимое файла в ASCII, десятичном, шестнадцатеричном или восьмеричном формате.

Часто случается так, что вы открываете файл в приложении, которое не знает, что делать с этим файлом. Попробуйте открыть исполняемый файл или видеофайл с помощью vim; все, что вы увидите, это тарабарщина, выброшенная на экран.

Открытие неизвестных файлов в Hexdump поможет вам увидеть, что именно содержится в файле. Вы также можете просмотреть ASCII-представление данных, присутствующих в файле, используя некоторые параметры командной строки. Это может помочь вам понять, что это за файл.

строки

Что он делает: печатает строки печатных символов в файлах.

Если Hexdump кажется излишним для вашего варианта использования, и вы просто ищете печатные символы в двоичном файле, вы можете использовать команду strings.

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

прочитать

Что он делает: отображает информацию о файлах ELF.

ELF (формат исполняемых и связываемых файлов) — это основной формат исполняемых и двоичных файлов не только в Linux, но и во многих системах UNIX. Если вы использовали такие инструменты, как команда file, которая сообщает вам, что файл имеет формат ELF, следующим логическим шагом будет использование команды readelf и ее различных параметров для дальнейшего анализа файла.

При использовании readelf может быть очень полезно иметь под рукой ссылку на актуальную спецификацию ELF. Вы можете найти спецификацию здесь.

обждамп

Что делает: отображает информацию из объектного файла.

Двоичные файлы создаются, когда вы пишете исходный код, который компилируется с помощью инструмента, который, что неудивительно, называется компилятором. Этот компилятор генерирует инструкции машинного языка, эквивалентные исходному коду, которые затем могут выполняться ЦП для выполнения заданной задачи. Этот код машинного языка можно интерпретировать с помощью мнемоники, называемой языком ассемблера. Язык ассемблера – это набор инструкций, помогающих понять операции, выполняемые программой и в конечном итоге выполняемые на ЦП.

Утилита objdump считывает двоичный или исполняемый файл и выводит на экран инструкции на языке ассемблера. Знание ассемблера имеет решающее значение для понимания вывода команды objdump.

Помните: язык ассемблера зависит от архитектуры.

трассировка

Что делает: отслеживает системные вызовы и сигналы.

Если вы использовали ltrace, о котором упоминалось ранее, подумайте, что strace похож на него. Единственное отличие состоит в том, что вместо вызова библиотеки утилита strace отслеживает системные вызовы. Системные вызовы — это то, как вы взаимодействуете с ядром для выполнения работы.

Для примера, если вы хотите что-то напечатать на экране, вы будете использовать функцию printf или puts из стандартной библиотеки libc; тем не менее, под капотом, в конечном счете, будет сделан системный вызов с именем write, чтобы фактически вывести что-то на экран.

Что он делает: выводит список символов из объектных файлов.

Если вы работаете с двоичным файлом, который не удален, команда nm предоставит вам ценную информацию, которая была встроена в двоичный файл во время компиляции. nm может помочь вам идентифицировать переменные и функции из двоичного файла. Вы можете себе представить, насколько это было бы полезно, если бы у вас не было доступа к исходному коду анализируемого двоичного файла.

Для демонстрации nm мы быстро напишем небольшую программу и скомпилируем ее с параметром -g, а также увидим, что двоичный файл не удаляется с помощью команды file.

Что он делает: отладчик GNU.

Ну, не все в двоичном файле можно анализировать статически. Мы выполнили некоторые команды, которые запускали двоичный файл, такие как ltrace и strace; однако программное обеспечение состоит из множества условий, которые могут привести к выполнению различных альтернативных путей.

Единственный способ проанализировать эти пути — во время выполнения, имея возможность остановить или приостановить программу в любом заданном месте и иметь возможность анализировать информацию, а затем двигаться дальше вниз.

Именно здесь на сцену выходят отладчики, а в Linux отладчиком де-факто является gdb.Он помогает загружать программу, устанавливать точки останова в определенных местах, анализировать память и регистр ЦП и делать многое другое. Он дополняет другие инструменты, упомянутые выше, и позволяет выполнять гораздо больший анализ во время выполнения.

Обратите внимание, что как только вы загрузите программу с помощью gdb, вам будет представлена ​​ее собственная (gdb) подсказка. Все дальнейшие команды будут выполняться в этой командной строке gdb, пока вы не выйдете.

Мы воспользуемся программой "hello", которую мы скомпилировали ранее, и воспользуемся gdb, чтобы посмотреть, как она работает.

Заключение

После того, как вы освоитесь с этими собственными инструментами анализа двоичных файлов Linux и поймете, какие результаты они предоставляют, вы сможете перейти к более продвинутым и профессиональным инструментам анализа двоичных файлов с открытым исходным кодом, таким как Radare2.

Как найти файлы в Linux

Как работает Hexdump

Hexdump помогает исследовать содержимое двоичных файлов. Узнайте, как работает hexdump.

Двоичный код на экран компьютера

Выполните команду для двоичных файлов с помощью этого скрипта

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


Дэйв Маккей


Дэйв Маккей
Писатель

Стилизованный терминал Linux со строками зеленого текста на ноутбуке.

Фатмавати Ачмад Заэнури/Shutterstock

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

Идентификация типов файлов

Файлы обычно имеют характеристики, которые позволяют программным пакетам определять, к какому типу относится файл, а также какие данные в нем представляются. Не имеет смысла пытаться открыть файл PNG в музыкальном проигрывателе MP3, поэтому полезно и прагматично, если файл содержит некую форму идентификатора.

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

Некоторые операционные системы, например Windows, полностью зависят от расширения файла. Вы можете назвать это легковерным или доверчивым, но Windows предполагает, что любой файл с расширением DOCX действительно является файлом обработки текста DOCX. Linux не такой, как вы скоро увидите. Ему нужны доказательства, и он просматривает файл, чтобы найти их.

Описанные здесь инструменты уже были установлены в дистрибутивах Manjaro 20, Fedora 21 и Ubuntu 20.04, которые мы использовали для исследования этой статьи. Начнем наше исследование с команды файла.

Использование команды файла

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

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


Давайте попробуем файл на нескольких из них и посмотрим, что мы получим:


Три формата файлов определены правильно. Там, где это возможно, файл дает нам немного больше информации. Сообщается, что файл PDF имеет формат версии 1.5.

Даже если мы переименуем файл ODT, чтобы он имел расширение с произвольным значением XYZ, файл по-прежнему правильно идентифицируется как в файловом браузере файлов, так и в командной строке с помощью файла .

Файл OpenDocument правильно идентифицирован в файловом браузере файлов, даже если его расширение XYZ.

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


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


Интересно, что даже в случае файлов с простым текстом файл не оценивает файл по его расширению. Например, если у вас есть файл с расширением «.c», содержащий стандартный обычный текст, но не исходный код, файл не будет ошибочно принят за подлинный файл исходного кода C:


file правильно идентифицирует файл заголовка (".h") как часть набора файлов с исходным кодом C и знает, что makefile является скриптом.

Использование файла с двоичными файлами

Двоичные файлы больше похожи на «черный ящик», чем другие. Файлы изображений можно просматривать, звуковые файлы можно воспроизводить, а файлы документов можно открывать с помощью соответствующего программного пакета. Однако с двоичными файлами сложнее.

Например, файлы «hello» и «wd» являются исполняемыми двоичными файлами. Это программы. Файл с именем «wd.o» является объектным файлом. Когда исходный код компилируется компилятором, создается один или несколько объектных файлов. Они содержат машинный код, который компьютер в конечном итоге выполнит при запуске готовой программы, вместе с информацией для компоновщика. Компоновщик проверяет каждый объектный файл на наличие вызовов функций к библиотекам. Он связывает их с любыми библиотеками, которые использует программа. Результатом этого процесса является исполняемый файл.

Файл «watch.exe» представляет собой двоичный исполняемый файл, который был кросс-компилирован для запуска в Windows:


Возьмем сначала последнее: файл сообщает нам, что файл «watch.exe» представляет собой исполняемый файл PE32+ консольной программы для семейства процессоров x86 в Microsoft Windows. PE означает переносимый исполняемый формат, который имеет 32- и 64-разрядные версии. PE32 — это 32-разрядная версия, а PE32+ — 64-разрядная версия.

Остальные три файла идентифицируются как файлы исполняемого и связываемого формата (ELF). Это стандарт для исполняемых файлов и общих объектных файлов, таких как библиотеки. Вскоре мы рассмотрим формат заголовка ELF.

Что может привлечь ваше внимание, так это то, что два исполняемых файла («wd» и «hello») идентифицируются как общие объекты Linux Standard Base (LSB), а объектный файл «wd.o» идентифицируется как перемещаемый LSB. Отсутствие слова «исполняемый» очевидно.

Объектные файлы можно перемещать, то есть код внутри них можно загрузить в память в любом месте. Исполняемые файлы перечислены как общие объекты, поскольку они были созданы компоновщиком из объектных файлов таким образом, что они наследуют эту возможность.

Это позволяет системе рандомизации адресного пространства (ASMR) загружать исполняемые файлы в память по выбранным ею адресам. Стандартные исполняемые файлы имеют адрес загрузки, закодированный в их заголовках, который определяет, где они загружаются в память.

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

Если мы скомпилируем нашу программу с помощью компилятора gcc и укажем параметр -no-pie, мы создадим обычный исполняемый файл.

Опция -o (выходной файл) позволяет указать имя для нашего исполняемого файла:

Мы будем использовать файл в новом исполняемом файле и посмотрим, что изменилось:

Размер исполняемого файла такой же, как и раньше (17 КБ):


Двоичный файл теперь идентифицируется как стандартный исполняемый файл. Мы делаем это только в демонстрационных целях. Если вы скомпилируете приложения таким образом, вы потеряете все преимущества ASMR.

Почему исполняемый файл такой большой?

В нашем примере программа hello весит 17 КБ, поэтому ее сложно назвать большой, но все относительно. Исходный код составляет 120 байт:

Что делает двоичный файл громоздким, если все, что он делает, это выводит одну строку в окно терминала? Мы знаем, что есть заголовок ELF, но его длина составляет всего 64 байта для 64-битного двоичного файла. Очевидно, это должно быть что-то другое:


Давайте просканируем двоичный файл с помощью команды strings в качестве простого первого шага, чтобы узнать, что внутри него. Мы передадим его в less :


В двоичном файле есть много строк, помимо «Hello, Geek world!» из нашего исходного кода. Большинство из них представляют собой метки для областей внутри двоичного файла, а также имена и информацию о связывании общих объектов. К ним относятся библиотеки и функции в этих библиотеках, от которых зависит двоичный файл.

Команда ldd показывает нам общие зависимости объектов двоичного файла:


В выходных данных есть три записи, и две из них включают путь к каталогу (первая не содержит):

  • linux-vdso.so:Virtual Dynamic Shared Object (VDSO) — это механизм ядра, который позволяет двоичному файлу пользовательского пространства обращаться к набору подпрограмм пространства ядра. Это позволяет избежать накладных расходов на переключение контекста из пользовательского режима ядра. Общие объекты VDSO придерживаются формата Executable and Linkable Format (ELF), что позволяет динамически связывать их с двоичным файлом во время выполнения. VDSO выделяется динамически и использует преимущества ASMR. Возможности VDSO предоставляются стандартной библиотекой GNU C, если ядро ​​​​поддерживает схему ASMR.
  • libc.so.6: общий объект GNU C Library.
  • /lib64/ld-linux-x86-64.so.2: это динамический компоновщик, который хочет использовать двоичный файл. Динамический компоновщик опрашивает двоичный файл, чтобы узнать, какие у него есть зависимости. Он запускает эти общие объекты в память. Он подготавливает двоичный файл к запуску и позволяет находить и получать доступ к зависимостям в памяти. Затем он запускает программу.

Заголовок ELF

Мы можем проверить и расшифровать заголовок ELF с помощью утилиты readelf и параметра -h (заголовок файла):


Заголовок интерпретируется для нас.


Первому байту всех двоичных файлов ELF присваивается шестнадцатеричное значение 0x7F. Следующие три байта имеют значения 0x45, 0x4C и 0x46. Первый байт — это флаг, который идентифицирует файл как двоичный файл ELF. Чтобы сделать это кристально ясным, следующие три байта представляют собой «ELF» в ASCII:

  • Класс: указывает, является ли двоичный файл 32- или 64-разрядным исполняемым файлом (1 = 32, 2 = 64).
  • Данные: указывает порядок байтов в использовании. Кодировка Endian определяет способ хранения многобайтовых чисел. В кодировке с обратным порядком байтов число сначала хранится со старшими битами. В кодировке с обратным порядком байтов число сохраняется с первыми младшими значащими битами.
  • Версия: версия ELF (в настоящее время это 1).
  • OS/ABI: представляет тип используемого бинарного интерфейса приложения. Это определяет интерфейс между двумя двоичными модулями, такими как программа и общая библиотека.
  • Версия ABI. Версия ABI.
  • Тип: тип двоичного файла ELF. Общие значения: ET_REL для перемещаемого ресурса (например, объектного файла), ET_EXEC для исполняемого файла, скомпилированного с флагом -no-pie, и ET_DYN для исполняемого файла с поддержкой ASMR.
  • Машина: архитектура набора инструкций. Это указывает на целевую платформу, для которой был создан двоичный файл.
  • Версия: для этой версии ELF всегда установлено значение 1.
  • Адрес точки входа: адрес памяти в двоичном файле, с которого начинается выполнение.

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

Быстрый просмотр первых восьми байтов двоичного файла с помощью hexdump покажет байт подписи и строку «ELF» в первых четырех байтах файла. Параметр -C (канонический) дает нам ASCII-представление байтов вместе с их шестнадцатеричными значениями, а параметр -n (число) позволяет нам указать, сколько байтов мы хотим видеть:


objdump и детальное представление

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


Это дизассемблирует исполняемый машинный код и отображает его в шестнадцатеричных байтах вместе с эквивалентом на ассемблере. Расположение адреса первого пока в каждой строке показано в крайнем левом углу.

Это полезно, только если вы умеете читать на ассемблере или вам интересно, что происходит за кулисами. Выходных данных много, поэтому мы передали их в меньшее количество файлов .


Компиляция и связывание

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

Большинство разработчиков уже знакомы с описанными здесь командами. Однако для других они предлагают несколько простых способов порыться и посмотреть, что находится внутри бинарного черного ящика.

  • › Как использовать команду cut в Linux
  • › Что означает XD и как вы его используете?
  • ›5 шрифтов, которые следует прекратить использовать (и лучшие альтернативы)
  • › Почему не было Windows 9?
  • › Почему прозрачные чехлы для телефонов желтеют?
  • › Как установить Google Play Маркет в Windows 11
  • › Как восстановить метки панели задач в Windows 11

Двоичные файлы – это файлы, содержащие скомпилированный исходный код (или машинный код). Двоичные файлы — это файлы, содержащие скомпилированный исходный код (или машинный код). Их также называют исполняемыми файлами, поскольку их можно запускать на компьютере.

Двоичный каталог содержит следующие каталоги:

/бин

Каталог /bin содержит двоичные файлы для использования всеми пользователями. Каталог «/bin» также содержит исполняемые файлы, команды Linux, которые используются в однопользовательском режиме, и общие команды, используемые всеми пользователями, такие как cat, cp, cd, ls и т. д. Согласно FHS, /bin каталог должен содержать /bin/cat и /bin/date (среди прочего). Каталог ‘/bin’ не содержит каталогов.

Другие каталоги /bin

Вы можете найти подкаталог /bin во многих других каталогах. Пользователь по имени Эми может размещать свои программы в /home/amy/bin. Некоторые приложения, часто при установке непосредственно из исходного кода, помещают себя в /opt. Установка сервера samba может использовать /opt/samba/bin для хранения своих двоичных файлов.

/sbin

Каталог /sbin содержит двоичные файлы для настройки операционной системы. Каталог «/sbin» также содержит исполняемые файлы, но в отличие от «/bin» он содержит только системные двоичные файлы, которые требуют привилегий root для выполнения определенных задач и полезны для целей обслуживания системы. например fsck, root, init, ifconfig и т. д. Многие системные двоичные файлы требуют привилегий root для выполнения определенных задач.

/библиотека

Каталог «/lib» содержит общие библиотеки, которые часто используются каталогами «/bin» и «/sbin». Он также содержит модуль ядра. Эти имена файлов идентифицируются как ld* или lib*.so.*. Например, ld-linux.so.2 и libfuse.so.2.8.6. Ниже приведен пример частичного содержимого /lib.

$ ls /lib/libc*

/lib/libc-2.5.so /lib/libcfont.so.0.0.0 /lib/libcom_err.so.2.1

/lib/libcap.so.1 /lib/libcidn-2.5.so /lib/libconsole.so.0

/lib/libcap.so.1.10 /lib/libcidn.so.1 /lib/libconsole.so.0.0.0

/lib/libcfont.so.0 /lib/libcom_err.so.2 /lib/libcrypt-2.5.so

1) /lib/modules: «/lib/modules» хранит модули ядра и имеет каталог для каждого установленного ядра. Обычно ядро ​​Linux загружает модули ядра из /lib/modules/$kernel-version/. Модули предназначены для использования дополнительной аппаратной поддержки без создания нового ядра.

2) /lib32 и /lib64: в настоящее время мы находимся в процессе перехода между 32-разрядными и 64-разрядными системами. Во время компиляции библиотек вы столкнетесь с каталогами с именами «/lib32» и «/lib64», в которых будет указан размер используемого регистра. 64-разрядная система может быть совместима с 32-разрядным двоичным кодом.

/опт

Термин "opt" является сокращением от "необязательный". Его основная цель — хранить дополнительные пакеты прикладного программного обеспечения. Во многих случаях это программное обеспечение вне репозитория дистрибутива. Дополнительные приложения от отдельных поставщиков должны быть установлены в ‘/opt’. В некоторых системах ‘/opt’ пуст, так как у них может не быть дополнительного приложения. Большой пакет может установить все свои файлы в подкаталоги /bin, /lib, /etc внутри /opt/$packagename/. Если, например, пакет называется wp, то он устанавливается в /opt/wp, двоичные файлы помещаются в /opt/wp/bin, а справочные страницы — в /opt/wp/man.

Читайте также: